gpt4 book ai didi

java - 连接太多(新错误)

转载 作者:行者123 更新时间:2023-11-28 22:13:04 25 4
gpt4 key购买 nike

好的,我更改了我的连接工厂代码,我正在使用 PoolProperties 类,现在我收到了这个错误:

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

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

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

这是我的连接池:

    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。

关于java - 连接太多(新错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23191517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com