Получить источник данных / соединение из пула соединений 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 2

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.