java - SQL 连接与 DataSource 超时

标签 java sql

我有一个服务器向远程主机提交查询以从数据库访问帐户信息以登录到游戏服务器。问题是连接随机超时,但是我使用的是 DataSource,它应该会自动重新建立任何丢失的连接。任何人都知道如何解决这个问题?

public class Database {

private final PoolingDataSource source;

public Database(String driver, String url, String user, String password)
        throws ClassNotFoundException {
    Class.forName(driver);
    source = createSource(url, user, password);
}

@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
private PoolingDataSource createSource(String connectURI, String user,
        String password) {
    GenericObjectPool.Config config = new GenericObjectPool.Config();
    config.maxActive = 150;
    config.maxIdle = 100;
    config.minIdle = 30;
    config.maxWait = 1000;
    config.testWhileIdle = true;

    ObjectPool connectionPool = new GenericObjectPool(null, config);
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
            connectURI, user, password);
    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
            connectionFactory, connectionPool, null, null, false, true);
    PoolingDataSource poolingDataSource = new PoolingDataSource(
            connectionPool);
    return poolingDataSource;
}

public Connection getConnection() throws SQLException {
    return getSource().getConnection();
}

public PoolingDataSource getSource() {
    return source;
}
}

最佳答案

“回到过去……”,在 2003 年,我正在使用 Tomcat 4.1 并且惊讶地发现它的 DataSource 实现需要你给它一个 validationQuery 否则它只会初始化连接一次并且永远不要验证数据库服务器端是否仍会尊重连接。我们的 Oracle 服务器将简单地消除我认为 60 分钟未使用的连接。这样做的结果是,当我的服务器容量变低时,我的一些池连接将在数据库服务器端被终止,但应用程序服务器不知道,直到它尝试以更高的容量使用它们。在这一点上,他们只是堆栈跟踪,这就是它的结束。添加 validationQuery 具有 DataSource 本身保持连接 Activity 并且一切正常的效果。这个发现过程的血腥细节在这里 https://groups.yahoo.com/neo/groups/seajug/conversations/messages/4902 , 如果你有兴趣的话。

我建议您检查您的 GenericObjectPool 实现是否具有验证查询或心跳或其他概念,并弄清楚如何利用它来保持您的连接“新鲜”。

关于java - SQL 连接与 DataSource 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634896/

相关文章:

java - 为什么我的循环跳过这个条件?

java - 如何直接在 JavaScript 函数中更新 JSF java 字符串

java - 使用 ActionListener 清除 JPanel 中的图形

sql - 2个数组中具有相同索引的元素的乘积

MySQL Server 5.0 命令行客户端无法打开文件 .sql

java - JDBC:如何处理 JavaPreparedStatement 中的通配符

java - JSON 将数组与字符串数组组合以获得紧密的名称值对

java - JScrollbar 中的 paintComponent

python - 在 SQL 数据库中存储 Python 列表

php - 索引对 where 子句中没有索引列的查询有帮助吗?