我有一个包含hibernate的Tomcat servlet。它正常工作正常。当servlet启动时,我初始化hibernate并创建一个会话工厂。然后,我在执行各种数据库事务时使用此会话工厂生成会话。到现在为止还挺好。我的问题出现在servlet长时间不活动之后(例如当用户回家过夜然后第二天早上尝试登录时)。突然间,我无法与数据库通信。在日志中我看到了
org.hibernate.exception.JDBCConectionException:无法执行查询。
如果我停止并重新启动Tomcat,重新初始化我的servlet并重建我的会话工厂,一切正常。它几乎就像会议工厂本身超时了?
有什么想法吗?
谢谢,
埃利奥特
答案 0 :(得分:3)
如果我停止并重新启动Tomcat,重新初始化我的servlet并重建我的会话工厂,一切正常。它几乎就像会议工厂本身超时了?
这不是会话工厂,而是会话工厂使用的连接(例如MySQL,默认情况下,在8小时不活动后超时连接是众所周知的)。之一:
行。假设我使用c3P0连接池。如何在hibernate.cfg.xml文件中指定我要“验证借用时的连接”,或者它是否默认执行此操作?
Configuring Connection Testing中记录了使用C3P0时的各种选项。我的建议是使用idleConnectionTestPeriod
参数:
最可靠的测试时间 连接正在退房。但是这个 也是最昂贵的选择 客户绩效观点。最 应用程序应该工作 可靠地结合使用
idleConnectionTestPeriod
和testConnectionsOnCheckIn
。这俩 空闲测试和登记测试 异步执行,这导致 感觉更好的表现 和实际的。请注意,对于许多应用程序来说,很高 表现比重要 偶尔出现数据库的风险 例外。 默认情况下 配置,c3p0没有连接 完全测试。设置相当长
idleConnectionTestPeriod
,而不是 结帐时办理登机手续并办理登机手续 一切都是出色的,高性能的 方法强>
要使用Hibernate配置C3P0,请务必阅读the relevant instructions(并使用适当的属性和相应的文件)。