2014-10-30 348 views
3

我在我的web應用程序中使用了MySQL數據庫連接池的Tomcat JDBC池。 JDBC池在應用程序的context.xml中聲明爲資源(而不是全局級別)。我正在Eclipse IDE中開發這個Web應用程序。所以,無論何時我修改代碼,eclipse都會使Tomcat服務器重新加載上下文。Tomcat JDBC池:連接太多

但問題是,當上下文重新加載時,tomcat使用新連接創建JDBC池而不釋放舊池。經過幾次更改代碼之後,tomcat最終耗盡了MySQL服務器的最大連接限制,並且tomcat在上下文重新加載時開始顯示「連接太多」錯誤。

我context.xml文件是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Resource 
     name="jdbc/myDB" 
     auth="Container" 
     type="javax.sql.DataSource" 
     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     username="root" 
     password="admin" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/myDB?allowMultiQueries=true" 
     defaultAutoCommit="false" 
     initialSize="20" 
     maxActive="50" 
     maxIdle="30" 
     minIdle="15" 
     maxWait="5000" 
     testOnBorrow="true" 
     testWhileIdle="true" 
     validationQuery="SELECT 1" 
     timeBetweenEvictionRunsMillis="35000" 
     minEvictableIdleTimeMillis="55000" 
     removeAbandoned="true" 
     removeAbandonedTimeout="3600" 
     logAbandoned="true" 
     validationInterval="35000" 
    /> 
</Context> 

我的web.xml是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
    <display-name>MyApp</display-name> 

    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <resource-ref> 
     <description>MyApp DB Connection</description> 
     <res-ref-name>jdbc/myDB</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 

    <context-param> 
    <param-name>data-source-lookup-name</param-name> 
    <param-value>java:comp/env/jdbc/myDB</param-value> 
    </context-param> 

    <listener> 
    <listener-class>com.project.listeners.AppListener</listener-class> 
    </listener> 
</web-app> 

應用程序監聽器是這樣的:

package com.project.listeners; 

import java.sql.Driver; 
import java.sql.DriverManager; 
import java.util.Enumeration; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

import org.apache.log4j.Logger; 

import com.mysql.jdbc.AbandonedConnectionCleanupThread; 

public class AppListener implements ServletContextListener { 
    private static Logger logger = Logger.getLogger(AppListener.class); 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     logger.info("Application context initialing"); 

     ServletContext context = event.getServletContext(); 

     DBObjectNames.dataSourceLookupName = context.getInitParameter("data-source-lookup-name"); 
     if(DBObjectNames.dataSourceLookupName == null){ 
      logger.fatal("data-source-lookup-name init parameter not supplied, using default: java:comp/env/jdbc/myDB"); 
      DBObjectNames.dataSourceLookupName = "java:comp/env/jdbc/myDB"; 
     } 
     DBObjectNames.dataSourceLookupName = DBObjectNames.dataSourceLookupName.trim(); 
     logger.info("data-source-lookup-name set to: " + DBObjectNames.dataSourceLookupName); 

     logger.info("Application context initialed"); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     logger.info("Application context destroying"); 

     try { 
      logger.info("Shutting down AbandonedConnectionCleanupThread"); 
      AbandonedConnectionCleanupThread.shutdown(); 
      logger.info("Shut down AbandonedConnectionCleanupThread"); 
     } catch (Throwable t) { 
      logger.fatal("Error while shutting down AbandonedConnectionCleanupThread", t); 
     } 

     Enumeration<Driver> drivers = DriverManager.getDrivers(); 
     while (drivers.hasMoreElements()) { 
      Driver driver = drivers.nextElement(); 
      try { 
       logger.info("Deregistering driver: " + driver); 
       DriverManager.deregisterDriver(driver); 
       logger.info("Deregistered driver: " + driver); 
      } catch (Throwable t) { 
       logger.fatal("Error while deregistering driver: " + driver, t); 
      } 
     } 

     logger.info("Application context destroyed"); 
    } 
} 

我得到這樣的例外:

Oct 30, 2014 4:16:54 PM org.apache.catalina.core.StandardContext reload 
INFO: Reloading Context with name [/myapp] is completed 
Oct 30, 2014 4:17:04 PM org.apache.catalina.core.StandardContext reload 
INFO: Reloading Context with name [/myapp] has started 
2014-10-30 16:17:04,497 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Application context destroying 
2014-10-30 16:17:04,498 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Shutting down AbandonedConnectionCleanupThread 
2014-10-30 16:17:04,498 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Shut down AbandonedConnectionCleanupThread 
2014-10-30 16:17:04,498 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Application context destroyed 
Oct 30, 2014 4:17:04 PM org.apache.jasper.servlet.TldScanner scanJars 
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
2014-10-30 16:17:04,660 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Application context initialing 
2014-10-30 16:17:04,661 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - data-source-lookup-name set to: java:comp/env/jdbc/myDB 
2014-10-30 16:17:04,662 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Application context initialed 
Oct 30, 2014 4:17:04 PM org.apache.catalina.core.StandardContext reload 
INFO: Reloading Context with name [/myapp] is completed 
Oct 30, 2014 4:17:14 PM org.apache.catalina.core.StandardContext reload 
INFO: Reloading Context with name [/myapp] has started 
2014-10-30 16:17:14,665 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Application context destroying 
2014-10-30 16:17:14,666 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Shutting down AbandonedConnectionCleanupThread 
2014-10-30 16:17:14,666 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Shut down AbandonedConnectionCleanupThread 
2014-10-30 16:17:14,666 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Application context destroyed 
Oct 30, 2014 4:17:14 PM org.apache.tomcat.jdbc.pool.ConnectionPool init 
SEVERE: Unable to create initial connections of pool. 
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) 
    at com.mysql.jdbc.Util.getInstance(Util.java:360) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924) 
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1037) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2234) 
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2265) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2064) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:790) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44) 
    at sun.reflect.GeneratedConstructorAccessor12.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:395) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:307) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:200) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:142) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:553) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:241) 
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:94) 
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:841) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1084) 
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:663) 
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:256) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5120) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3821) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5576) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
    at java.lang.Thread.run(Unknown Source) 

Oct 30, 2014 4:17:14 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon 
WARNING: Connection has been abandoned PooledConnection[[email protected]]:java.lang.Exception 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1052) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:704) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:142) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:553) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:241) 
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:94) 
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:841) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1084) 
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:663) 
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:256) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5120) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3821) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5576) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
    at java.lang.Thread.run(Unknown Source) 

Oct 30, 2014 4:17:14 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon 
WARNING: Connection has been abandoned PooledConnection[[email protected]]:java.lang.Exception 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1052) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:704) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:142) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:553) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:241) 
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:94) 
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:841) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1084) 
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:663) 
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:256) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5120) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3821) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5576) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
    at java.lang.Thread.run(Unknown Source) 

Oct 30, 2014 4:17:14 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon 
WARNING: Connection has been abandoned PooledConnection[[email protected]]:java.lang.Exception 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1052) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:704) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:142) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:553) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:241) 
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:94) 
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:841) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1084) 
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:663) 
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:256) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5120) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3821) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5576) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
    at java.lang.Thread.run(Unknown Source) 

Oct 30, 2014 4:17:14 PM org.apache.naming.NamingContext lookup 
WARNING: Unexpected exception resolving reference 
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) 
    at com.mysql.jdbc.Util.getInstance(Util.java:360) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924) 
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1037) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2234) 
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2265) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2064) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:790) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44) 
    at sun.reflect.GeneratedConstructorAccessor12.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:395) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:325) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:307) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:200) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:142) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:553) 
    at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:241) 
    at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:94) 
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:841) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166) 
    at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1084) 
    at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:663) 
    at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:256) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5120) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3821) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 
    at org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5576) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 
    at java.lang.Thread.run(Unknown Source) 

Oct 30, 2014 4:17:14 PM org.apache.catalina.core.NamingContextListener addResource 
WARNING: Failed to register in JMX: javax.naming.NamingException: Data source rejected establishment of connection, message from server: "Too many connections" 
Oct 30, 2014 4:17:14 PM org.apache.jasper.servlet.TldScanner scanJars 
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 
2014-10-30 16:17:14,788 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Application context initialing 
2014-10-30 16:17:14,789 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - data-source-lookup-name set to: java:comp/env/jdbc/myDB 
2014-10-30 16:17:14,791 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] INFO com.project.listeners.AppListener - Application context initialed 
Oct 30, 2014 4:17:14 PM org.apache.catalina.core.StandardContext reload 
INFO: Reloading Context with name [/myapp] is completed 

的更多信息:

這些情況未經測試的應用程序,也就是我不是執行的Web應用程序打開的連接,還只是寫代碼,所以不會是打開的連接,並保持它活着沒有任何事宜關閉它。

使用Apache Tomcat:版本8.0。和Eclipse Luna發佈。

請幫我。

編輯

每次上下文得到重新加載,我看打151個連接MySQL服務器的最大連接限制之前,MySQL工作臺15多個打開的連接到數據庫。

回答

10

我想你必須在context.xml中爲你的Resource添加closeMethod =「close」。然後,當你重新加載上下文時,Tomcat應該關閉你的數據庫連接。

修改的context.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Resource 
     name="jdbc/myDB" 
     auth="Container" 
     type="javax.sql.DataSource" 
     factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
     username="root" 
     password="admin" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/myDB?allowMultiQueries=true" 
     defaultAutoCommit="false" 
     initialSize="20" 
     maxActive="50" 
     maxIdle="30" 
     minIdle="15" 
     maxWait="5000" 
     testOnBorrow="true" 
     testWhileIdle="true" 
     validationQuery="SELECT 1" 
     timeBetweenEvictionRunsMillis="35000" 
     minEvictableIdleTimeMillis="55000" 
     removeAbandoned="true" 
     removeAbandonedTimeout="3600" 
     logAbandoned="true" 
     validationInterval="35000" 
     closeMethod="close" 
    /> 
</Context> 
+0

謝謝,這解決了我的問題。 :) 非常感謝。 – UDPLover 2014-10-30 12:12:59

5

刪除工廠= 「org.apache.tomcat.jdbc.pool.DataSourceFactory」

在最近升級到Apache的Tomcat的8.0.28, 「工廠= ...」被添加到DataSource配置中,然後與Oracle數據庫的連接會話變得瘋狂。拿出來後,連接會話進入諾拉姆狀態。我試圖理解原因,但我做不到。此評論可能對其他人有幫助。

以下是來自的數據源配置Apache TomEE http://tomee.apache.org/datasource-config.html。對於任何正在尋找解決方案的人來說,這應該是一個很好的參考。

<Resource id="myDataSource" type="javax.sql.DataSource"> 
 
    accessToUnderlyingConnectionAllowed = false 
 
    alternateUsernameAllowed = false 
 
    connectionProperties = 
 
    defaultAutoCommit = true 
 
    defaultReadOnly = 
 
    definition = 
 
    ignoreDefaultValues = false 
 
    initialSize = 0 
 
    jdbcDriver = org.hsqldb.jdbcDriver 
 
    jdbcUrl = jdbc:hsqldb:mem:hsqldb 
 
    jtaManaged = true 
 
    maxActive = 20 
 
    maxIdle = 20 
 
    maxOpenPreparedStatements = 0 
 
    maxWaitTime = -1 millisecond 
 
    minEvictableIdleTime = 30 minutes 
 
    minIdle = 0 
 
    numTestsPerEvictionRun = 3 
 
    password = 
 
    passwordCipher = PlainText 
 
    poolPreparedStatements = false 
 
    serviceId = 
 
    testOnBorrow = true 
 
    testOnReturn = false 
 
    testWhileIdle = false 
 
    timeBetweenEvictionRuns = -1 millisecond 
 
    userName = sa 
 
    validationQuery = 
 
</Resource>

+1

即使假設這是正確的,沒有解釋也沒有用。 – 2015-12-16 01:41:30

+0

@大衛,你是否證明這是錯的?它確實爲我的apache-tomcat-8.0.28工作 – caot 2015-12-16 22:28:03

+0

我沒有說這是錯誤的。我說沒有解釋就沒有幫助。我想這就是爲什麼當我的評論被投票時,它被拒絕投票。 – 2015-12-16 22:31:43

1

如果我們有這樣的使用Hibernate屬性配置文件,我認爲這將是足夠的:

hibernate.transaction.auto_close_session 
+0

更詳細的解釋會很好。 :-) – Andreas 2016-05-07 20:30:02