Avatar billede michartmann Nybegynder
27. april 2004 - 17:01 Der er 30 kommentarer

Too many Connections

Hej Eksperter,
Jeg har et problem med at rydde op i antallet af forbindelser der laves. Jeg bruger følgende kode:

    public Connection getConnection() throws DatabaseException {
        try {
            setConfigurationProperties();
            Class.forName(this.getDatabaseDriver());
            return DriverManager.getConnection(this.getDatabaseURL(), username, password);
        } catch (ClassNotFoundException e) {
            log.fatal("JdbcDataManager() failed to construct" + escapeQuotes(e.getMessage()));
            throw new DatabaseException("JdbcDataManager() failed to construct", e);
        } catch (SQLException e) {
            log.fatal("JdbcDataManager() failed to construct" + escapeQuotes(e.getMessage()));
            throw new DatabaseException("JdbcDataManager() failed to construct", e);
        }
    }

    public void closeConnection() {
//        if (statement != null) {
//            try {
//                statement.close();
// close the statement after you're finnished with it
//            } catch (SQLException e) {
//                log.error("SQLException when closing statement: " + escapeQuotes(e.getMessage()));
//            }
//            statement = null;
//        }
        if (connection != null) {
            try {
                connection.close(); // close the connection after you're finnished with it
            } catch (SQLException e) {
                log.error("SQLException when closing connection: " + escapeQuotes(e.getMessage()));
            }
            connection = null;
        }
    }


Selvom jeg bruger finally lader det ikke til jeg får lukket mine connections - kan det have noget at gøre med at min select funktion returnere et ResultSet ?
Jeg bruger klassen med disse funktioner som en simpel adgang til min mysql database.

HJÆLP værd sættes meget højt :0)
Avatar billede michartmann Nybegynder
27. april 2004 - 17:02 #1
Hov denne her manglede lige..........

public ResultSet executeSelect(String sql) throws DatabaseException {
        try {
            log.debug("Executing SELECT statement: " + escapeQuotes(sql));
            connection = getConnection();
            statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet res = statement.executeQuery(sql);
            return (res == null) ? null : res;
        } catch (SQLException e) {
            log.error("SQLException when executing SELECT: " + escapeQuotes(e.getMessage()));
            throw new DatabaseException("SQLException when executing SELECT and has been logged");
        } finally {
            closeConnection();
        }

    }
Avatar billede arne_v Ekspert
27. april 2004 - 17:06 #2
Jeg kan ikke helt forstå "too many connections" problemet. Der burde blive lukket.

Men man kan ikke bruge et ResultSet når connection er closed ...

(eller der er ihvertfald ikke nogen garanti for at det virker)
Avatar billede arne_v Ekspert
27. april 2004 - 17:06 #3
Hvilken database og hvilken driver tester du med ? I hvilket environment ?
Avatar billede michartmann Nybegynder
27. april 2004 - 17:13 #4
Jeg bruger mysql database (som jeg dog får hostet) med en tomcat server samt  mysql-connector-java-3.0.8-stable-bin.jar
Avatar billede michartmann Nybegynder
27. april 2004 - 17:14 #5
Er det ikke muligt at returne en kopi af et resultset som ikke har nogle "fangarme" til databasen
Avatar billede arne_v Ekspert
27. april 2004 - 17:16 #6
Normal vil man i den slags tilfælde returnere en ArrayList (eller en anden collection)
med beans (et objekt = 1 række).
Avatar billede michartmann Nybegynder
27. april 2004 - 17:23 #7
Problemet er bare at mange forskellige objekter returneres via denne
Avatar billede heine112 Nybegynder
27. april 2004 - 17:25 #8
Prøv i /etc/my.cnf at tilføje (under [mysqld]): set-variable = max_connections=1500
Avatar billede michartmann Nybegynder
27. april 2004 - 17:30 #9
vil det at sætte max connections højere ikke bare udskyde problemer?
Avatar billede heine112 Nybegynder
27. april 2004 - 17:34 #10
jo, måske. Men du opnår viden ved at se, om det hjælper at rette i antal forbindelser i mysql. Jeg har ikke nærlæst programmet, men jeg ville have en finalize, som lukker forbindelsen, når objektet dør. Dvs noget i denne stil

  protected void finalize() {
    try {
      connect.close();
    } catch(Exception e) {
    }
  }
Avatar billede arne_v Ekspert
27. april 2004 - 17:35 #11
Hvis problemet opstår fordi du tester med mere end 100 tråde der kører
parallelt så løser det problemet.

Men hvis connection ikke lukkes ordentligt så udskyder du bare problemet.

(jeg formoder iøvrigt at du tester single threaded)
Avatar billede michartmann Nybegynder
27. april 2004 - 17:45 #12
jeg tester single threaded, men det underlige er at jeg ikke løber tør for connection når jeg tester det hele lokalt på min egen maskine men kun når jeg tester på det hostede domæne??????
Det lader til fejlen først indtræffer når jeg connecter med to computere med forskellige ip'er
Avatar billede heine112 Nybegynder
27. april 2004 - 17:53 #13
Det kommer an på, hvad max_connections hos dig og hos det hostede domæne. Hvis det er 1000 hos dig og 100 det andet sted...
Avatar billede michartmann Nybegynder
27. april 2004 - 17:54 #14
det er 100 hos mig
Avatar billede arne_v Ekspert
27. april 2004 - 18:01 #15
Får du logget nogle errors ?

Hvor mange queries når du ca. at få udført inden du får fejl ?
Avatar billede arne_v Ekspert
27. april 2004 - 18:01 #16
Closer du result settet et sted i din kode ?
Avatar billede michartmann Nybegynder
27. april 2004 - 18:04 #17
nej det gør jeg ikke - jeg ville tro omkring 50 - 100 quiries bliver logget men det jeg forstår er at det virker fint på min lokale maskine med max 100 men ikke på den hostede - og det tyder på det går galt så snart en ny client logger på?
Avatar billede heine112 Nybegynder
27. april 2004 - 18:06 #18
Jeg har engang fået fejlen - databasen var på en ramdisk, og jeg havde "opbrugt" alt på disken. Det kan ikke være en lignende fejl (alt harddisk brugt)?
Avatar billede michartmann Nybegynder
27. april 2004 - 18:07 #19
det vil jeg da høre hosteren om
Avatar billede michartmann Nybegynder
27. april 2004 - 18:21 #20
jeg kan se på phpmyadmin at der er løbende nye processes der tilføjes hver gang jeg bevæger mig rundt på siden(kontakter db'en) - er det det samme som connections ikke bliver lukket?
Avatar billede michartmann Nybegynder
27. april 2004 - 18:22 #21
Jeg får nemlig fjernet fejlen hvis jeg Kill'er nogle af dem
Avatar billede arne_v Ekspert
27. april 2004 - 18:23 #22
Det lyder jo sådan !
Avatar billede arne_v Ekspert
27. april 2004 - 18:24 #23
Hov !!!!!
Avatar billede arne_v Ekspert
27. april 2004 - 18:25 #24
closeConnection kaldes da ikke med et connection argument
Avatar billede arne_v Ekspert
27. april 2004 - 18:26 #25
Er den connection der er i executeSelect og closeConnection den samme ?
Avatar billede michartmann Nybegynder
27. april 2004 - 18:28 #26
ja de arbejde på samme klasse variabel
Avatar billede arne_v Ekspert
27. april 2004 - 22:15 #27
Kan du ved at indsætte lidt flere log statements verificere at
connection.close bliver kaldt og at det er samme object som
blev åbnet ?
Avatar billede arne_v Ekspert
27. april 2004 - 22:16 #28
Når du siger klasse variabel så mener du en instans variabel (uden static) ikke ?
Avatar billede michartmann Nybegynder
27. april 2004 - 22:35 #29
sådan ser den ud
private Connection connection=null;

Jeg har tjekket omkring close() kaldet og alt ser fint ud.

                log.debug("connection: "+connection.toString());
                log.debug("================ closeConnection();");
                connection.close();
                log.debug("================ closeConnection();");

begge udtryk udskrives og toString giver også den samme værdi som når connection instantieres.
Jeg ved ikke hvad der er galt???
Avatar billede michartmann Nybegynder
28. april 2004 - 00:00 #30
hej igen
ENDELIG fandt jeg fejlen - forkert genstartet server.
Tak for hjælpen :0)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester