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:
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:
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:
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.
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.
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 ]