Jdbc 多个线程能否共享同一个数据库连接以同时在中执行多个prepareStatement?

Jdbc 多个线程能否共享同一个数据库连接以同时在中执行多个prepareStatement?,jdbc,Jdbc,我想使用多个线程来执行SQL查询。每个线程分配一个数据库连接将导致很大的开销。我可以让多个线程共享同一个数据库连接并并行执行多个SQL查询吗?理论上,JDBC连接必须是线程安全的,但实际上它有两个问题: 并非所有的驱动程序都是线程安全的,甚至声称是线程安全的驱动程序也可能没有经过可靠的线程安全测试,因为同时使用来自多个线程的连接并不推荐,也不常见 同时从多个线程使用单个连接会带来各种额外的协调问题:一个线程提交或回滚,或从auto commit false切换到auto commit true

我想使用多个线程来执行SQL查询。每个线程分配一个数据库连接将导致很大的开销。我可以让多个线程共享同一个数据库连接并并行执行多个SQL查询吗?

理论上,JDBC连接必须是线程安全的,但实际上它有两个问题:

  • 并非所有的驱动程序都是线程安全的,甚至声称是线程安全的驱动程序也可能没有经过可靠的线程安全测试,因为同时使用来自多个线程的连接并不推荐,也不常见

  • 同时从多个线程使用单个连接会带来各种额外的协调问题:一个线程提交或回滚,或从auto commit false切换到auto commit true,将破坏同一连接上所有其他线程的功能:工作丢失,或活动结果集突然关闭(例如,由于提交,或者JDBC要求在自动提交中执行语句将关闭同一连接上以前的任何结果集)

    此外,如果连接中断(或被其中一个线程关闭),这也会影响所有其他线程

  • 此外,如果驱动程序是线程安全的,通常通过大量的同步块或其他形式的互斥来实现线程安全。这会严重影响使用单独连接时的性能,因为其他线程将不得不相互等待

    每个线程使用连接要简单得多,因为它将工作从一个线程与所有其他线程隔离开来。此外,由于没有对连接的争用访问,它通常会执行得更好。如果您担心的是拥有多个连接的设置成本,那么您应该做两件事:

  • 使用连接池,它允许您轻松地重用连接
  • 使用大小有限的线程池来执行实际工作

  • 这样做有很多好处:您可以向线程池提交单个工作单元;工作单元从线程池获得连接,并在连接完成时返回(通过关闭连接)。以这种方式使用连接池还允许您轻松替换断开的连接,而无需在应用程序代码中处理此问题(可能不是重试断开连接的任务),最后,同时使用连接池和线程池可以让您尝试调整两者的大小,以确定什么是为应用程序提供最佳吞吐量的最佳大小。

    否。当然不是。每个线程都需要自己的连接。“为每个线程分配一个数据库连接将导致很大的开销”可能比你想象的要少很多开销,而且没有同时共享连接那么麻烦。非常感谢你,这对我帮助很大,我将把它作为答案