我正在使用MS SQL Server进行第三方持久性。我的目的是将数据从数据库加载到数据网格,执行一些计算(分布式)并在结束时将结果写回SQL Server。要处理的记录数是>因此,我不希望每个记录保留记录但是分批(例如,根据间隔或每X毫秒)。以下是我配置节点的方法:
ccfg.setReadThrough(true);
ccfg.setWriteThrough(true);
ccfg.setWriteBehindEnabled(true);
ccfg.setWriteBehindBatchSize(10000);
以下是执行计算的代码和要缓存的put
:
int i = 0;
for (ComputePOJO computeItem : computeItems) {
InvoiceItem invoiceItem = calcInvoiceItem();
InvoiceItemKey key = new InvoiceItemKey(invoiceId, contractItemId);
invoiceItem.setId(key);
invoiceItemCache.put(key, invoiceItem);
i++;
if (i % 1000 == 0) {
System.out.printf("> Computed %s InvoiceItems...%n", i);
}
}
如果我在put
调用上放置一个断点并在put调用之前和之后计算记录(SQL Server中的SELECT COUNT(*) FROM InvoiceItem
查询),我可以看到该记录是立即写入磁盘的,尽管启用了后写和配置,每10秒写一次。我也试过了putAsync
但结果相同。
我在这里缺少什么?
谢谢。
答案 0 :(得分:0)
我后来意识到CacheAtomicityMode设置为CacheMode.ATOMIC,更改为CacheAtomicityMode.TRANSACTIONAL并且不再逐行写入DB。