我有一个java项目,打包为jar并运行。该代码与2个数据库(主数据库和辅助数据库)进行交互。表X存在于主DB和辅助DB中,具有相同的结构。
代码中的java线程使用链接的阻塞队列,并且在此队列中添加了在主DB中的表X上运行的每个DML查询。线程会一直检查队列是否添加了新的DML查询对象,并在辅助DB上执行相同的操作。
在一天结束时,要求是删除表X中给定日期的所有行,但在此之前我们在两个数据库中协调表X,如果行数不匹配,则首先在辅助DB中插入缺失的行然后从主DB中删除。
我在这里面临两个问题:
第一个问题是,随着添加到队列的DML查询数量的增加,这些查询的执行变慢。
其次,如果jar被停止并再次重新启动,那么添加到队列但尚未执行的DML查询将丢失,因为队列在内存中,因此这些行永远不会移动到辅助DB。
我正在寻找的是一种方法,我可以设计后台服务或外部服务,它可以独立于主jar是运行还是停止而继续运行,并继续执行复制DML查询的工作主DB到辅助DB。
答案 0 :(得分:0)
我有这个想法可以作为补充或替代后台服务:
假设您的数据库操作比在小型数据库中插入简单字符串要重得多,您可以将查询作为纯文本插入数据库中,并在执行时将其删除。这样,如果发生任何崩溃,您可以恢复查询队列的位置。队列本身变得持久......我们可以这样:
查询生成器&gt;查询DB&gt; <查询执行服务>最终数据库
其次,您说“随着添加到队列的DML查询数量的增加,这些查询的执行变得缓慢”。你的查询队列怎么那么重?也许你应该检查可能的内存泄漏。