HikariPool达到最大连接数

问题描述 投票:0回答:2

我正在使用HikariCP运行SQLite数据库。我的配置如下所示:

public class SQLiteDataSource {
    private static final HikariConfig config = new HikariConfig();
    private static final HikariDataSource ds;

    static {


        config.setJdbcUrl("jdbc:sqlite:database.db");
        config.setConnectionTestQuery("SELECT 1");
        config.addDataSourceProperty("cachePrepStmts", true);
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSwlLimit", "2048");
        config.setIdleTimeout(10000);
        config.setMaxLifetime(30000);
        config.setValidationTimeout(30000);
        config.setMaximumPoolSize(100);
        config.setMinimumIdle(10);
        config.setAllowPoolSuspension(false);

        ds = new HikariDataSource(config);
    }

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

getConnection()方法用于从数据库中的表获取数据。这些函数如下所示:

// This is a slightly abreviated function to get a boolean from a table in the database where the primary key "id" matches the one requested

 public static Boolean getBoolean(String Id, String column) {
        try (final PreparedStatement preparedStatement = SQLiteDataSource.getConnection()
                // language=SQLite
                .prepareStatement("SELECT " + column + " FROM table WHERE id = ?")) {

            preparedStatement.setString(1, Id);

            try (final ResultSet resultSet = preparedStatement.executeQuery()) {
                if (resultSet.next()) {
                    Boolean bool = resultSet.getBoolean(setting);
                    resultSet.close();
                    preparedStatement.getConnection().close();
                    return bool;
                }
            }

            preparedStatement.getConnection().close();

        } catch (SQLException e) {
        e.printStackTrace();
        }
        return false;
    }

每次调用该函数时,PreparedStatement的连接都会在最后关闭。但是,池大小会不断增长,直到达到最大池大小并超时为止。

有没有办法我可以防止这种情况或强制关闭连接?

java sqlite jdbc hikaricp connection-leaks
2个回答
0
投票

按照@Nithin的建议删除preparedStatement.getConnection().close(),并在try-with-resources块中明确获取连接:

try (Connection con = SQLiteDataSource.getConnection();final PreparedStatement preparedStatement = con
                // language=SQLite
                .prepareStatement("SELECT " + column + " FROM table WHERE id = ?")) {

那样,连接也会在块末尾关闭


0
投票

您正在泄漏连接,因为您没有在try-with-resources块中保留引用。因此,您用于创建语句的连接永远不会关闭。相反,您获得了一个[[different连接并将其关闭(在两个不同的位置!)。最终,您将以这种方式耗尽连接池。

此外,鉴于您正在使用try-with-resources,因此无需显式关闭resultSet

您需要将代码更改为:

try (Connection connection = SQLiteDataSource.getConnection(); PreparedStatement preparedStatement = connection .prepareStatement("SELECT " + column + " FROM table WHERE id = ?")) { preparedStatement.setString(1, Id); try (ResultSet resultSet = preparedStatement.executeQuery()) { if (resultSet.next()) { Boolean bool = resultSet.getBoolean(setting); return bool; } } } catch (SQLException e) { e.printStackTrace(); }

还请注意,如果column的值来自不受信任的来源,则容易受到SQL注入的攻击。
© www.soinside.com 2019 - 2024. All rights reserved.