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