Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从C3P0连接池获取数据源/连接_Java_Hibernate_Datasource_Connection Pooling_C3p0 - Fatal编程技术网

Java 从C3P0连接池获取数据源/连接

Java 从C3P0连接池获取数据源/连接,java,hibernate,datasource,connection-pooling,c3p0,Java,Hibernate,Datasource,Connection Pooling,C3p0,我正在使用一个库,在那里我需要获取一个数据源并将其输入其中。我是否可以从连接池中获取连接?我正在使用带有C3p0连接池的Hibernate4 这是我的hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "

我正在使用一个库,在那里我需要获取一个数据源并将其输入其中。我是否可以从连接池中获取连接?我正在使用带有C3p0连接池的Hibernate4

这是我的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>

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/sampleDB
根
我的通行证
org.hibernate.connection.C3P0ConnectionProvider
100
1.
30
org.hibernate.dialogue.mysqldialogue
假的
更新
org.hibernate.cache.NoCacheProvider

c3p0为Hibernate提供了连接池,因为内置的Hibernate连接池绝不会用于生产。它缺少在任何像样的连接池上都可以找到的几个功能-根据,有关使用Hibernate配置c3p0的信息,您可以参考或学习Hibernate社区。

如果您正在使用Hibernate,并且希望访问它已经在使用的c3p0连接池,一种简单的方法是使用C3P0Registry类查找数据源,请参阅和

您可能会发现getPooledDataSources()返回一个包含单个元素的集合,这将是hibernate构建的数据源。如果需要,还可以设置配置参数c3p0.dataSourceName(hibernate配置中的hibernate.c3p0.dataSourceName),并使用C3P0Registry.PooledDataSourceName(dataSourceName)

[如果您要设置自己的名称,那么可能需要验证hibernate是否未使用dataSourceName属性本身。我认为没有,但我还没有检查。检查最简单的方法是查看您在init上的池配置转储日志,并确保“数据源名称->Z8KFLT8UQKL8IYMAXKW | 729f44“在其中。如果名称是一个带有管道的长随机ish字符串,则它是一个实例特定的自动生成标识,您可以随意设置自己的名称。如果您看到一个更合理的名称,则hibernate已经设置了此属性,并且可能需要您看到的名称,因此您应该查找该名称。]

请注意,如果您计划直接使用来自数据源的连接,请注意确保所有连接在finally块中正确关闭()。如果你“泄漏”了连接,也就是说,如果你将它们签出,但无法可靠地将它们签回,你最终会耗尽池中的资源并冻结你的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在一段时间后清除泄漏的连接,请参阅配置参数。但这是一个讨厌的策略;如果存在泄漏,我建议您暂时使用此功能,以了解泄漏连接的位置,然后修复问题。

我已经使用第一个链接配置了my C3P0连接池,是否仍可以从连接池获取连接/数据源?因为我需要它并将它传递到我的代码中的某个地方。你能提供一个例子说明如何做到这一点吗?此外,如果我“泄漏”连接,我认为它会自动关闭?谢谢,尽管我目前正在使用此设置c3p0连接,但我可以在哪里设置dataSourceName?还有,FindUniquedDataSource的用途是什么?为什么我可以直接使用findDataSourceByName?我不是肯定的,但是appDataSource可能会在那里设置dataSourceName参数。如果没有设置dataSourceName,您会使用FindUniquedDataSource,因为您无法预测自动生成的名称。感谢您提供的信息,如果愿意/help/added info,我更新了我的问题以包括我的hibernate.cfg.xmlBtw,我如何关闭数据源或将数据源返回池?