当前位置: 首页 > 面试题库 >

每个线程通过新连接实例进行连接池(JDBC)

阎德业
2023-03-14
问题内容

我正在创建一个多线程应用程序。但是,当我有一个为所有线程服务的连接对象时,我的应用程序遇到了许多意外行为。

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

我已经尝试过连接池,这会使应用程序痛苦地洗澡。但是,我的直觉是,如果让每个线程创建自己的连接对象,则可能会出现“连接过多”错误。

请让我知道是否有任何方法可以帮助您。

问候。


问题答案:

无论线程问题如何,您都 绝对 应该使用连接池。它将大大提高连接性能。然后到线程问题,这确实是一个主要问题。JDBC的惯用法是在 尽可能短的范围内*
获取 关闭 所有资源。也就是说,所有操作都应在同一方法块中进行。您正在描述的问题症状表明您没有正确关闭这些资源。
*

无论连接是否来自池,关闭都应始终进行。如果关闭非池化连接,则当数据库保持打开状态太长时间时,它将防止数据库超时。关闭池化连接实际上会将其释放回池,并使其可用于下一个租约。

这是的情况下,普通JDBC惯用法的样子INSERT

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) {}
    }
}


 类似资料:
  • 我对连接池的理解是;如果connectionstring完全相同,那么我们重用该连接,而不是建立新的连接。 我的问题是,我正在为并行处理创建许多线程。在这个“虚拟”程序中,我创建了500个线程,并让线程池函数处理这些线程。 步骤是: > < li> 每个线程在SQL中创建一个更新表。(说明更新的时间戳) 然后线程Hibernate1到10秒(随机)。 最后,线程在 SQL 中进行另一次更新(说明结

  • 其最终目标是能够公开on-prem SQL Server,以便它可以像使用Azure的“常规”SQL Server一样连接到。我正试图避免进行Azure数据同步,因为我不想在这种情况下“复制”数据,尽管如果这不起作用,我可能不得不退回到Azure数据同步。 到目前为止,我已经创建了到SQL Server的Azure混合连接,现在我正尝试通过混合连接连接到SQL Server。 我已经通过创建SAS

  • 本文向大家介绍通过Maven进行jedis连接redis的实现,包括了通过Maven进行jedis连接redis的实现的使用技巧和注意事项,需要的朋友参考一下 最近项目要用到redis,很多东西忘得差不多了,稍微回顾了利用Java客户端连接redis的过程,这里jedis是连接redis的Java客户端,如果没有Maven,需要手动下载jar包,很麻烦,于是这里使用Maven,记录下连接过程。 1

  • 我不确定的是,在这种情况下,会创建多少个线程?我在一台2核心的机器上运行,所以每核心24个线程,最多48个线程? 当并行度因子设置为4.0时,可以并行运行的线程数将是8。那么,设置最小值和最大值(我的例子是24和48)的需要是什么?

  • 给stackoverflow社区的人们。我正在寻找一些帮助,以解决HikariCP连接池面临的问题。 高级:我正在尝试使用线程池创建多个线程,我的计划是为每个工作线程提供独立于HikariCP的连接,但HikariCP所做的是在多个线程之间共享一个公共连接。我正在使用 以检索DB连接。现在,当我关闭一个连接时,我在其他线程中看到问题,说连接关闭了,线程正在处理的批次记录被丢弃。 以下是我的日志文件

  • 我对连接池有一些疑问。在SQL Server连接池文章中提到的内容类似于“打开新连接时,如果连接字符串与现有池不完全匹配,则会创建一个新池。每个进程、每个应用程序域、每个连接字符串以及使用集成安全性时、每个Windows标识将连接池化。” 现在我有了自己的windows窗体应用程序,它具有SQL连接。 > 所以当我打开应用程序时,SQL连接首次打开,并创建了一个池。所以,如果我关闭应用程序池会被自