当前位置:  开发笔记 > 编程语言 > 正文

休眠所需的C3P0设置是什么,以避免死锁

如何解决《休眠所需的C3P0设置是什么,以避免死锁》经验,为你挑选了2个好方法。

我将Hibernate与MySQL 5.1.30一起使用.

我有下一个库:

c3p0-0.0.1.2.jar

MySQL的连接器的Java-5.0.3-bin.jar

hibernate.jar文件

我使用hibernate.cfg.xml进行配置:




    
        
        org.gjt.mm.mysql.Driver 

        jdbc:mysql://localhost/fooDatatbase
    foo
    foo123

        
    5
    20
    300
    50
    3000       

        
        org.hibernate.dialect.MySQLDialect

        
        thread

        
        org.hibernate.cache.NoCacheProvider

        
        true

        
        
                
        
        
             
        
                                     
    

使用hibernate书籍的JAVA持久性中,解释了c3p0配置选项:

hibernate.c3p0.min_size这是C3P0始终保持就绪状态的最小JDBC连接数

hibernate.c3p0.max_size这是池中的最大连接数.如果此数字已用尽,则会在运行时抛出异常.

hibernate.c3p0.timeout指定超时期限(在本例中为300秒),之后从池中删除空闲连接).

hibernate.c3p0.max_statements最大缓存语句数.准备好语句的缓存对于Hibernate的最佳性能至关重要.

hibernate.c3p0.idle_test_periods这是自动验证连接之前的时间(以秒为单位).

我使用Java 1.5.0_09和tomcat 6.0.我在tomcat中部署了三个应用程序.他们每个人都使用hibernate,配置文件几乎等同于上面显示的(只有用户名,数据库名,密码和映射resoruces更改).

不幸的是,通过上面的设置,经过几个小时的运行后,我得到了一些令人讨厌的死锁错误,最终杀死了tomcat.

Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@2437d -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1dc5cb7 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@9cd2ef -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@4af355 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:07 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1275fcb -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
Jan 22, 2009 3:29:35 PM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run

这似乎是几个人已经犯的错误.我更改了我的设置,尝试按照此处描述的解决方法http://forum.hibernate.org/viewtopic.php?p=2386237来:

1
0
48
0
0

使用新设置,我没有死锁,但我得到:

WARNING: SQL Error: 0, SQLState: 08S01
Jan 24, 2009 5:53:37 AM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException

STACKTRACE:

java.io.EOFException
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)

有谁知道我做错了什么,以及如何正确设置c3p0?



1> Thomas Weber..:

实际上这可能为时已晚,但问题很简单: hibernate.c3p0.idle_test_periods不能高于hibernate.c3p0.timeout或者数据库关闭的连接将无法正确检测到.

此外,死锁检测警告看起来代码的某些部分未正确返回到池的连接(即session.close())

当您的应用程序空闲并且MySQL关闭服务器上的连接时,会发生MysqlIO异常.现在,如果C3P0没有正确检查连接是否仍然实际连接,则会获得EOFExceptions.

我希望这可能会有所帮助.



2> Varun Mehta..:

这个问题没有明确的答案,因为它根据使用和负载模式从应用程序变为应用程序.

第一点是参考链接https://www.hibernate.org/214.html,因为看起来你已经做到了并继续前进.这里有一些提示;

numHelperThreads:不支持竞争锁的Helper线程.在多个线程上传播这些操作

maxStatements:c3p0的全局PreparedStatement缓存的大小.

maxStatementsPerConnection:为单个池连接缓存的PreparedStatements c3p0的数量.

maxAdministrativeTaskTime:如果任务超过设定的时间限制,则强制调用任务线程的interrupt()方法的参数

前三个参数可以根据设置的值来改善或降低性能,其中第四个参数可以在设置限制后中断线程并给出运行到其他线程的更改.

近似值

numHelperThreads = 6

maxStatements = 100

maxStatementsPerConnection = 12

maxAdministrativeTaskTime =需要足够的时间才能在生产中运行繁重的查询

由于这些参数,maxStatements和maxStatementsPerConnection应该测试几个月,因为很少发布指向死锁.

同时参考这些链接也很有用;

http://www.mchange.com/projects/c3p0/index.html#configuration_properties

http://www.mchange.com/projects/c3p0/index.html#hibernate-specific

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有