2013-05-01 3 views
2

Я использую библиотеку, где мне нужно получить источник данных и передать его в него. В любом случае, я могу получить соединение из пула соединений? Я использую Hibernate 4 с пулом соединений C3p0.Получить источник данных/соединение из пула соединений C3P0

вот мой hibernate.cfg.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> 

ответ

3

Если вы используете спящий режим и хотите получить доступ к пулу соединений c3p0, который он уже использует, одним простым подходом было бы использовать класс C3P0Registry для поиска DataSource, см. here и here.

Возможно, вы обнаружите, что getPooledDataSources() возвращает набор, содержащий один элемент, и это будет построено спящий режим DataSource. Если вы хотите, вы также можете установить конфигурационный параметр c3p0.dataSourceName (hibernate.c3p0.dataSourceName в конфигурации hibernate) и использовать C3P0Registry.pooledDataSourcesByName (dataSourceName).

[Если вы укажете свое имя, вероятно, стоит проверить, что hibernate не использует свойство dataSourceName. Я не думаю, что это так, но я не проверял. Самый простой способ проверить - посмотреть на свои журналы для пула config dump на init и убедиться, что в нем есть что-то вроде «dataSourceName -> z8kflt8uqkl8iymaxxkw | 729f44». Если имя представляет собой длинную случайную строку с трубкой в ​​ней, это специфический для экземпляра автогенерированный токен, и вы можете свободно устанавливать свое собственное имя. Если вы видите более разумное имя, то hibernate уже установил это свойство и может ожидать имя, которое вы видите, поэтому вы должны найти это имя.]

Обратите внимание, что если вы планируете напрямую использовать Connections из DataSource, позаботьтесь о том, чтобы все соединения были правильно закрыты() в блоках finally. Если вы «просочитесь» на соединения, т. Е. Если вы проверите их и не сможете проверить их надежно, вы в конечном итоге исчерпаете пул и заморозите ваше спящий режим.

Удачи вам!

Update: Пример ...

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); } 

И нет, вы не должны «утечка» Соединение и ожидает, что бассейн убирать за вами. Вы можете забыть закрыть Statement и ResultSets, и пул позаботится о них, когда вы закроете() Connection, но пул не знает , когда безопасно вырвать соединение с клиента, который не смог закрыть Это. В некоторых приложениях соединения открыты долгое время (хотя это плохая практика, если вы используете пул соединений).

Вы можете force c3p0 для очистки просочившихся соединений после определенного периода времени, см. Параметр конфигурации unreturnedConnectionTimeout. Но это нехорошая стратегия; Я рекомендую, если у вас есть утечка, чтобы использовать это совместно с debugUnreturnedConnectionStackTraces только временно, чтобы понять, где вы протекаете соединения, а затем устраните проблему.

+0

Можете ли вы привести пример о том, как это сделать? также, если я «утечка» соединения, я думал, что он автоматически закроется? – user962206

+0

См. Обновление выше. –

+0

Спасибо, хотя я в настоящее время использую это для настройки моего подключения c3p0, https://community.jboss.org/wiki/HowToConfigureTheC3P0ConnectionPool, где я могу установить имя dataSourceName? также, каково использование вашего findUniqueDataSource? почему я могу просто использовать findDataSourceByName? – user962206

0

c3p0 обеспечивает пул соединений для Hibernate, а Встроенный Hibernate пула соединений в коей мере не предназначены для использования в производстве. Он не имеет нескольких функций, найденных на любом приличном пуле подключений.. Согласно Hibernate Community Documentation, для конфигурации c3p0 с Hibernate вы можете обратиться к this или MKYong учебным пособиям по Hibernate Community.

+0

Я уже настроил мой пул соединений C3P0, используя первую ссылку, есть ли в любом случае я могу получить соединение/DataSource из пула соединений?так как мне это понадобится и передать его где-нибудь в моем коде. – user962206

Смежные вопросы