java - 每个线程的新连接实例上的连接池 (JDBC)

标签 java multithreading jdbc connection-pooling

我正在创建一个多线程应用程序。然而,当我有一个连接对象为所有线程提供服务时,我的应用程序出现了许多意外行为。

我陷入了两难的境地。我应该让每个线程创建、使用和处置自己的连接对象还是应该使用连接池?

我尝试过连接池,这使得应用程序痛苦地淋浴。但是,我的直觉是,如果我让每个线程创建自己的连接对象,我可能会收到“连接过多”错误。

如果有任何方法可以帮助我,请告诉我。

问候。

最佳答案

无论线程问题如何,您一定应该选择连接池。它将大大提高连接性能。然后到线程问题,这确实是一个大问题。正常的 JDBC 习惯用法是获取关闭最短可能范围内的所有资源。 IE。所有这些都应该发生在同一个方法 block 中。您所描述的问题症状证实您没有正确关闭这些资源。

无论连接是否来自池,都应该始终发生关闭。关闭非池连接将防止数据库在其保持打开时间过长时超时。关闭池连接实际上会将其释放回池中,并使其可用于下一次租用。

下面是 INSERT 情况下的正常 JDBC 习惯用法。

public void create(Entity entity) throws SQLException {
    // Declare.
    Connection connection = null;
    PreparedStatement statement = null;

    try { 
        // Acquire.
        connection = database.getConnection();
        statement = connection.prepareStatement(SQL_CREATE);

        // Use.
        statement.setSomeObject(1, entity.getSomeProperty());
        // ...
        statement.executeUpdate();
    } finally {
        // Close.
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }
}

关于java - 每个线程的新连接实例上的连接池 (JDBC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540942/

相关文章:

java - 找不到记录器(log4j)的附加程序?

java - setOnItemClickListener 自定义 Listview

c# - .net 构造/模式按代码段阻塞,而不是按线程阻塞

multithreading - 访问当前 PowerShell 实例

java - H2 控制台看不到 JAVA 创建的表

java - JComboBox 中的 MySQL 表值

java - 无法从 WSDL 创建 JAX-WS 服务

java - 当某些节点突然死亡时,hazelcast 内存中的映射丢失了数据

C 中的 CreateProcess 关闭控制台太快

java - 无法从服务器读取响应