我最开始使用的信息中心里面提供的连接池例子,每次都使用ds.getConnection(); 得到一个连接,然后再去得到一个CollectionSpace然后是Collection。这样做并发更新没有问题
但是我认为每次操作要要去重新取space和collectoin,然后再做操作太麻烦了,所以我把pool改进了一下:
private static ConcurrentLinkedQueue ques=new ConcurrentLinkedQueue();
ds = new SequoiadbDatasource(urls, "", "", nwOpt, dsOpt); // 创建连接池
sdb=ds.getConnection();
dbSpace=sdb.getCollectionSpace("test");
for(int i=0;i
ques.add(dbSpace.getCollection("test"));
}
我建了一个队列ques,然后从一个是sdb连接里面创建了100个collection对象放进这个队列里面,我的初衷是这样就可以避免每次连接后都去创建space和collection,我直接都创建好了放进一个队列里面,直接用就可以了。
从队列里面得到和释放collectiond的方法是
public static DBCollection getTestCollection(){
return ques.poll();
}
public static void releaseTest(DBCollection dbc){
ques.add(dbc);
}
然后我写了段并发的测试代码,单次的操作如下:
String[][] objs = {
{ "{$set:{\"version\":\"1.1\"}}",
"{_id:{$oid:\"54d9854089fa49f200bb259b\"}}" },
{ "{$set:{\"description\":\"1.2\"}}",
"{_id:{$oid:\"54d9854089fa49f200bb259b\"}}" },
{ "{$set:{\"tag\":\"1.2\"}}",
"{_id:{$oid:\"54d9854089fa49f200bb259b\"}}" },
{
"{$set:{\"class1.class2.class3.class4.class5.class6.class7.class8.name\":\"passed\"}}",
"{_id:{$oid:\"54d9891489fa9eee1510ec4e\"}}" },
{
"{$set:{\"pageDetail.nodes.$1.output\":\"A001\"}}",
"{ \"$and\": [ { \"_id\": { \"$oid\": \"54d9854089fa49f200bb259b\" } },{\"pageDetail.nodes.$1\":{\"$elemMatch\":{\"nodeId\": \"10000\" } }} ] }" } };
DBCollection dbc=SequoiaDBPool.getTestCollection();
System.out.println("DBCollection"+dbc);
for (int i = 0; i < objs.length; i++) {
long start = System.currentTimeMillis();
dbc.update(objs[i][1], objs[i][0], null);
System.out.println("time="+(System.currentTimeMillis()-start));
}
SequoiaDBPool.releaseTest(dbc);
然后拿10个线程并发去跑这段代码,后面报错
Exception in thread "Thread-5" com.sequoiadb.exception.BaseException: Invalid size
Exception Detail:
at com.sequoiadb.util.SDBMessageHelper.msgExtractReply(SDBMessageHelper.java:621)
at com.sequoiadb.base.DBCollection._update(DBCollection.java:1682)
at com.sequoiadb.base.DBCollection.update(DBCollection.java:563)
at test.com.legjq.gan.DBColRun.run(DBColRun.java:40)
Exception in thread "Thread-3" Exception in thread "Thread-8" java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Unknown Source)
at java.nio.HeapByteBuffer.getInt(Unknown Source)
at com.sequoiadb.util.SDBMessageHelper.msgExtractReply(SDBMessageHelper.java:618)
at com.sequoiadb.base.DBCollection._update(DBCollection.java:1682)
at com.sequoiadb.base.DBCollection.update(DBCollection.java:563)
at test.com.legjq.gan.DBColRun.run(DBColRun.java:40)
Exception in thread "Thread-1" Exception in thread "Thread-2" java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Unknown Source)
at java.nio.HeapByteBuffer.getInt(Unknown Source)
at com.sequoiadb.util.SDBMessageHelper.msgExtractReply(SDBMessageHelper.java:618)
at com.sequoiadb.base.DBCollection._update(DBCollection.java:1682)
at com.sequoiadb.base.DBCollection.update(DBCollection.java:563)
at test.com.legjq.gan.DBColRun.run(DBColRun.java:40)
Exception in thread "Thread-9" Exception in thread "Thread-4" java.nio.BufferUnderflowException
能帮忙看看是哪里的问题吗?