可能重复:
Java:异步数据库写入的任务执行器?
我在内存中有一个数据对象映射,我需要能够非常快速地对其进行读写。我希望这些对象在进程重新启动时保持不变,因此我希望将它们存储在数据库中。
由于我不希望任何数据库插入或更新会减慢我的运行时间,因此我希望它们立即在内存中完成,然后与数据库异步完成。(如果进程崩溃并且丢失了一点数据,我什至可以接受。)
是否有“开箱即用”具有这种能力的 Java 工具(最好是开源的)?这可以用 Hibernate 轻松完成吗?
可能重复:
Java:异步数据库写入的任务执行器?
我在内存中有一个数据对象映射,我需要能够非常快速地对其进行读写。我希望这些对象在进程重新启动时保持不变,因此我希望将它们存储在数据库中。
由于我不希望任何数据库插入或更新会减慢我的运行时间,因此我希望它们立即在内存中完成,然后与数据库异步完成。(如果进程崩溃并且丢失了一点数据,我什至可以接受。)
是否有“开箱即用”具有这种能力的 Java 工具(最好是开源的)?这可以用 Hibernate 轻松完成吗?
正如我在评论中所说,如果您需要异步写入并且不想使用休眠或 ehcache:
Runnable:在 Java 中实现异步处理的唯一方法是通过扩展 Runnable 的简单类:
public class AsyncDatabaseWriter implements Runnable {
private LinkedBlockingQueue<Data> queue = ....
private volatile boolean terminate = false;
public void run() {
while(!terminate) {
Data data = queue.take();
// write to database
}
}
public void ScheduleWrite(Data data) {
queue.add(data);
}
}
还在这里说明:Java:用于异步数据库写入的任务执行器?
分布式工作人员:如果您想在系统中引入更多移动部件,那么您可以尝试 java 替代分布式任务队列,如celery:hazelcast或octobot。这将需要一个消息层,其间将充当队列,并且工作人员将为您完成写入数据库的任务。这看起来有点矫枉过正,但又取决于您的用例和您想要使用应用程序的规模。我做了一些非常相似的事情,我有一个用例以异步方式写入 DB,所以我选择了 celery (python)。示例实现可以在这里找到:artemis
考虑使用缓存后写入,例如在EhCache中:
[...] 将数据写入缓存,而不是将数据同时写入数据库,后写缓存将更改的数据保存到队列中,并让后端线程稍后进行写入。因此,缓存写入过程可以在不等待数据库写入的情况下继续进行,从而更快地完成。任何已更改的数据最终都可以持久化到数据库中。同时,从缓存中读取的任何内容仍将获得最新数据。
不幸的是,我不知道 write behind 如何以及是否与 Hibernate 集成(不这么认为)。
在hibernate中,您选择何时将数据持久化到数据库中,您主要使用proxy
对象(您可以在内存中保存和操作),并且save
每当您想在数据库中插入或更新时调用方法。