gpt4 book ai didi

java - Tomcat JDBC 连接池问题 : "Statement is closed"

转载 作者:行者123 更新时间:2023-11-28 21:55:16 24 4
gpt4 key购买 nike

我有一个使用 Tomcat JDBC 连接池的服务器应用程序。

这是我用来创建数据源的代码:

PoolProperties connProperties = new PoolProperties();
connProperties.setUrl(resources.getProperty("db.url"));
connProperties.setDriverClassName(resources.getProperty("db.driver"));
connProperties.setUsername(resources.getProperty("db.user"));
connProperties.setPassword(resources.getProperty("db.password"));
connProperties.setJmxEnabled(true);
connProperties.setTestWhileIdle(false);
connProperties.setValidationQuery("SELECT 1");
connProperties.setTestOnReturn(false);
connProperties.setValidationInterval(30000);
connProperties.setTimeBetweenEvictionRunsMillis(30000);
connProperties.setMaxActive(500);
connProperties.setInitialSize(50);
connProperties.setMaxWait(10000);
connProperties.setRemoveAbandonedTimeout(60);
connProperties.setMinEvictableIdleTimeMillis(60000);
connProperties.setSuspectTimeout(60);
connProperties.setMaxIdle(50);
connProperties.setMinIdle(10);
connProperties.setLogAbandoned(false);
connProperties.setRemoveAbandoned(true);
connProperties.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");

dataSource = new DataSource();
dataSource.setPoolProperties(connProperties);

然后我有一个从池中获取连接的方法

protected Connection getDbConnection() throws Exception
{
dbConn = dataSource.getConnection();
return dbConn;
}

每次我想执行一条语句时,我都会调用这段代码:

protected CallableStatement executeCSqlQuery(String sql) throws Exception
{
CallableStatement cstmt;
ResultSet rs = null;

try {
cstmt = getDbConnection().prepareCall(sql);
cstmt.execute();
} catch (SQLException e) {
throw e;
}

return cstmt;
}

这是调用前面代码的示例:

try {
cstmt = dbConnection.executeCSqlQuery(query);
rs = cstmt.getResultSet();
} catch (Exception e) {
// do smething
} finally {
try {
if (cstmt != null) {
cstmt.close();
}
dbConnection.shutdown();
} catch (Exception e) {
// do something
}
}

public void shutdown() {
if (this.dbConn != null)
this.dbConn.close();
}

我面临的问题是,当我每隔 X 秒在线程中执行一次调用时,我时不时会收到一个异常“语句已关闭”。我不确定为什么会这样。我认为这可能是驱动程序错误或与数据库的连接失败(在不同的服务器上运行)。

我没主意了。我错过了什么?

我应该改用 c3p0 连接池吗?

最佳答案

我创建了赏金来帮助 Reznik,但我最终通过查看他的代码找出了问题所在。

问题是每次从池中获取一个新的连接

protected Connection getDbConnection() throws Exception
{
dbConn = dataSource.getConnection();
return dbConn;
}

对象 dbConn 被更新为一个新的连接。

例子:

T1 调用 getDbConnection()

T2 调用 getDbConnection()

T1 执行查询,处理 resultSet 并调用 shutdown()

public void shutdown() {
if (this.dbConn != null)
this.dbConn.close();
}

因为 T2 更新了对象,T2 使用的连接将被 T1 关闭

T2 尝试使用连接,但它已经关闭。

这样,不必总是更新连接,只需返回它,然后添加额外的逻辑来关闭从池中获取的连接。

关于java - Tomcat JDBC 连接池问题 : "Statement is closed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19538797/

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