2013-03-07 78 views
3

我在Java Web應用程序(使用Oracle 11g數據庫)中使用Hibernate 4.1.9,並且似乎正在獲取一些失控連接我正在使用c3p0池。休眠4.1.9 c3p0設置和連接到數據庫的方式太多

它似乎應該在我的配置文件中用適當的屬性進行管理,但我努力讓它們正確設置。

這裏是在它的屬性設置我的persistence.xml文件:

<?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> 

,當我啓動應用程序我看到Hibernate使用的C3P0設置的信息:

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... [email protected] [ connectionPoolDataSource -> [email protected] [ 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 -> [email protected] [ 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 

遺憾的是大約每2分鐘O racle被註冊了一把(通常是12在時間)的新連接(即使沒有用戶正在訪問應用

我道歉,如果我的思念在我的設置明顯的東西 - 我已經沖刷通文檔,和網絡試圖瞭解所有的屬性,但可能會錯過某些東西或有一些設置錯誤。

請注意,我在Tomcat 6.0.14容器中使用hibernate 4.1.9.Final和Oracle 11g。

謝謝你的時間!

回答

6

C3P0正在剔除大於100秒的連接。將您的maxConnectionAge設置爲比100秒更積極的方式可以解決您的問題。

+0

這看起來就是它,謝謝! – russellelbert 2013-03-07 20:23:27

+0

@Derek如果它關閉連接,爲什麼會拋出太多的連接,它應該只是創建新的連接,或者我缺少一些東西 – Peter 2014-02-03 19:01:01

7

您已將maxConnectionAge設置爲100秒。這意味着如果連接超過100秒,它將被強制關閉,這也意味着如果您的池閒置,它將每隔100秒創建6個新連接。

文檔說:

秒,實際上是一個生活的時間。早於maxConnectionAge的連接將被銷燬並從池中清除。這與maxIdleTime不同,因爲它指的是絕對年齡。即使連接沒有太多空閒,如果超過maxConnectionAge,也會從池中清除。零意味着不強制實施最大絕對年齡。

要麼將​​maxConnectionAge設置爲0,要麼將其禁用,要麼將其設置爲更高的數字。

+1

謝謝Mark!更改爲0讓我的共享池工作方式如何我想...但是,@Derek用一分鐘的時間響應您,可能是由於您的更詳細和整個答案:) – russellelbert 2013-03-07 20:25:42