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)
因此,我们在循环中只能看到一个条目,其中“*********”表示它成功了,但其他条目失败了。 我要用游标来做这个吗