hibernate3使用了一段时间以后,Connection reset 无法连接数据库
APP:ORACLE 10G application Server
DB:ORACLE 10G
表示层使用STRUTS,持久化层直接使用hibernate3,没有用spring进行管理
连接使用APP server的DATASOURCE 进行连接
每次调用数据连接时,都会用HibernateSessionFactory.getCurrentSession()去取
使用后都会用,HibernateSessionFactory.closeSession()去释放连接
<?xml version= "1.0 " encoding= "utf-8 "?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN "
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd ">
<hibernate-configuration>
<session-factory>
<property name= "connection.datasource "> java:comp/env/jdbc/OracleDS </property>
<property name= "hibernate.dialect "> org.hibernate.dialect.Oracle9Dialect </property>
<property name= "hibernate.jdbc.fetch_size "> 50 </property>
<property name= "hibernate.jdbc.batch_size "> 30 </property>
<property name= "hibernate.query.factory_class "> org.hibernate.hql.classic.ClassicQueryTranslatorFactory </property>
<property name= "hibernate.show_sql "> true </property>
=========================================================================
使用了一段时间以后,页面会报错,但刷新一下又会恢复正常
再使用一段时间以后,数据连接就会断掉,刷新也无法恢复正常
只有重起APP的服务才能恢复正常
后台LOG信息报错如下
2007-07-16 13:35:15,556 ERROR [org.hibernate.util.JDBCExceptionReporter] - Io exception: Connection reset
org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2223)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
at com.dianda.database.HibernateBaseDao.find(HibernateBaseDao.java:256)
at com.dianda.product.Product.getLatestProduct(Product.java:205)
at com.dianda.servlet.action.IndexAction.setIndexDisplay(IndexAction.java:154)
at com.dianda.servlet.action.IndexAction.execute(IndexAction.java:60)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:719)
at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:376)
at com.evermind.server.http.ServletRequestDispatcher.unprivileged_forward(ServletRequestDispatcher.java:270)
at com.evermind.server.http.ServletRequestDispatcher.access$100(ServletRequestDispatcher.java:42)
at com.evermind.server.http.ServletRequestDispatcher$2.oc4jRun(ServletRequestDispatcher.java:204)
at oracle.oc4j.security.OC4JSecurity.doPrivileged(OC4JSecurity.java:283)
at com.evermind.server.http.ServletRequestDispatcher.forward(ServletRequestDispatcher.java:209)
at com.evermind.server.http.EvermindPageContext.forward(EvermindPageContext.java:322)
at _index._jspService(_index.java:49)
at com.orionserver.http.OrionHttpJspPage.service(OrionHttpJspPage.java:59)
at oracle.jsp.runtimev2.JspPageTable.service(JspPageTable.java:416)
at oracle.jsp.runtimev2.JspServlet.internalService(JspServlet.java:478)
at oracle.jsp.runtimev2.JspServlet.service(JspServlet.java:401)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at com.evermind.server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:719)
at com.evermind.server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:376)
at com.evermind.server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:870)
at com.evermind.server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:451)
at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:299)
at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java:187)
at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:303)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.sql.SQLException: Io exception: Connection reset
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:138)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:175)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:287)
at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:649)
at oracle.jdbc.driver.OracleStatement.execute_maybe_describe(OracleStatement.java:1048)
at oracle.jdbc.driver.T4CPreparedStatement.execute_maybe_describe(T4CPreparedStatement.java:535)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1126)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3001)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3043)
at oracle_jdbc_driver_T4CPreparedStatement_Proxy.executeQuery()
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)
... 38 more
==============================================================
由于是使用myeclipse的hibernate3插件直接生成的包,朋友曾经提及可能是配置文件或者包方面的错误,将原来1,636KB的hibernate3.jar换成了2,190KB的JAR包,问题还是没有解决
这个问题已经捆饶我很久了,请问各位高手有没有遇到过类似的问题,该如何解决?
谢谢!!!
[解决办法]
HibernateSessionFactory.getCurrentSession()是取当前线程的Session,使用完以后不要马上用HibernateSessionFactory.closeSession()关闭,要到本次线程不再使用这个Session时关闭。
如果不用spring管理,可以自己用ThreadLocal来管理你的Session。