Java 开始时异常
我在web应用程序中使用hibernate时出现异常,同时:Java 开始时异常,java,hibernate,Java,Hibernate,我在web应用程序中使用hibernate时出现异常,同时: Transaction tx=session.beginTransaction(); 它偶尔会出现异常,我在捕获异常时正在重新加载SessionFactory,然后它就可以正常运行了 当我再次重新加载SessionFactory时,它正在工作 这是我的代码片段: session = HibernateFactory.openSession(0);//Passing 0 uses the existing sessionFactor
Transaction tx=session.beginTransaction();
它偶尔会出现异常,我在捕获异常时正在重新加载SessionFactory
,然后它就可以正常运行了
当我再次重新加载SessionFactory时,它正在工作
这是我的代码片段:
session = HibernateFactory.openSession(0);//Passing 0 uses the existing sessionFactory
if(session.isConnected() && session.isOpen() && session!=null)
{
try{
tx = session.beginTransaction();
logger.info("Transaction is begin successfully--Transaction is--"+tx);
}catch(Exception e){
logger.info("Could not start the transaction--Transaction is--"+tx);
session = HibernateFactory.openSession(1);//passing 1 is creating new //--SessionFactory
tx = session.beginTransaction();//now this runs fine
logger.info("Inside catch--Obtained session--"+session+"and transaction--"+tx);
e.printStackTrace();
logger.error("e.getCause(): "+e.getCause());
logger.error("e.getClass(): "+e.getClass());
// throw new HibernateException(e.getMessage());
}
}
这是我得到的异常的堆栈跟踪
org.hibernate.exception.JDBCConnectionException: Cannot open connection
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:426)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
at com.arosys.hibernateDao.AbstractDao.startOperation(AbstractDao.java:184)
at com.arosys.hibernateDao.AbstractDao.findAll(AbstractDao.java:150)
at com.arosys.beansDao.JobHierarchyDao.findAll(JobHierarchyDao.java:20)
at org.ArosysLogin.server.GWTJobImpl.getJobHierarchy(GWTJobImpl.java:416)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
at java.lang.Thread.run(Thread.java:662)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago.
只是猜测,因为没有足够的信息(异常的类型和消息):
- 由于数据库/网络连接不牢固,连接失败
- 您是否提交您的事务?我不确定,但是如果您尝试启动一个事务两次,Hibernate可能会抱怨
ValidateConnectionOnBorrow
设置为true
SQLForValidateConnection
autoReconnect
设置为true如果您遇到任何问题,请告诉我,我很久以前就遇到过同样的问题。重新加载(我想重新创建)SessionFactory听起来很刺耳。创建一个新会话就足够了。异常跟踪将有助于“偶尔”检查出错的地方。我已经更新了我的帖子。谢谢你把我的注意力放在那里。回答:我永远不知道。我发现Hibernate事务/会话处理非常混乱,而且高度可配置。在一个Hibernate项目的开始,我写了一些测试和阅读,直到这些东西表现出我喜欢的样子。简短回答:我认为您可以这样配置它。但是我现在不知道怎么做。是的,我在我的应用程序中使用tomcat、mysql和hibernate。我已经将autoreconnect设置为true。我使用的是C3p0。你能告诉我你上面提到的属性名称是什么吗?它们是什么。hibernate.C3p0.idle\u test\u period或hibernate.C3p0.validate。请参阅@Amandepsingh,还有一件事,必须在hibernate.cfg.xml(或hibernate.properties)中设置超时,hibernate默认值:0这是连接在丢弃之前可以保持池状态但未使用的秒数。零表示空闲连接永不过期。请参阅:谢谢Puspendu,因为您提到需要设置上述任何一个属性。我已经设置了“hibernate.c3p0.idle_test_period”属性,但不幸的是,它到目前为止对我不起作用。您能建议任何更改或可能缺少的内容吗。@Amandepsingh我很抱歉,过去两天我都很忙。你介意分享一下你的配置细节吗?