听起来好像数据库已关闭连接或某个网络设备已终止套接字。您可以通过多种方法来解决此问题:
- 您可以经常在连接上发出某种“保持活动”类型的查询(例如:SELECT 1)以使其保持活动状态。假设它由于空闲而关闭。
- 您可以经常重新打开连接。
- 如果您收到连接关闭异常,则可以重新打开连接。咄。
- 您可以使用一个连接池,它可以为您执行保持活动和重新连接。 Apache的DBCP是许多人的最爱。
我推荐最后一个。您将使用DBCP之类的东西:
BasicDataSource ds = new BasicDataSource();ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");ds.setUsername("scott");ds.setPassword("tiger");ds.setValidationQuery("SELECT 1"); // this is database specificds.setTestWhileIdle(true); // test the connections every so oftends.setUrl(connectURI);...while (!shutdown) { Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ... stmt.close(); // this returns the connection back to the pool instead of really closing // the connection conn.close();}因此,当需要连接以及完成连接时,您可以
Connection绕过
BasicDataSourceand调用
getConnection(),而不必绕过a
conn.close()。池执行所有验证工作,等等。它还将允许多个线程使用数据库。
希望这可以帮助。
编辑:
您也不能长时间保持hibernate会话。为了向您展示会话的寿命,我将引用文档中的内容:
会话的生命周期受逻辑事务的开始和结束的限制。(长事务可能跨越多个数据库事务。)
会话拥有一个数据库连接,因此您永远都不想保持它一段时间。您应该执行几个数据库请求(例如具有查询和更新的单个Web请求),然后关闭会话,以便可以将基础数据库连接返回到池中。



