[JAVA] Tomcat 5.0.28 - DataSource - Connecties sluiten niet?

Pagina: 1
Acties:

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 21:19
Voor een web applicatie gebruik ik een DataSource van Tomcat om informatie uit een database te halen.
Deze Datasource gebruik ik voor een Hibernate sessie en om eigen SQL statements mee uit te voeren.

Ondanks dat ik alles close (Statement, ResultSet, Connection) blijven op MySQL 4.1 alle database connecties gewoon open staan.
Ik heb al gezocht via Google maar kan niks vinden.

Dit is mijn datasource config voor Tomcat:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="search-engine" path="/search-engine" workDir="work\Catalina\localhost\search-engine">
  <Resource name="jdbc/search-engine" type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/search-engine">
    <parameter>
      <name>validationQuery</name>
      <value>select * from sometable</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>5000</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>20</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>mypass</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://localhost:3306/search_db</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>2</value>
    </parameter>
    <parameter>
      <name>username</name>
      <value>root</value>
    </parameter>
    <parameter>
      <name>removeAbandoned</name>
      <value>true</value>
    </parameter>
    <parameter>
     <name>removeAbandonedTimeout</name>
     <value>120</value>
    </parameter>
    <parameter>
      <name>logAbandoned</name>
      <value>true</value>
    </parameter>  
  </ResourceParams>
</Context>


Deze config werkt wel, ik kan een DS object maken en een DB connectie krijgen.
Maar van het maximum aantal connections dat hier geconfigureerd is trekt Tomcat zich niks aan.

De constructor van mijn class ziet er zo uit:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ProductGroupFunctions {

    private static Log log;
    private Long taxonomySN;
    private Connection con = null;

    public ProductGroupFunctions() {
        log.debug("Open DB Connection via DataSource");
        try {
            Context ctx = new InitialContext();
            DataSource ds =  (DataSource)ctx.lookup("java:comp/env/jdbc/search-engine");
            this.con = ds.getConnection();
        } catch(javax.naming.NamingException ex) {
            log.error("Could not get the DataSource from the Context");
        } catch(java.sql.SQLException ex) {
            log.error("Could not get a database connection or create a statement from the datasource!");
            log.error( ex.getMessage() );
        }
    }


Dit werkt ook zonder problemen.
Van deze class maak ik in mijn Action class een nieuwe object.
Vervolgens roep ik in die class een method aan.
Aan het einde van deze method staat deze code:

Java:
1
2
3
4
5
6
7
8
9
10
try {
    log.debug("Close DB Connection.");
    stmt.close();
    rs.close();
    this.con.close();
    this.con = null;
} catch(java.sql.SQLException ex) {
    log.error("Error while trying to close the resultset and the database connection!");
    log.error( ex.getMessage() );
}


Deze code zou de database connectie toch voldoende moeten sluiten?

Een andere class maakt een Hibernate sessie voor me.
Die ik via een get methode ophaal en gebruik in mijn Action class.
Hierna sluit ik die sessie met deze code.

Java:
1
session.close();


Dit zou de database connectie voor die sessie toch ook moeten sluiten?
session.connection().close();
heb ik ook al geprobeerd maar dat werkt ook niet.

Mijn database connecties blijven dus openstaan wat na 100 connecties een foutmelding geeft omdat de datasource geen vrije verbindingen meer weggeeft.

Als iemand opmerkingen, ideeen, whatever heeft, graag.

PS: ik weet dat je via de configuratie van Hibernate een SessionFactory kunt configureren die je middels een setter in je eigen class kunt laten instantieren.
Maar het is nu even niet anders en ik vindt het vreemd dat die db verbindingen open blijven ondanks mijn duidelijke close statements die ook worden uitgevoerd want ik heb er nogal wat logging tegenaan gegooid.

[ Voor 26% gewijzigd door rvrbtcpt op 02-11-2005 14:18 ]


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Zou je die con.close() niet in je finally block plaatsen, aangezien deze toch ALTIJD gesloten dient te worden? Verder worden de abandoned connecties sowieso om de 2min afgesloten, aangezien je deze property op true plaats. Kan je dan na 2min terug gewoon verder werken?

  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 21:19
-FoX- schreef op woensdag 02 november 2005 @ 14:30:
Zou je die con.close() niet in je finally block plaatsen, aangezien deze toch ALTIJD gesloten dient te worden? Verder worden de abandoned connecties sowieso om de 2min afgesloten, aangezien je deze property op true plaats. Kan je dan na 2min terug gewoon verder werken?
Mijn con.close() kan ik inderdaad verplaatsen, dat is een goed idee.

Ik heb nog geen 2 min gewacht.
Heb de instelling nu op 10 gezet, even kijken wat er dan gebeurd.

Ik heb namelijk het idee dat Tomcat die configuratie verder negeert aangezien het maximum aantal connecties op 20 staat maar daar wordt gewoon overheen gegaan.
Of heeft die 20 een iets andere betekenis? (concurrent connections?)

Ik laat nog even weten of abandoned connecties toch weer te gebruiken zijn.

edit:
Schijnbaar werkt die functionaliteit niet.
Wanneer ik in MySQL Administrator onder 'Server connections' kijk dan blijven ze allemaal openstaan. Onder de kolom 'command' in die kolom staat dan sleep met daarachter een kolom met de tijd.
Voer ik een nieuwe query uit dan krijg ik gewoon weer een nieuwe DB connectie.

[ Voor 16% gewijzigd door rvrbtcpt op 02-11-2005 14:41 ]


  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Ik ken de gebruikte connection pool niet, maar je mag verwachten dat je van een connectionpool geen 'pure' MYSQL connection-objecten krijgt, maar proxy-objecten naar een MySQL (of whatever database) connection.
Wanneer jij op je verkregen connection-object de close() methode aanroept, sluit de proxy waarschijnlijk niet de onderliggende connectie, maar wordt jouw close() opgevat als het teruggeven van de onderliggende echte connectie aan de pool.
Binnen die pool blijft de connectie natuurlijk gewoon open; het zou niet echt efficient zijn wanneer jij de connectie echt zou kunnen sluiten, aangezien de pool er dan niets meer aan heeft.

[ Voor 3% gewijzigd door kasper_vk op 02-11-2005 16:14 ]

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


  • rvrbtcpt
  • Registratie: November 2000
  • Laatst online: 21:19
Dat is de connectionpool die standaard in Tomcat aanwezig is.

Nadeel is dat die connectionpool manager niet ervoor zorgt dat na het behalen van het maximum aantal connecties de gemaakte connecties gebruikt.

100 is het maximum, 101 geeft een foutmelding

  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Tomcat gebruikt standaard de DBCP connection pool. Ik heb er echter nog geen problemen mee gehad. Weet je zeker dat het niet aan je MySQL driver ligt? Probeer eens even de nightly build van je JDBC driver

  • MisterData
  • Registratie: September 2001
  • Laatst online: 09-04 12:07
Met DBCP kun je ergens instellen dat ie ongebruikte verbindingen na x seconden sluit. Met weer een andere optie kun je Tomcat meteen de stacktrace laten uitpoepen met het laatste gebruik van die verbinding. Érg handig! :)

En die gebruik je dus al :Z

[ Voor 9% gewijzigd door MisterData op 02-11-2005 22:01 ]

Pagina: 1