簡體   English   中英

HikariCP 未在 close() 上關閉連接(連接泄漏)

[英]HikariCP not closing connections on close() (Connection Leak)

我正在使用 HikariCP 3.3.1 和 PostgreSQL。 但是我在關閉連接時遇到了問題,在 Hikari 配置中,我將最大池大小設置為 15,將最小空閑連接設置為 5,但是在使用數據庫幾分鍾后,我發現連接沒有關閉,它們堆疊越來越多(現在幾乎有 100 個空閑連接)。 在此處輸入圖片說明

我的連接器類:

連接器.java

public class Connector implements IConnector {
private static HikariConfig config = new HikariConfig();
private static HikariDataSource ds;

static {
    config.setDriverClassName(org.postgresql.Driver.class.getName());
    config.setJdbcUrl("jdbc:postgresql://localhost:5432/vskDB");
    config.setUsername("postgres");
    config.setPassword("root");
    config.setMinimumIdle(5);
    config.setMaximumPoolSize(15);
    config.setConnectionTimeout(20000);
    config.setIdleTimeout(300000);
    ds = new HikariDataSource(config);
}

public Connection getConnection() {
    log.info("getConnection() invoked");
    try {
        return ds.getConnection();
    } catch (SQLException e) {
        log.error("Can't get connection from DataSource.");
        log.error(e.getMessage());
        System.out.println(e.getMessage());
    }
    return null;
}

Connector() {
}
}

這是我的 DAO 類(簡化): UserDAO.java

public class UserDatabaseDAO implements UserDAO {
    private Connector connector = new Connector();
    private Connection dbConnection;

    @Override
    public void removeUser(Long id) {
        try {
            dbConnection = connector.getConnection();
            if (dbConnection == null)
                throw new ConnectException();

            PreparedStatement preparedStatement = dbConnection.prepareStatement("DELETE FROM users WHERE user_id = ?");
            preparedStatement.setLong(1, id);
            preparedStatement.execute();

        } catch (SQLException | ConnectException e) {
            log.error("Can't remove user from database");
            log.error(e.getMessage());
            System.out.print(e.getMessage());
        } finally {
            try {
                dbConnection.close();
            } catch (SQLException e) {
                log.error("Can't close connection");
                log.error(e.getMessage());
                System.out.print(e.getMessage());
            }
        }
    }
}

在這里,我發現了有關 Hikari 的一些事實的問題:
您必須在 HikariCP 為您提供的連接實例上調用 close()

也許我的dbConnection.close()不起作用,因為它只是 Hikari 在getConnection()方法中給我的 Connection 的副本。

你也忘了關閉PreparedStatement

try {
       if (preparedStatement != null) {
            preparedStatement.close();
       }
       if (dbConnection != null) {
            dbConnection.close();
       }

立即釋放此 Statement 對象的數據庫和 JDBC 資源,而不是等待它自動關閉時發生。 通常,在完成資源后立即釋放資源是一種很好的做法,以避免占用數據庫資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM