我正在评估几个NoSQL数据库,包括OrientDB。我是一个OrientDB新手,正在尝试编写一个强调OrientDB事务的多线程测试。
下面是代码(imho太长,无法包含在这里):https://github.com/PeterKnego/nosql-benchmark/blob/master/orientdb/src/main/java/net/nosql_bench/OrientDbSimpleTransact.java
这是一个简单的独立测试,它使用许多并行线程读取实体,增加number字段的值,然后它们保存实体,所有这些都在一个事务中。
它在一个实体上产生了很多争执--这就是全部的要点。它可以正常工作,大多数时候会检测到争用,并正确地回滚事务。
我在一个本地安装的OrientDB 2.0-rc2上进行了测试,客户端通过remote协议连接到它。
你知道为什么有时事务冲突会被检测到,而有时它们会通过吗?
发布于 2015-07-30 23:14:44
在您的情况下,我建议使用连接池。ThinkerPop应用编程接口包括用于文档和图形连接的工厂实现。每次创建新线程时,您可能都应该获取连接池的一个实例。
对于您拥有的文档
ODatabaseDocumentPool pool = new ODatabaseDocumentPool("plocal:/temp/mydb");
OrientGraph g = new OrientGraph(pool.acquire());对于图形数据库,它甚至更简单
OrientGraphFactory factory = new OrientGraphFactory("plocal:/temp/mydb").setupPool(1, 10);
OrientGraph txGraph = factory.getTx();我会尝试使用到数据库的池连接,以查看此错误是否仍然存在,并记得在使用完数据库实例后将其关闭。
查看此链接http://orientdb.com/docs/2.0/orientdb.wiki/Graph-Factory.html
https://stackoverflow.com/questions/28116787
复制相似问题