2017-12-04 1 views
1

타사 지속성을 위해 MS SQL Server를 사용하고 있습니다. 내 의도는 데이터베이스에서 데이터 그리드로 데이터를로드하고 일부 계산 (분산)을 수행 한 다음 그 결과를 SQL Server에 다시 작성하는 것입니다. 처리 할 레코드 수는 1 백만이 넘는 레코드이므로 레코드별로 저장되지만 일괄 처리 (예 : 간격 또는 X 밀리 초마다)가 필요하지 않습니다. 나는 put 호출에 중단 점을 넣으면write-through 및 write-behind를 활성화하지만 레코드 당 레코드가 계속 유지됩니다.

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); 
    } 
} 

하고 레코드를 계산 : 여기

ccfg.setReadThrough(true); 
ccfg.setWriteThrough(true); 
ccfg.setWriteBehindEnabled(true); 
ccfg.setWriteBehindBatchSize(10000); 

가 계산 및 캐시에 put을 수행하는 코드이다 : 여기가 내 노드를 구성한 방법 (SQL Server의 SELECT COUNT(*) FROM InvoiceItem 쿼리) put 호출 전후에 필기체를 사용 가능하게 설정하고 매 10 초마다 쓰기를 구성하더라도 해당 레코드가 즉시 디스크에 기록되었음을 알 수 있습니다. 나는 또한 putAsync로 시도했지만 같은 결과가 나타납니다.

무엇이 여기에 있습니까?

감사합니다.

+0

이상하게 보입니다. 세척 빈도와 세척 크기의 값을 늘려보십시오. 이 매개 변수를 구성하려면'CacheConfiguration # setWriteBehindFlushSize (int)'(기본값은 10240)와'CacheConfiguration # setWriteBehindFlushFrequency (long)'(기본값은 5 초)를 통해 적절한 값을 제공해야합니다. 전체 캐시 구성으로 질문을 업데이트 해주십시오. – sk0x50

+0

늦게 업데이트되었지만 캐시 구성이 자동 생성 된 코드에서 CacheAtomicityMode.ATOMIC으로 설정되었음을 알았습니다. CacheAtomicityMode.TRANSACTION으로 설정했는데 이제는 데이터베이스에 쓰기 전에 txn.commit까지 기다리고 있습니다. 고맙습니다. – aol

답변

0

나중에 CacheAtomicityMode가 CacheMode.ATOMIC으로 설정되고 CacheAtomicityMode.TRANSACTIONAL로 변경되었으며 더 이상 행별로 DB에 쓰지 않음을 알게되었습니다.

관련 문제