清理线程/后台线程或过程/服务在Java

清理线程/后台线程或过程/服务在Java

问题描述:

我有一个java项目打包成一个jar和运行。代码与2个数据库,主数据库和辅助数据库进行交互。表X存在于具有相同结构的主DB和辅DB中。清理线程/后台线程或过程/服务在Java

代码中的Java线程使用链接的阻塞队列,并且添加到主队列中的表X上运行的每个DML查询的此队列中。线程继续检查队列是否添加了新的DML查询对象,并在辅助数据库上执行相同操作。

一天结束时,需要删除表X中给定日期的所有行,但在此之前,我们需要在两个数据库中调整表X,并且在行数不匹配的情况下,首先将缺少的行插入到次级DB,然后从主数据库中删除。

这里我面临两个问题:

第一个问题是,作为添加到所述队列的增加DML查询的数量,这些查询的执行速度变慢。

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

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

+0

像Linux或Windows上的'cron''Task Scheduler'? –

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

假设你的数据库操作不是插入的小DB简单的字符串重得多,你可以插入查询以纯文本格式存储在数据库中,并在执行时将其删除。这样,如果任何事情崩溃,你可以恢复查询队列的位置。本身成为持续性的队列......我们可以有这样的事情:

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

其次,你说“作为添加到队列DML的查询数增加,这些查询的执行变得缓慢“。你的查询队列如何变得沉重?也许你应该检查可能的内存泄漏。