Hibernate 4.1.9 c3p0 Einstellungen, und die zu vielen verbindungen zur Datenbank
Ich bin mit Hibernate 4.1.9 in einer Java web-Anwendung (die verwendet eine Oracle 11g Datenbank) und immer scheinen einige run-away-verbindungen obwohl ich mit c3p0-pooling.
es scheint, dass diese verwaltet werden sollten meine config Datei mit den entsprechenden Eigenschaften, aber ich bin kämpfen, um Sie richtig eingerichtet.
hier ist meine persistence.xml Datei mit den Eigenschaften:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="RPRM_PERSISTENCE_UNIT" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.username" value="username"/>
<property name="hibernate.connection.password" value="********"/>
<property name="hibernate.connection.url" value="jdbc:oracle:thin:@xxxxx.xxxx.com:1771:xxxxxx"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
<property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
<property name="hibernate.connection.provider_class" value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider" /> <!-- hibernate 4.1.9 -->
<property name="hibernate.c3p0.acquireIncrement" value="3"/>
<property name="hibernate.c3p0.maxIdleTime" value="3600"/>
<property name="hibernate.c3p0.minPoolSize" value="6"/>
<property name="hibernate.c3p0.maxPoolSize" value="20"/>
<property name="hibernate.c3p0.maxStatements" value="20"/>
<property name="hibernate.c3p0.idleConnectionTestPeriod" value="1800"/> <!-- seconds -->
<property name="hibernate.c3p0.maxConnectionAge" value="100"/>
<property name="hibernate.c3p0.maxIdleTimeExcessConnections" value="300"/>
<property name="hibernate.c3p0.testConnectionOnCheckin" value="true"/>
<property name="hibernate.c3p0.preferredTestQuery" value="select 1 from dual"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.format_sql" value="false" />
</properties>
und wenn ich starte die app, sehe ich Informationen, dass Hibernate nutzt die c3p0 Einstellungen:
Mar 7, 2013 11:15:21 AM com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.1 [built 16-January-2007 14:46:42; debug? true; trace: 10]
Mar 7, 2013 11:15:21 AM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@330d4ac9 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@87961d4a [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 30huhj8tjhzyr1ovdu4t|6196fc, idleConnectionTestPeriod -> 1800, initialPoolSize -> 3, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 100, maxIdleTime -> 3600, maxIdleTimeExcessConnections -> 300, maxPoolSize -> 20, maxStatements -> 20, maxStatementsPerConnection -> 0, minPoolSize -> 6, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@8d40ef6e [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 30huhj8tjhzyr1ovdu4t|1e9c3f, jdbcUrl -> jdbc:oracle:thin:@xxxxx.xxxxx.com:1771:xxxxx, properties -> {user=******, password=******, autocommit=true, release_mode=auto} ], preferredTestQuery -> select 1 from dual, propertyCycle -> 0, testConnectionOnCheckin -> true, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 30huhj8tjhzyr1ovdu4t|fa0094, numHelperThreads -> 3 ]
Mar 7, 2013 11:15:24 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
Mar 7, 2013 11:15:24 AM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
Mar 7, 2013 11:15:24 AM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory
leider ca. alle 2 Minuten von Oracle ist die Registrierung einer Handvoll (meist 12) von neuen verbindungen (sogar, wenn keine Benutzer auf die Anwendung zugreifen)
Ich entschuldige mich, wenn ich bin fehlt etwas, das offensichtlich in meinen Einstellungen habe ich durchforstet-thru-Dokumentation und das web, die versuchen zu verstehen, all die Eigenschaften, kann aber etwas fehlt oder etwas falsch eingestellt habe.
Hinweis, ich bin mit hibernate 4.1.9.Abschluss-und Oracle 11g-in einem Tomcat 6.0.14-container.
vielen Dank für Ihre Zeit!
InformationsquelleAutor russellelbert | 2013-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
C3P0 ist das culling-verbindungen, die älter als 100 Sekunden. Einstellung Ihrer
maxConnectionAge
etwas weniger aggressiv als 100 Sekunden sollte sich eine Lösung für Ihr Problem.wenn es schließt die verbindungen , warum muss es werfen zu viele verbindungen , es sollten nur neue verbindungen erstellen oder bin ich etwas fehlt
InformationsquelleAutor Derek
Den Sie gesetzt haben,
maxConnectionAge
bis 100 Sekunden. Dies bedeutet, dass, wenn eine Verbindung ist, die älter als 100 Sekunden wird es gewaltsam geschlossen, das bedeutet auch, dass, wenn Ihr pool im Leerlauf ist, wird es 6 neue verbindungen alle 100 Sekunden.In der Dokumentation sagt:
Entweder
maxConnectionAge
auf 0 zu deaktivieren, oder legen Sie es auf eine viel höhere Zahl.InformationsquelleAutor Mark Rotteveel