为了避免死锁,hibernate需要哪些C3P0设置
我将Hibernate与MySQL 5.1.30结合使用 我有以下图书馆:为了避免死锁,hibernate需要哪些C3P0设置,hibernate,c3p0,Hibernate,C3p0,我将Hibernate与MySQL 5.1.30结合使用 我有以下图书馆: c3p0-0.0.1.2.jar mysql-connector-java-5.0.3-bin.jar hibernate3.jar 我使用hibernate.cfg.xml进行配置: <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibern
- c3p0-0.0.1.2.jar
- mysql-connector-java-5.0.3-bin.jar
- hibernate3.jar
<!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">org.gjt.mm.mysql.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/fooDatatbase</property>
<property name="connection.username">foo</property>
<property name="connection.password">foo123</property>
<!-- Use the C3P0 connection pool provider -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_periods">3000</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<mapping resource="databaselayer/mail/Mail.hbm.xml"/>
<mapping resource="databaselayer/courses/Course.hbm.xml"/>
<mapping resource="databaselayer/price/Price.hbm.xml"/>
<mapping resource="databaselayer/contact/Contact.hbm.xml"/>
<mapping resource="databaselayer/artists/Musician.hbm.xml"/>
<mapping resource="databaselayer/concerts/Concert.hbm.xml"/>
<mapping resource="databaselayer/welcome/Welcome.hbm.xml"/>
<mapping resource="databaselayer/information/Information.hbm.xml"/>
</session-factory>
</hibernate-configuration>
这似乎是一些人已经犯下的错误。我尝试按照此处描述的解决方法更改了设置,以:
有人知道我做错了什么,以及如何正确设置c3p0吗?这三个应用程序共享同一个连接池,还是每个应用程序都有自己的连接池?我推荐后者。这个问题没有明确的答案,因为根据使用和负载模式,不同的应用程序会有所不同 第一点是参考链接,因为看起来你已经这样做了,并且已经开始了。这里有一些提示
- numHelperThreads:不持有争用锁的辅助线程。将这些操作分散到多个线程上
- maxStatements:c3p0的全局PreparedStatement缓存的大小
- MaxStatementSpecrConnection:为单个池连接缓存的PreparedStatements c3p0数量
- maxAdministrativeTaskTime:当任务超过设置的时间限制时,强制调用任务线程的interrupt()方法的参数
- numHelperThreads=6
- maxStatements=100
- maxStatementsPerConnection=12
- maxAdministrativeTaskTime=需要足够的时间才能在生产环境中运行繁重的查询
来自MysqlIO的
EOFException
有点可疑。在正常/无bug的情况下,您不应该从该层获得错误。实际上这可能太晚了,但问题很简单:
hibernate.c3p0.idle\u test\u periods
不得高于hibernate.c3p0.timeout
,否则将无法正确检测到数据库关闭的连接
此外,死锁检测警告看起来好像代码的某些部分没有正确地将连接返回到池(即session.close())
当应用程序空闲且MySQL关闭服务器上的连接时,会发生MysqlIO异常。现在,如果C3P0未正确检查连接是否仍然实际连接,则会出现EOFEExceptions
我希望这可能会有所帮助。休眠.c3p0.idle\u测试周期必须小于h*ibernate.c3p0.timeout*,因为第一个时间值只是休眠检查空闲连接并尝试关闭连接的时间值 同时,第二个问题是需要弹出连接的时间 如果空闲测试周期大于超时参数hibernate,则查找空值或系统中不存在的任何内容。至少我是这样理解的。
300
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.idle_test_periods">3000</property>
3000
空闲测试周期值应小于超时值。我猜每个应用程序都有自己的应用程序池,因为我有三个hibernate.cfg.xml文件,如发布在应用程序的WEB-INF/classes文件夹中的。我猜每个应用程序都有自己的应用程序池,因为我有三个hibernate.cfg.xml文件,如张贴在应用程序的WEB-INF/classes文件夹中。显然,您需要移除他的约束螺栓。它们是否都具有相同的JNDI名称?如果是这样,他们会要求Tomcat从同一个池中查找连接。每个项目都需要一个单独的JNDI名称,这样它们才能拥有一个单独的池。您应该在Tomcat管理工具中看到3个JNDI池。如果我是对的,你现在只能看到一个。你是说tomcat管理器工具吗?或者其他工具?你能解释一下你是如何解决这个问题的吗?或者至少选择最好的答案谢谢。
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.min_size">0</property>
<property name="hibernate.c3p0.max_size">48</property>
<property name="hibernate.c3p0.timeout">0</property>
<property name="hibernate.c3p0.max_statements">0</property>
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)
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.idle_test_periods">3000</property>