在一个打开的事务中,创建一个非事务性的顶点类型会关闭之前打开的数据库。以下示例引发异常:
public class OrientDBTest {
public static void main(String[] args) {
final String url = "plocal:/Users/d022051/tmp/orientdbtest";
final OrientGraphFactory factory = new OrientGraphFactory(url);
final OrientGraph graphTx = factory.getTx();
final ODatabaseDocumentTx documentTx = graphTx.getRawGraph();
final OrientGraphNoTx graphNoTx = factory.getNoTx();
graphTx.begin();
OrientVertexType sequenceClassType = graphNoTx.createVertexType("Sequence");
sequenceClassType.createProperty("No", OType.LONG).setMin("0").setDefaultValue("0");
sequenceClassType.createProperty("Name", OType.STRING);
OSQLSynchQuery<ODocument> selectSequenceCommand = new OSQLSynchQuery<>("select from Sequence where Name = 'GLOBAL'");
List<ODocument> sequences = documentTx.query(selectSequenceCommand);
if (sequences.isEmpty()) {
graphTx.addVertex("class:" + "Sequence", "Name", "GLOBAL");
}
graphTx.shutdown();
}
}
异常说&#34;当前数据库未在当前线程上打开&#34;。如果在创建顶点类型之后向下移动了graphTx.begin()语句,那么一切都很好。因此graphNoTx命令正在关闭documentTx的数据库。我假设原因是当事务仍然打开时无法完成模式更改,因此事务被隐式关闭。但是,实际上事务仍处于打开状态,并且使用graphTx的后续命令成功:
public class OrientDBTest {
public static void main(String[] args) {
final String url = "plocal:/Users/d022051/tmp/orientdbtest";
final OrientGraphFactory factory = new OrientGraphFactory(url);
final OrientGraph graphTx = factory.getTx();
final ODatabaseDocumentTx documentTx = graphTx.getRawGraph();
final OrientGraphNoTx graphNoTx = factory.getNoTx();
graphTx.begin();
OrientVertexType sequenceClassType = graphNoTx.createVertexType("Sequence");
sequenceClassType.createProperty("No", OType.LONG).setMin("0").setDefaultValue("0");
sequenceClassType.createProperty("Name", OType.STRING);
graphTx.addVertex("class:" + "Sequence", "Name", "GLOBAL");
graphTx.shutdown();
}
}
这样运行没有错误。这看起来很奇怪?是什么原因?
答案 0 :(得分:1)
@ wolf4ood是对的。在您的代码中,您创建了附加了新数据库的事务图实例,并使该数据库处于活动状态final OrientGraph graphTx = factory.getTx();
,然后激活
通过调用final OrientGraphNoTx graphNoTx = factory.getNoTx();
,然后使用活动的非tx图数据库,尝试在非活动数据库上启动事务,并且属于tx-instance的非数据库实例与新数据库实例(与第一个实例不同)曲线图。
如何避免这种情况。在获取任何图形实例factory.setupPool(5, 15)
之前执行以下代码非常简单。此代码将创建数据库池。池具有以下功能 - 对于相同的数据库URL和相同的线程,将返回相同的数据库实例(无论您是否获取事务图表都无关紧要。)