非事务性命令在OrienttDB中关闭数据库

时间:2015-09-29 07:49:23

标签: java orientdb

在一个打开的事务中,创建一个非事务性的顶点类型会关闭之前打开的数据库。以下示例引发异常:

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();
    }
}

这样运行没有错误。这看起来很奇怪?是什么原因?

1 个答案:

答案 0 :(得分:1)

@ wolf4ood是对的。在您的代码中,您创建了附加了新数据库的事务图实例,并使该数据库处于活动状态final OrientGraph graphTx = factory.getTx();,然后激活 通过调用final OrientGraphNoTx graphNoTx = factory.getNoTx();,然后使用活动的非tx图数据库,尝试在非活动数据库上启动事务,并且属于tx-instance的非数据库实例与新数据库实例(与第一个实例不同)曲线图。

如何避免这种情况。在获取任何图形实例factory.setupPool(5, 15)之前执行以下代码非常简单。此代码将创建数据库池。池具有以下功能 - 对于相同的数据库URL和相同的线程,将返回相同的数据库实例(无论您是否获取事务图表都无关紧要。)