Feb 19, 2013 2:20:06 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Rest Servlet] in context with path [/minigps] threw exception
org.hibernate.TransactionException: JDBC begin transaction failed:
        at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:76)
        at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
        at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1395)
        at com.minigps.dao.IprecordDAO.isIpValidAndUpdateCount(IprecordDAO.java:233)
        at com.minigps.bll.ServiceLogAndCheck.isValid(ServiceLogAndCheck.java:48)
        at com.minigps.api.restful.service.GoogleCellResourceService.getGoogleRequest(GoogleCellResourceService.java:25)
        at sun.reflect.GeneratedMethodAccessor100.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:168)
        at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:70)
        at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:279)
        at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
        at com.sun.jersey.server.impl.uri.rules.ResourceObjectRule.accept(ResourceObjectRule.java:84)
        at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
        at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:74)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1357)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1289)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229)
        at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:497)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1600)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:679)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.Util.getInstance(Util.java:386)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
        at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1269)
        at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1261)
        at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5029)
        at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:912)
        at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:72)
        ... 39 more程序部署完了 过段时间报这个错,急死人了。c3p0hibernatemysqljdbcservlet

解决方案 »

  1.   

    出错代码:
    public Iprecord findAvaiable(String ipstr, int perdaycount) {
    Iprecord ip = null;
    Object[] dummy = null;
    // Session session = getSession();
    // Transaction trans = session.beginTransaction();
    try {
    // String queryString = String.format("from Iprecord as model where model.ip = '%s'", ipstr);
    // Query queryObject = getSession().createQuery(queryString);
    // queryObject.setLockMode("usedCount", LockMode.PESSIMISTIC_WRITE);

    String queryString = String.format("select id, ip, used_count, lastupdate_time from iprecord as model where model.ip = '%s' for update", ipstr);
    SQLQuery queryObject = getSession().createSQLQuery(queryString);
    //trans.commit();
    if(queryObject.list().size() > 0)
    {
    dummy = (Object[]) queryObject.list().get(0);
    ip = new Iprecord();
    ip.setId(Integer.valueOf(dummy[0].toString()));
    ip.setIp(dummy[1].toString());
    ip.setUsedCount(Integer.valueOf(dummy[2].toString()));
    ip.setLastupdateTime(Timestamp.valueOf(dummy[3].toString()));
    }
    } catch (RuntimeException re) {
    log.error("find by property name failed", re);
    throw re;
    }
    finally
    {
    }
    return ip;
    }

    @SuppressWarnings("deprecation")
    public static boolean isIpValidAndUpdateCount(String ipstr)
    {
    boolean result = false;
    int perdaycount = AppConfigService.getAppConfigService().mlocate_getIpPerdayCount();
    IprecordDAO dao = new IprecordDAO();
    Iprecord iprecord = null; Session session = dao.getSession();
    Transaction trans = null;
    try
    {
    trans = session.beginTransaction();
    iprecord = dao.findAvaiable(ipstr, perdaycount);

    if(iprecord != null)
    {
    Date currentDate = new Date();
    currentDate.setDate(currentDate.getDate() -1);
    if(currentDate.getTime() > iprecord.getLastupdateTime().getTime())
    {
    result = true;
    iprecord.setUsedCount(1);
    Date lastupdateTime = new Date();
    Timestamp timeStamp = new Timestamp(lastupdateTime.getTime());
    iprecord.setLastupdateTime(timeStamp);
    }
    else
    {
    if(iprecord.getUsedCount()< perdaycount)
    {
    result = true;
    iprecord.setUsedCount(iprecord.getUsedCount()+1);
    }
    }
    }
    else
    {
    //insert the ip record
    result = true;

    iprecord = new Iprecord();
    iprecord.setIp(ipstr);
    iprecord.setUsedCount(1);
    }

    if(iprecord.getId() != null)
    {
    //save
    String queryString = "update iprecord set used_count = ?, lastupdate_time = ? where id = ?"; SQLQuery queryObject = session.createSQLQuery(queryString);
    queryObject.setInteger(0,  iprecord.getUsedCount());
    queryObject.setDate(1, iprecord.getLastupdateTime());
    queryObject.setInteger(2, iprecord.getId());
    queryObject.executeUpdate();
    }
    else
    {
    String queryString = "insert ignore into iprecord(ip, used_count, lastupdate_time) values(?, ?, ?)";

    SQLQuery queryObject = session.createSQLQuery(queryString);
    queryObject.setString(0, iprecord.getIp());
    queryObject.setInteger(1,  iprecord.getUsedCount());
    queryObject.setDate(2, iprecord.getLastupdateTime());
    queryObject.executeUpdate();
    }
    trans.commit();
    }
    catch(RuntimeException re) {
    log.error("find by property name failed", re);
    if(trans != null)
    {
    trans.rollback();
    }
    throw re;
    }
    finally
    {
    session.close();
    }
    return result;
    }
      

  2.   

    c3p0配置:
    ###########################
    ### C3P0 Connection Pool###
    ###########################hibernate.c3p0.max_size 200
    hibernate.c3p0.min_size 10
    hibernate.c3p0.timeout 1800
    hibernate.c3p0.max_statements 0
    hibernate.c3p0.idle_test_period 1500
    hibernate.c3p0.acquire_increment 2
    hibernate.c3p0.automaticTestTable con_test
    hibernate.c3p0.debugUnreturnedConnectionStackTraces true
    hibernate.c3p0.unreturnedConnectionTimeout 300
    hibernate.c3p0.testConnectionOnCheckin true
    #hibernate.c3p0.testConnectionOnCheckout true
    hibernate.c3p0.maxIdleTime 1800
    hibernate.c3p0.maxConnectionAge 1600
      

  3.   

    转到java版了。
    看样子像mysql 8小时超时。但我的没运行8小时,大概1小时左右。
      

  4.   

    解决了,是有一个 session没close,一直调用并发大就挂了。