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

标签 java mysql database-connection blockingqueue

我有一个包含约 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/

相关文章:

java - Spring MVC 与 .html 一起使用

java - Mysql 更新似乎有效,但抛出语句关闭错误

javascript - 如何将 Node mysql 查询存储在变量中?

neo4j - 将 neo4j 网络客户端连接到本地数据库

connection-string - 集中和保护连接字符串的最佳方法是什么?

php - 从php代码运行sql查询的问题

java - 用于在 Spring boot Java 中记录每个请求的 Apt 设计模式

java - 如何更新 JLabel 内的图像并将其发布到屏幕

mysql - Rails - 对三个表列进行查询的索引

mysql 使用 where 子句计算每组的计数