Hibernate 4.1.9 настройки c3p0 и слишком много подключений к базе данных
Я использую Hibernate 4.1.9 в веб-приложении Java (которое использует базу данных Oracle 11g) и, похоже, получаю некоторые удаленные соединения, хотя я использую пул c3p0.
Кажется, что это должно управляться в моем конфигурационном файле с соответствующими свойствами, но я изо всех сил пытаюсь настроить их правильно.
Вот моя настойчивость.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... 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
К сожалению, примерно каждые 2 минуты Oracle регистрирует несколько (обычно 12 за один раз) новых соединений (, даже если пользователи не обращаются к приложению )
Приношу свои извинения, если я упустил что - то очевидное в своих настройках-я прочесал всю документацию и веб, пытаясь понять все свойства, но, возможно, что-то упустил или что-то неправильно установил.
Примечание, я использую hibernate 4.1.9.Final, и Oracle 11g в контейнере Tomcat 6.0.14.
Спасибо, что уделили мне время!
2 ответов:
C3P0-это отбраковка соединений, которые старше 100 секунд. Установка вашего
maxConnectionAgeна что-то менее агрессивное, чем 100 секунд, должна решить вашу проблему.
Вы установили
maxConnectionAgeдо 100 секунд. Это означает, что если соединение старше 100 секунд, оно будет принудительно закрыто, а если пул простаивает, он будет создавать 6 новых соединений каждые 100 секунд.В документации говорится:
Секунды, фактически время, чтобы жить. Соединение старше
maxConnectionAgeбудет уничтожено и удалено из пула. Это отличается отmaxIdleTimeтем, что оно относится к абсолютному возрасту. Даже связь, которой не было большая часть холостого хода будет удалена из бассейна, если она превыситmaxConnectionAge. Ноль означает, что максимальный абсолютный возраст не соблюдается.Либо установите
maxConnectionAgeв 0, чтобы отключить это, либо установите его на гораздо большее число.
Comments