hibernate c3p0 ThreadPoolExecutor连接池,我做得对吗?

时间:2012-03-01 15:05:11

标签: java multithreading hibernate connection-pooling c3p0

我正在使用hibernate和c3p0作为数据库,我有一个带有ThreadPoolExecutor的java应用程序。 我正在做的是,我正在征服每个与hibernate相关的不同任务,使用Transactions和getCurrentSession来使用Hibernate存储数据。 所以我有

new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.MINUTES,taskQueue);

Runnable
{
 @Override
 public void run() {
    Session session = HibernateDAO.getInstance().getCurrentSession();
    Transaction tx = null;  
    try
{tx = session.beginTransaction(); .....
}     

和hibernate.cfg     线             org.hibernate.connection.C3P0ConnectionProvider             1

        <!-- Database c3p0 settings -->
        <property name="hibernate.c3p0.min_size">3</property>
        <property name="hibernate.c3p0.max_size">3</property>
        <property name="hibernate.c3p0.initialPoolSize">3</property>
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.timeout">5000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>

我的目标是从执行程序获取每个线程,使用getCurrentSession获取连接,并执行session.saveOrUpdate(item), 现在我有几个问题。 我应该使用哪种隔离级别,因为我有95%的写入/更新和5%的读取,并且读取不会被写入中断。 我从log4j

进入HTML日志
905     pool-1-thread-1     DEBUG   com.mchange.v2.resourcepool.BasicResourcePool   trace com.mchange.v2.resourcepool.BasicResourcePool@434cb775 [managed: 3, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@697506e6)
905     pool-1-thread-5     DEBUG   com.mchange.v2.resourcepool.BasicResourcePool   trace com.mchange.v2.resourcepool.BasicResourcePool@434cb775 [managed: 3, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@697506e6)
965     pool-1-thread-4     DEBUG   com.mchange.v2.resourcepool.BasicResourcePool   trace com.mchange.v2.resourcepool.BasicResourcePool@434cb775 [managed: 3, unused: 0, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@697506e6)

这是否意味着我在c3p0中只有一个连接,或者一个池中有多个连接?

AM我应该使用它,因为它应该被使用????

什么级别的隔离最适合并发写入?

提前感谢所有人,如果有人需要更多的数据和解释只是戳。

- 编辑:回答

根据答案的建议,我已经检查了mysql服务器管理员,并且还有更多的连接用于查询..所以这是使用它的正确方法:D ... 至于隔离级别,我试着让

1 个答案:

答案 0 :(得分:1)

这意味着您有一个包含3个初始连接的池。您应该能够确认这一点,看看您的SQL服务器监视器。

请记住,您的SQL服务器配置胜过C3PO,因此如果您有多个线程在同一个表上竞争事务,您可能会发现您的写入/更新操作被阻止,无论您的池配置如何。

您可能会发现在单个事务中批量插入/更新可能会比将它们移动到单独的线程提供更好的性能提升。 This article一个有趣的读物。

至于指定隔离级别,我的理解是这更像是读取性能而不是写入的问题。我从未发现自己处于需要READ COMMITTED以下的任何情况,因为允许使用READ UNCOMMITTED的脏读取完全抹杀了首先使用ACID数据库的优势。但是,我不是这个领域的专家,其他人可能会有不同的意见。如果您真的关心这一点,我会根据您选择的数据库对这两个设置进行基准测试,以确定可以获得多少性能。