Java 开始时异常

Java 开始时异常,java,hibernate,Java,Hibernate,我在web应用程序中使用hibernate时出现异常,同时: Transaction tx=session.beginTransaction(); 它偶尔会出现异常,我在捕获异常时正在重新加载SessionFactory,然后它就可以正常运行了 当我再次重新加载SessionFactory时,它正在工作 这是我的代码片段: session = HibernateFactory.openSession(0);//Passing 0 uses the existing sessionFactor

我在web应用程序中使用hibernate时出现异常,同时:

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可能会抱怨

基于调用堆栈进行更新

这似乎是数据库的问题。查看谷歌搜索“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure”的各种结果

这个可能会有帮助:

您确定使用后您的连接会关闭吗?我可以想象,在打开这么多连接后,数据库拒绝访问。检查数据库的日志也会有所帮助

  • ValidateConnectionOnBorrow
    设置为
    true
  • 并为
    SQLForValidateConnection
  • 将jdbc URL的
    autoReconnect
    设置为true
  • 通过服务器连接池配置或连接池配置

    我假设(从堆栈跟踪)您正在使用MySQL、Hibernate和JBoss或Tomcat


    如果您遇到任何问题,请告诉我,我很久以前就遇到过同样的问题。

    重新加载(我想重新创建)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我很抱歉,过去两天我都很忙。你介意分享一下你的配置细节吗?