2

可能重复:
Java:异步数据库写入的任务执行器?

我在内存中有一个数据对象映射,我需要能够非常快速地对其进行读写。我希望这些对象在进程重新启动时保持不变,因此我希望将它们存储在数据库中。

由于我不希望任何数据库插入或更新会减慢我的运行时间,因此我希望它们立即在内存中完成,然后与数据库异步完成。(如果进程崩溃并且丢失了一点数据,我什至可以接受。)

是否有“开箱即用”具有这种能力的 Java 工具(最好是开源的)?这可以用 Hibernate 轻松完成吗?

4

3 回答 3

4

正如我在评论中所说,如果您需要异步写入并且不想使用休眠或 ehcache:

  1. 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:用于异步数据库写入的任务执行器?

  2. 分布式工作人员:如果您想在系统中引入更多移动部件,那么您可以尝试 java 替代分布式任务队列,如celeryhazelcastoctobot。这将需要一个消息层,其间将充当队列,并且工作人员将为您完成写入数据库的任务。这看起来有点矫枉过正,但又取决于您的用例和您想要使用应用程序的规模。我做了一些非常相似的事情,我有一个用例以异步方式写入 DB,所以我选择了 celery (python)。示例实现可以在这里找到:artemis

于 2012-10-07T22:00:13.853 回答
2

考虑使用缓存后写入,例如在EhCache中:

[...] 将数据写入缓存,而不是将数据同时写入数据库,后写缓存将更改的数据保存到队列中,并让后端线程稍后进行写入。因此,缓存写入过程可以在不等待数据库写入的情况下继续进行,从而更快地完成。任何已更改的数据最终都可以持久化到数据库中。同时,从缓存中读取的任何内容仍将获得最新数据。

不幸的是,我不知道 write behind 如何以及是否与 Hibernate 集成(不这么认为)。

于 2012-10-07T21:08:34.137 回答
1

在hibernate中,您选择何时将数据持久化到数据库中,您主要使用proxy对象(您可以在内存中保存和操作),并且save每当您想在数据库中插入或更新时调用方法。

于 2012-10-07T21:10:51.280 回答