Получить источник данных / соединение из пула соединений C3P0
Я использую библиотеку, где мне нужно получить источник данных и ввести его в него. можно ли вообще получить соединение из пула соединений? Я использую Hibernate 4 с пулом соединений C3p0.
Вот мой гибернатор.контекстно-свободная грамматика.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/sampleDB</property>
<property name="connection.username">root</property>
<property name="connection.password">mypass</property>
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.max_size">100</property>
<property name="c3p0.min_size">1</property>
<property name="c3p0.idle_test_period">30</property>
<!-- SQL dialect -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- Shows Generated SQL Queries By Hibernate -->
<property name="show_sql">false</property>
<!-- Drop and re-create The Database Schema on Start up -->
<property name="hbm2ddl.auto">update</property>
<property name="cache.provider.class">org.hibernate.cache.NoCacheProvider</property>
</session-factory>
</hibernate-configuration>
2 ответа:
Если вы используете hibernate и хотите получить доступ к пулу соединений c3p0 , который он уже использует, одним из простых подходов будет использование класса C3P0Registry для поиска источника данных, см. здесь и здесь.
Вероятно, вы обнаружите, что getPooledDataSources() возвращает набор, содержащий один элемент, и это будет источник данных, созданный hibernate. Если вы хотите, вы также можете установить config param c3p0.имя_источника_данных (гибернации.c3p0.имя_источника_данных в hibernate config) и использовать C3P0Registry.pooledDataSourcesByName (имя источника данных).
[Если вы зададите собственное имя, вероятно, стоит проверить, что hibernate не использует само свойство dataSourceName. Я не думаю, что это так, но я не проверял. Самый простой способ проверить это-посмотреть ваши журналы для дампа конфигурации пулов на init и убедиться, что в нем есть что-то вроде "dataSourceName - > z8kflt8uqkl8iymaxxkw|729f44". Если имя длинное случайное-иш Строка с каналом в ней, это экземпляр конкретного автогенерированного маркера идентификации, и вы должны чувствовать себя свободно, чтобы установить свое собственное имя. Если вы видите более разумное имя, то hibernate уже установил это свойство и может ожидать имя, которое вы видите, поэтому вы должны посмотреть это имя.]
Обратите внимание, что если вы планируете использовать соединения из источника данных напрямую, позаботьтесь о том, чтобы все соединения были правильно закрыты()ed в finally blocks. Если у вас" утечка " соединений, то есть если вы их проверяете и если вы не сможете надежно проверить их, вы в конечном итоге исчерпаете пул и заморозите свое приложение hibernate.
Удачи!
Обновление: Пример...
import java.util.Set; import javax.sql.DataSource; import com.mchange.v2.c3p0.C3P0Registry; // you probably want better Exception handling than this... private DataSource findUniqueDataSource() { Set set = C3P0Registry.getPooledDataSources(); int sz = set.size(); if ( sz == 1 ) // yay, just one DataSource return (DataSource) set.iterator().next(); else throw new RuntimeException("No unique c3p0 DataSource, found:" + sz); } // be sure you have configured a dataSourceName in your c3p0 or hibernate config private DataSource findDataSourceByName( String dataSourceName ) { return C3P0Registry.pooledDataSourceByName(dataSourceName); }
И нет, вы не должны "пропускать" соединения и ожидать, что бассейн очистится после вас. Вы можете забыть закрыть операторы и результирующие наборы, и пул позаботится о них, когда вы закроете () соединение, но пул не знает , Когда безопасно перехватить соединение у клиента, который имеет не удалось его закрыть. Некоторые приложения держат соединения открытыми в течение длительного времени (хотя это плохая практика, если вы используете пул соединений).
Вы можете заставить c3p0 очистить просочившиеся соединения через некоторое время, см. параметр конфигурации unreturnedConnectionTimeout. Но это неприятная стратегия; я рекомендую, если у вас есть утечка, использовать ее совместно с debugUnreturnedConnectionStackTraces только временно, чтобы понять, где вы просачиваетесь Соединения, а затем устранить проблему.
C3p0 предоставляет пул соединений для Hibernate, так как встроенный пул соединений Hibernate никоим образом не предназначен для производственного использования. Ему не хватает нескольких функций, найденных в любом приличном пуле соединений - Согласно документации Hibernate Community, для настройки c3p0 с Hibernate вы можете обратиться к этому или MKYong учебнику по Hibernate Community.