servlet的Hibernate超时问题

时间:2010-10-21 01:38:18

标签: java database hibernate servlets

我有一个包含hibernate的Tomcat servlet。它正常工作正常。当servlet启动时,我初始化hibernate并创建一个会话工厂。然后,我在执行各种数据库事务时使用此会话工厂生成会话。到现在为止还挺好。我的问题出现在servlet长时间不活动之后(例如当用户回家过夜然后第二天早上尝试登录时)。突然间,我无法与数据库通信。在日志中我看到了

org.hibernate.exception.JDBCConectionException:无法执行查询。

如果我停止并重新启动Tomcat,重新初始化我的servlet并重建我的会话工厂,一切正常。它几乎就像会议工厂本身超时了?

有什么想法吗?

谢谢,

埃利奥特

1 个答案:

答案 0 :(得分:3)

  

如果我停止并重新启动Tomcat,重新初始化我的servlet并重建我的会话工厂,一切正常。它几乎就像会议工厂本身超时了?

这不是会话工厂,而是会话工厂使用的连接(例如MySQL,默认情况下,在8小时不活动后超时连接是众所周知的)。之一:

  • 使用能够验证借用连接并更新它们的连接池〜或〜
  • 增加数据库端的空闲超时

  

行。假设我使用c3P0连接池。如何在hibernate.cfg.xml文件中指定我要“验证借用时的连接”,或者它是否默认执行此操作?

Configuring Connection Testing中记录了使用C3P0时的各种选项。我的建议是使用idleConnectionTestPeriod参数:

  

最可靠的测试时间   连接正在退房。但是这个   也是最昂贵的选择   客户绩效观点。最   应用程序应该工作   可靠地结合使用   idleConnectionTestPeriod和   testConnectionsOnCheckIn。这俩   空闲测试和登记测试   异步执行,这导致   感觉更好的表现   和实际的。

     

请注意,对于许多应用程序来说,很高   表现比重要   偶尔出现数据库的风险   例外。 默认情况下   配置,c3p0没有连接   完全测试。设置相当长   idleConnectionTestPeriod,而不是   结帐时办理登机手续并办理登机手续   一切都是出色的,高性能的   方法

要使用Hibernate配置C3P0,请务必阅读the relevant instructions(并使用适当的属性和相应的文件)。