用Java清理线程/后台线程或进程/服务

时间:2017-10-05 17:19:30

标签: java multithreading background-process

我有一个java项目,打包为jar并运行。该代码与2个数据库(主数据库和辅助数据库)进行交互。表X存在于主DB和辅助DB中,具有相同的结构。

代码中的java线程使用链接的阻塞队列,并且在此队列中添加了在主DB中的表X上运行的每个DML查询。线程会一直检查队列是否添加了新的DML查询对象,并在辅助DB上执行相同的操作。

在一天结束时,要求是删除表X中给定日期的所有行,但在此之前我们在两个数据库中协调表X,如果行数不匹配,则首先在辅助DB中插入缺失的行然后从主DB中删除。

我在这里面临两个问题:

第一个问题是,随着添加到队列的DML查询数量的增加,这些查询的执行变慢。

其次,如果jar被停止并再次重新启动,那么添加到队列但尚未执行的DML查询将丢失,因为队列在内存中,因此这些行永远不会移动到辅助DB。

我正在寻找的是一种方法,我可以设计后台服务或外部服务,它可以独立于主jar是运行还是停止而继续运行,并继续执行复制DML查询的工作主DB到辅助DB。

1 个答案:

答案 0 :(得分:0)

我有这个想法可以作为补充或替代后台服务:

假设您的数据库操作比在小型数据库中插入简单字符串要重得多,您可以将查询作为纯文本插入数据库中,并在执行时将其删除。这样,如果发生任何崩溃,您可以恢复查询队列的位置。队列本身变得持久......我们可以这样:

查询生成器&gt;查询DB&gt; <查询执行服务>最终数据库

其次,您说“随着添加到队列的DML查询数量的增加,这些查询的执行变得缓慢”。你的查询队列怎么那么重?也许你应该检查可能的内存泄漏。