gpt4 book ai didi

java - 从 C3P0 连接池获取 DataSource/Connection

转载 作者:行者123 更新时间:2023-12-04 04:59:30 28 4
gpt4 key购买 nike

我正在使用一个库,我需要在其中获取数据源并将其输入其中。无论如何我可以从连接池获得连接吗?我正在使用带有 C3p0 连接池的 Hibernate 4。

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

最佳答案

如果您正在使用 hibernate 并且您想要访问它已经在使用的 c3p0 连接池,一种简单的方法是使用 C3P0Registry 类来查找数据源,请参见 herehere .

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

[如果您要设置自己的名称,可能值得验证 hibernate 是否未使用 dataSourceName 属性本身。我不认为它确实如此,但我没有检查过。最简单的检查方法是查看 init 上池配置转储的日志,并确保其中有类似“dataSourceName -> z8kflt8uqkl8iymaxxkw|729f44”的内容。如果名称是一个带有管道的长随机字符串,则它是一个特定于实例的自动生成的身份 token ,您应该随意设置自己的名称。如果你看到一个更合理的名字,那么 hibernate 已经设置了这个属性并且可能期待你看到的名字,所以你应该查找那个名字。]

请注意,如果您打算直接使用数据源中的连接,请注意确保所有连接都在 finally block 中正确关闭()。如果您“泄漏”连接,即如果您 check out 它们但未能可靠地检回它们,您最终会耗尽连接池并卡住您的 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); }

不,你不应该“泄漏”连接并期望池在你之后清理。您可能会忘记关闭 Statements 和 ResultSet,当您关闭 Connection 时池会处理它们,但池不知道什么时候可以安全地从客户端抢回 Connection未能关闭它。有些应用程序会长时间保持连接打开(尽管如果您使用的是连接池,那是不好的做法)。

您可以强制 c3p0 在一段时间后清理泄漏的连接,请参阅配置参数 unreturnedConnectionTimeout .但这是一个棘手的策略;如果你有泄漏,我建议将它与 debugUnreturnedConnectionStackTraces 一起使用。只是暂时的,了解您在哪里泄漏连接,然后解决问题。

关于java - 从 C3P0 连接池获取 DataSource/Connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16316427/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com