加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:32:00 所属栏目:Java 来源:网络整理
导读:我正在使用hibernate和c3p0作为数据库,我有一个带有ThreadPoolExecutor的 java应用程序. 我正在做的是,我正在征服每个与hibernate相关的不同任务,使用Transactions和getCurrentSession来使用Hibernate存储数据. 所以我有 new ThreadPoolExecutor(CORE_POOL_S
我正在使用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,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,excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@697506e6)

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

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

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

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

–EDIT:回答

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

解决方法

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读