gpt4 book ai didi

java - 优雅/高效地读取 MySQL 数据库中数百万条记录,Java

转载 作者:行者123 更新时间:2023-11-29 13:07:59 31 4
gpt4 key购买 nike

我有一个包含约 8.000.000 条记录的 MySQL 数据库。因为我需要处理所有这些,所以我使用 BlockingQueue 作为生产者从数据库读取数据并将 1000 条记录放入队列中。 Consumer 是从队列中获取记录的处理器。

我正在用 Java 编写此内容,但是我一直想弄清楚如何(以干净、优雅的方式)从数据库中读取数据,并在 BlockingQueue 已满时“暂停”读取。此后,控制权将移交给消费者,直到 BlockingQueue 中再次有空闲位置可用。从这里开始,生产者应该继续从数据库中读取记录。

保持数据库连接打开以便连续读取是否干净/优雅/高效?或者,一旦控制权从生产者转移到消费者,就应该关闭连接,存储到目前为止读取的记录的 id,然后打开连接并开始从该 id 读取?在我看来,后者并不是很好,因为我的数据库必须经常打开/关闭!不过,我认为前者也不是那么优雅?

最佳答案

使用持久连接:

  • 您无法有效地构建事务处理
  • 同一连接上不可能出现用户 session
  • 这些应用程序不可扩展。
  • 随着时间的推移,您可能需要扩展它,并且需要管理/跟踪持久连接
  • 如果脚本无论出于何种原因无法释放表上的锁,则后面的任何脚本都将无限期地阻塞,并且应该重新启动数据库服务器。
  • 使用事务,如果脚本执行在事务 block 完成之前结束等,事务 block 也会传递到下一个脚本(使用相同的连接)。

持久连接不会带来任何非持久连接可以做的事情。
那么,为什么要使用它们呢?

唯一可能的原因是性能,当创建到 MySQL 服务器的链接的开销很高时使用它们。这取决于许多因素,例如:

  • 数据库类型
  • MySQL 服务器是否在同一台计算机上,如果不在同一台计算机上,距离有多远?可能在您的本地网络/域之外?
  • MySQL 所在的机器被其他进程过载了多少

人们总是可以用非持久连接替换持久连接。它可能会改变脚本的性能,但不会改变其行为!

商业 RDBMS 可能会根据并发打开的连接数进行许可,而持久连接可能会出现错误服务。

关于java - 优雅/高效地读取 MySQL 数据库中数百万条记录,Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22450405/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com