【问题标题】:Concurrency with HikariCP与 HikariCP 的并发性
【发布时间】:2018-11-20 07:34:56
【问题描述】:

我有一个更新 oracle 数据库中的表的 java 程序。

我已经尝试过使用单个 JDBC 连接,但速度非常慢,需要数小时才能完成。

我正在尝试使用 HikariCP 创建一个连接池,并让多个线程从池中获取单独的连接。

假设池中有 6 个线程和 5 个数据库连接,其中 5 个线程调用 HikariDataSource.getConnection() 方法。他们每个人都会得到一个单独的数据库连接对象吗?

如果是,那么当线程调用 getConnection 方法或使用空连接执行剩余代码时,线程是否会处于阻塞/等待状态?

如果不是,我如何让它们分开连接?

【问题讨论】:

  • 为什么不直接测试一下?
  • 一般来说,对于连接池,您希望每个工作单元而不是每个线程获得连接。数据库上的一个工作单元通常是一个事务。这可能看起来很浪费,不断地获取和返回连接 - 但正是这一点使池变得有价值;你的连接数可能比工人少很多。
  • @JBNizet 我按照您的建议进行了测试,结果与回答的结果相同。

标签: java multithreading jdbc concurrency hikaricp


【解决方案1】:

他们每个人都会得到一个单独的数据库连接对象吗?

每个线程询问连接,如果可用,则获得一个单独的数据库连接对象

如果是,那么当线程调用 getConnection 方法或使用空连接执行剩余代码时,线程是否会处于阻塞/等待状态?

如果没有可用的连接,它将等到连接释放到池中并获取它,如果直到定义超时才获得连接,它将抛出超时异常

如果不是,我如何让它们分开连接?

无关,因为每个线程会得到不同的连接

关于HikariCP and concurrency

HikariCP 包含一个称为 ConcurrentBag 的自定义无锁集合。这个想法是从 C# .NET ConcurrentBag 类中借来的,但内部实现完全不同。 ConcurrentBag 提供...

  • 无锁设计
  • ThreadLocal 缓存
  • 队列窃取
  • 直接切换优化

...实现高度并发、极低延迟和最小化错误共享的发生。

【讨论】:

  • 你看起来是对的。我正在尝试使用数据库池中的 2 个连接和 3 个线程对其进行测试。第三个线程始终处于等待状态。如何将连接返回到池?
  • @uneq95 使用完必须关闭连接,Hikari 不会帮你的,见stackoverflow.com/questions/2225221/…
  • 如果我关闭现有连接,池是否必须打开新连接?
  • @uneq95 关闭连接后,连接将返回连接池
  • 所以,close() 方法并没有真正关闭连接,它会释放连接可能占用的所有数据库资源(游标、句柄等),对吧?
猜你喜欢
  • 2021-03-21
  • 2011-04-24
  • 2014-08-23
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多