2013-03-07 4 views
3

Я использую Hibernate 4.1.9 в веб-приложении Java (который использует базу данных Oracle 11g) и, похоже, получает некоторые отлаженные соединения, хотя Я использую объединение c3p0.Настройки Hibernate 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 в то время) новых соединения (даже при отсутствии пользователей доступа к приложению)

Я прошу прощения, если я что-то отсутствую очевидное в моих условиях - я рыскал через документацию, и сеть пытается понять все свойства, но может что-то упустить или что-то не так.

примечание, я использую hibernate 4.1.9.Final и Oracle 11g в контейнере Tomcat 6.0.14.

благодарю вас за внимание!

ответ

6

C3P0 отбирает соединения, которые старше 100 секунд. Установка вашего maxConnectionAge на что-то менее агрессивное, чем 100 секунд, должно решить вашу проблему.

+0

это, кажется, именно это, спасибо! – russellelbert

+0

@Derek, если он закрывает соединения, почему он слишком много подключений, он должен просто создавать новые подключения или мне что-то не хватает – Peter

7

Вы установили maxConnectionAge на 100 секунд. Это означает, что если соединение старше 100 секунд, оно будет принудительно закрыто, это также означает, что если ваш пул простаивает, он будет создавать 6 новых подключений каждые 100 секунд.

В документации сказано:

секунды, эффективно время жить. Соединение старше maxConnectionAge будет уничтожено и очищено от пула. Это отличается от maxIdleTime тем, что оно относится к абсолютному возрасту. Даже соединение, которое не сильно простаивало, будет очищено от пула, если оно превышает maxConnectionAge. Zero означает, что максимальный абсолютный возраст не применяется.

Либо установите maxConnectionAge на 0, чтобы отключить его, либо установить его на гораздо большее число.

+1

спасибо Mark! изменив на 0, мой пул работал так, как я хотел ... однако, @Derek избил вас с ответом на минуту, вероятно, из-за вашего гораздо более подробного и полного ответа :) – russellelbert