2014-04-21 50 views
1

好吧,我改变我的连接工厂的代码,我使用PoolProperties类,现在我收到此错误:太多的连接(新的错误)

Data source rejected establishment of connection, message from server: "Too many connections"

在我InsertandGetObject方法我日志中的消息为了测试连接是否关闭,我也在服务器上启动了debbug。

这个问题的任何想法? :■

这是我的连接池:

public static Connection getConnection() throws DatabaseConnectionException { 

    PoolProperties p = new PoolProperties(); 
    p.setName("jdbc/MetaData"); 
    p.setUrl("jdbc:mysql://localhost:3306/db_name"); 
    p.setDriverClassName("com.mysql.jdbc.Driver"); 
    p.setUsername("root"); 
    p.setPassword(""); 
    p.setInitialSize(3); 
    p.setMaxActive(10); 
    p.setMaxIdle(8); 
    p.setMinIdle(2); 
    p.setRemoveAbandoned(true); 
    p.setMaxWait(10000); 

    Connection conn = null; 



    try { 

     DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(p); 

     conn = dataSource.getConnection(); 

    } catch (SQLException e) { 
     LOGGER.debug("MSJ SQLExp: " + e.getMessage()); 
     throw new DatabaseConnectionException(e); 

    } 

    return conn; 
} 

这是关闭连接的方法:

public Concept insertAndGetObject(Concept object) throws SQLException, 
     DatabaseConnectionException { 
    try { 

     connection = ConnectionFactory.getConnection(); 
     connection.setAutoCommit(false); 
     statement = connection.prepareStatement(INSERT_CONCEPTS); 
     statement = ConceptMapperUtil.setStatementParameters(statement, 
       object); 
     statement.executeUpdate(); 
     connection.commit(); 
     LOGGER.debug("Inserted concept row "); 
    } catch (SQLException e) { 
     connection.rollback(); 

     if (e.getErrorCode() == SQL_INSERT_ERROR_CODE) { 
      LOGGER.debug("Concept already exists!"); 
     } else { 
      throw e; 
     } 

    } finally { 
     object = findConceptByUniqueFk(object.dataSource.getIdDataSource(), 
       object.conceptType.getIdConcept(), 
       object.idMetadataVersion.getIdMetaDataVersion()); 
     DbUtil.close(statement); 
     // connection.setAutoCommit(true); 
     DbUtil.close(connection); 
    } 
    return object; 
} 
+1

与您的问题并不严格相关,但您为什么(1)在方法开始时没有获取“Concept”,以避免将异常用作“正常”业务逻辑(插入已有的概念是在您的流程中“正常”)和(2)在有可能抛出严重的SQLException并且您的连接处于无效状态时,返回到finally子句中的数据库?第二点甚至可以解释你的问题,尽管我不能告诉你迄今为止提供的信息。 –

+0

我做了一些改变,现在我得到这个错误,任何想法? – kennechu

+0

您的应用程序正在接收多少个请求(或同时请求)?您的数据库被配置为处理多少个同时连接?尝试增加mysql允许的连接数(通过mysql管理员或编辑my.ini) –

回答

2

随着new DataSource(PoolProperties)你不创建一个“数据源对象包裹的连接”(如ApiDocs中所述)。相反,你创建了一个连接池(也在ApiDocs中提到过,但在顶部:“DataSource只是包装一个ConnectionPool ...”)。我验证了这一点,我认为是源代码(请参阅DataSourceProxy的第108行)。因此,关闭一个Connection只会将它返回给池(这样它可以重新使用),它并没有真正关闭连接(除非您看到连接实际上在数据库服务器上关闭,在这种情况下,I错了)。解决方案是创建1个DataSource对象并为每个getConnection()调用重新使用它。当应用程序不再需要数据库连接时关闭DataSource/ConnectionPool。