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

清理Java中的线程/后台线程或进程/服务,java,multithreading,background-process,Java,Multithreading,Background Process,我有一个java项目,它被打包成jar并运行。代码与两个数据库交互,一个主数据库和一个辅助数据库。表X存在于具有相同结构的主数据库和辅助数据库中 代码中的java线程使用一个链接的阻塞队列,并将在主数据库中的表X上运行的每个DML查询添加到此队列。线程不断检查队列是否添加了新的DML查询对象,并在辅助数据库上执行相同的操作 在一天结束时,要求删除给定一天中表X中的所有行,但在此之前,我们协调两个数据库中的表X,如果行数不匹配,则丢失的行首先插入到辅助数据库中,然后从主数据库中删除 在这里,我面临

我有一个java项目,它被打包成jar并运行。代码与两个数据库交互,一个主数据库和一个辅助数据库。表X存在于具有相同结构的主数据库和辅助数据库中

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

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

在这里,我面临两个问题:

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

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


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

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

假设您的数据库操作比在一个小数据库中插入一个简单字符串要复杂得多,那么您可以将查询作为纯文本插入数据库中,并在执行时将其删除。这样,如果有任何东西在此过程中崩溃,您可以恢复查询队列。队列本身变得持久化。。。我们可以这样做:

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


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

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

假设您的数据库操作比在一个小数据库中插入一个简单字符串要复杂得多,那么您可以将查询作为纯文本插入数据库中,并在执行时将其删除。这样,如果有任何东西在此过程中崩溃,您可以恢复查询队列。队列本身变得持久化。。。我们可以这样做:

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


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

比如Linux或Windows上的
cron
任务调度程序?比如Linux或Windows上的
cron
任务调度程序?