java BerkeleyDB删除两条记录
如何在一个事务中删除两条记录 配置:java BerkeleyDB删除两条记录,java,transactions,berkeley-db,Java,Transactions,Berkeley Db,如何在一个事务中删除两条记录 配置: EnvironmentConfig myEnvConfig = new EnvironmentConfig(); StoreConfig storeConfig = new StoreConfig(); myEnvConfig.setReadOnly(readOnly); storeConfig.setReadOnly(readOnly); // If the environment is opened for write, then we want to
EnvironmentConfig myEnvConfig = new EnvironmentConfig();
StoreConfig storeConfig = new StoreConfig();
myEnvConfig.setReadOnly(readOnly);
storeConfig.setReadOnly(readOnly);
// If the environment is opened for write, then we want to be
// able to create the environment and entity store if
// they do not exist.
myEnvConfig.setAllowCreate(!readOnly);
storeConfig.setAllowCreate(!readOnly);
// Allow transactions if we are writing to the store.
myEnvConfig.setTransactional(!readOnly);
storeConfig.setTransactional(!readOnly);
// Open the environment and entity store
bklEnv = new Environment(envHome, myEnvConfig);
//bklEnv.openDatabase(null, envHome.getAbsolutePath(), myEnvConfig);
bklstore = new EntityStore(bklEnv, entryStore, storeConfig);
周期性地清除旧数据。在这里,我们通过从索引中获取firstKey()来清除数据:
public void clearOldDBData(Integer maxCount) throws DatabaseException {
TransactionConfig config = new TransactionConfijg();
config.setReadUncommitted(true);
Transaction txn = berkeleyDbEnv.getBklEnv().beginTransaction(null, config);
txn.setTxnTimeout(1000);
Long keyV = null;
try{
PrimaryIndex<Long,MemoryBTB> memoryBTBIndex =
berkeleyDbEnv.getBklstore().getPrimaryIndex(Long.class, MemoryBTB.class);
if(!memoryBTBIndex.sortedMap().isEmpty() && memoryBTBIndex.sortedMap().keySet().size() > maxCount){
for(int i = 0; i < memoryBTBIndex.sortedMap().keySet().size() - maxCount; i++){
log.trace(BERKELEYDB_CLEAR_DATA);
System.out.println("**************************************************");
PrimaryIndex<Long,MemoryBTB> memoryBTBIndexInternal =
berkeleyDbEnv.getBklstore().getPrimaryIndex(Long.class, MemoryBTB.class);
memoryBTBIndexInternal.delete(txn, memoryBTBIndexInternal.sortedMap().firstKey());
}
}
txn.commit();
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++");
}catch(DatabaseException dbe){
// one more time deleting
try {
Thread.sleep(100);
dataAccessor.getMemoryBTB().delete(txn, keyV);
txn.commit();
}catch(DatabaseException dbeInternal){
log.trace(String.format(TXN_ABORT, dbeInternal.getMessage()));
txn.abort();
} catch (InterruptedException e) {
e.printStackTrace();
throw dbe;
}
}
}
public void clearOldDBData(整数maxCount)引发DatabaseException{
TransactionConfig config=new TransactionConfijg();
config.setReadUncommitted(true);
事务txn=berkeleyDbEnv.getBklEnv().beginTransaction(null,config);
txn.设置TXNTIMEOUT(1000);
Long-keyV=null;
试一试{
PrimaryIndex MemoryBTIndex=
getBklstore().getPrimaryIndex(Long.class,MemoryBTB.class);
如果(!MemoryBTIndex.sortedMap().isEmpty()&&MemoryBTIndex.sortedMap().keySet().size()>maxCount){
对于(int i=0;i
堆栈跟踪:
[12/12 10:35:20] - TRACE - BerkeleyRepository - Berkeley DB clear data
**************************************************
[12/12 10:35:20] - TRACE - BerkeleyRepository - Berkeley DB clear data
**************************************************
[12/12 10:35:21] - TRACE - MemService - Berkeley DB JSON produce error: (JE 3.3.75) Lock expired. Locker 7752330 -1_Thread-295_ThreadLocker: waited for lock on database=persist#MemoryEntityStore#com.company.memcheck.persists.MemoryBTB LockAddr:1554328 node=333 type=READ grant=WAIT_NEW timeoutMillis=500 startTime=1386862520718 endTime=1386862521218
Owners: [<LockInfo locker="31510392 17395_Thread-295_Txn" type="WRITE"/>]
Waiters: []
com.sleepycat.util.RuntimeExceptionWrapper: (JE 3.3.75) Lock expired. Locker 7752330 -1_Thread-295_ThreadLocker: waited for lock on database=persist#MemoryEntityStore#com.com pany.memcheck.persists.MemoryBTB LockAddr:1554328 node=333 type=READ grant=WAIT_NEW timeoutMillis=500 startTime=1386862520718 endTime=1386862521218
Owners: [<LockInfo locker="31510392 17395_Thread-295_Txn" type="WRITE"/>]
Waiters: []
at com.sleepycat.collections.StoredContainer.convertException(StoredContainer.java:466)
at com.sleepycat.collections.StoredSortedMap.getFirstOrLastKey(StoredSortedMap.java:216)
at com.sleepycat.collections.StoredSortedMap.firstKey(StoredSortedMap.java:185)
at com.company.memcheck.repository.BerkeleyRepositoryImpl.clearOldDBData(BerkeleyRepositoryImpl.java:142)
at com.company.memcheck.service.MemServiceImpl.removeOldData(MemServiceImpl.java:305)
at com.company.memcheck.service.MemServiceImpl.access$3(MemServiceImpl.java:299)
at com.company.memcheck.service.MemServiceImpl$2.run(MemServiceImpl.java:129)
at java.lang.Thread.run(Thread.java:662)
[12/12 10:35:20]-跟踪-伯克利存储-伯克利DB清除数据
**************************************************
[12/12 10:35:20]-跟踪-伯克利存储-伯克利DB清除数据
**************************************************
[12/12 10:35:21]-TRACE-MemService-Berkeley DB JSON生成错误:(JE 3.3.75)锁已过期。Locker 7752330-1_Thread-295_ThreadLocker:waiting on database=persist#MemoryEntityStore#com.company.memcheck.persistens.MemoryBTB LockAddr:1554328 node=333 type=READ grant=WAIT_NEW timeoutMillis=500 startTime=1386825220718 endTime=13868222118
所有者:[]
服务员:[]
com.sleepycat.util.RuntimeExceptionWrapper:(JE 3.3.75)锁已过期。Locker 7752330-1_Thread-295_ThreadLocker:等待锁定数据库=持久化#MemoryEntityStore#com.company.memcheck.persistens.MemoryBTB LockAddr:1554328 node=333 type=READ grant=WAIT_NEW timeoutMillis=500 startTime=138686825220718 endTime=13868221218
所有者:[]
服务员:[]
位于com.sleepycat.collections.StoredContainer.convertException(StoredContainer.java:466)
在com.sleepycat.collections.StoredSortedMap.getFirstOrLastKey(StoredSortedMap.java:216)上
位于com.sleepycat.collections.StoredSortedMap.firstKey(StoredSortedMap.java:185)
在com.company.memcheck.repository.BerkeleyRepositoryImpl.clearOldDBData上(BerkeleyRepositoryImpl.java:142)
在com.company.memcheck.service.memserviceinpl.removeOldData(memserviceinpl.java:305)上
在com.company.memcheck.service.memserviceinpl.access$3(memserviceinpl.java:299)
在com.company.memcheck.service.memserviceinpl$2.run(memserviceinpl.java:129)上
运行(Thread.java:662)
因此,我们在循环中只能看到一个条目,其中“*********”表示它成功了,但其他条目失败了。
我要用游标来做这个吗