【问题标题】:java.sql.SQLException: Too many connections + Spring IBatisjava.sql.SQLException:连接太多 + Spring IBatis
【发布时间】:2016-03-01 06:56:45
【问题描述】:

我正在处理java.sql.SQLException: Too many connections 的问题。

平台: Tomcat server, Java Spring, iBatis and MySQL Amazon Instance

下面是我的JDBC配置:

app.jbdc.initialSize=10
app.jbdc.maxActive=200
app.jdbc.maxWait =1000
app.jdbc.minEvictableIdleTimeMillis =500
app.jdbc.validationQuery=select 1
app.jdbc.testOnBorrow=true
app.jdbc.removeAbandoned=true
app.jdbc.removeAbandonedTimeout=30

下面是错误堆栈:

java.sql.SQLException
MESSAGE: Too many connections
STACKTRACE:

java.sql.SQLException: Too many connections
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2851)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:753)
    at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3562)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1154)
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:1818)
    at com.mysql.jdbc.Connection.<init>(Connection.java:405)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:268)
    at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
    at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:840)
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
    at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.bull.javamelody.JdbcWrapper$3.invoke(JdbcWrapper.java:757)
    at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:281)
    at com.sun.proxy.$Proxy8.getConnection(Unknown Source)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:113)
    at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:213)
    at com.sun.proxy.$Proxy14.prepareStatement(Unknown Source)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.prepareStatement(SqlExecutor.java:494)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:76)
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteUpdate(GeneralStatement.java:200)
    at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:78)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.insert(SqlMapExecutorDelegate.java:447)
    at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.insert(SqlMapSessionImpl.java:82)
    at org.springframework.orm.ibatis.SqlMapClientTemplate$8.doInSqlMapClient(SqlMapClientTemplate.java:366)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:200)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.insert(SqlMapClientTemplate.java:364)
    at com.wo.user.dao.UserDaoImpl.insertUser(UserDaoImpl.java:26)
    at com.wo.user.service.UserServiceImpl.insertUser(UserServiceImpl.java:89)
    at com.wo.version2.controller.UserControllerV2.registerUser2(UserControllerV2.java:187)
    at sun.reflect.GeneratedMethodAccessor46.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:175)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:774)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:164)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:202)
    at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:180)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:156)
    at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:233)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
    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:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1822)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

有什么我们可以控制最大活动线程的吗?在这种情况下可以做什么?

假设:Spring iBatis 负责关闭和打开连接

任何建议或帮助将不胜感激。

【问题讨论】:

  • 您能告诉我们您使用的是什么连接池库吗?您还可以发布一个您使用 iBatis 的示例,或者只是确认您没有手动打开会话?
  • 是的,我没有使用任何第三方库进行池化。也没有手动打开会话。我只是在 Dao 实现中使用了org.springframework.orm.ibatis.support.SqlMapClientDaoSupport
  • 还有一件事:是否有另一个应用程序使用相同的数据库并耗尽您在数据库端的连接限制?
  • 我正在使用 AWS 数据库,大约有 5-6 个数据库架构,但此服务器实例仅指向一个数据库架构,并且该架构仅适用于此服务器..

标签: java mysql jdbc ibatis spring-jdbc


【解决方案1】:

更新mysql全局变量以增加连接数。

set global max_connections=2000

【讨论】:

    【解决方案2】:

    如果你像这样使用这里。 app.jbdc.maxActive=2000 app.jdbc.maxWait =100

    那么你就可以解决这个问题了。

    基本上这种类型的异常是由于驱动程序不可用而出现的。

    【讨论】:

      【解决方案3】:

      从堆栈跟踪看来,正在使用 dbcp 连接池库。

      您的应用程序是数据库的客户端,它被配置为允许最多 200 个 (maxActive) 连接。

      我的解释是数据库服务器在达到 200 个限制之前拒绝连接。

      您可以配置服务器端以允许来自您的应用程序的足够连接,或减少您的应用程序将尝试允许的连接数。

      【讨论】:

        【解决方案4】:

        尝试在创建 SQLMapClient 时通过将属性 Pool.MaxActiveConnections 设置为某个值来提供数据库属性。

          Properties props = new Properties();
          props.put("Jdbc.Host", "localhost");
          props.put("Jdbc.Port", "3106");
          props.put("Jdbc.Database", "test");
          props.put("Jdbc.Username", "root");
          props.put("Jdbc.Password", "secret");
          props.put("Pool.MaxActiveConnections", "20");
          //timetowait in millliseconds
          props.put("Pool.TimeToWait", "20000");
          //sqlMapClientReader is reader of sqlmap-config.xml
          SqlMapClient sqlMap = 
            SqlMapClientBuilder.buildSQLMapClient(sqlMapClientReader, props);
        

        或在你的 sqlmap-config.xml 中设置它

        <dataSource type="SIMPLE">
                    <property name="JDBC.Driver" value="${driver}"/>
                    <property name="JDBC.ConnectionURL" value="${url}"/>
                    <property name="JDBC.Username" value="${username}"/>
                    <property name="JDBC.Password" value="${password}"/>
                    <property name="Pool.MaximumActiveConnections" value="${activeConns}"/>
                    <property name="Pool.TimeToWait" value="${timeToWait}"/>
        </datasource>
        

        【讨论】:

          【解决方案5】:

          可能你的查询方法中没有像 conn.close() 这样关闭连接资源!

          【讨论】:

          • 我使用的是iBatis,它自动处理连接打开和关闭,我们不需要做任何事情来手动关闭连接。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-14
          • 2015-10-08
          • 2016-06-04
          • 2011-07-13
          • 2013-05-09
          • 2018-08-04
          • 2017-12-27
          相关资源
          最近更新 更多