繁体   English   中英

连接过多(新错误)

[英]Too many connections (New Error)

好的,更改连接工厂代码,使用PoolProperties类,现在出现此错误:

数据源拒绝建立连接,服务器发出消息:“连接太多”

在我的InsertandGetObject方法中,我记录了一条消息以测试连接是否正在关闭,而且我还在服务器上进行了调试。

对这个问题有什么想法吗? :■

这是我的连接池:

    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;
}

使用new DataSource(PoolProperties)时,不会创建“包装连接的DataSource对象”(如ApiDocs中所述)。 而是创建一个连接池(在ApiDocs中也提到过,但在顶部:“ DataSource只是包装了ConnectionPool ...”)。 我在源代码中对此进行了验证(请参阅DataSourceProxy的第108行)。

因此,关闭连接只会将其返回到池中(以便可以重复使用),实际上并不会关闭连接(除非您看到数据库服务器上实际上已关闭了连接,在这种情况下我错了) 。 解决方案是创建1个DataSource对象,并在每个getConnection()调用中重新使用它。 当应用程序不再需要数据库连接时,请关闭DataSource / ConnectionPool。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM