gpt4 book ai didi

java - 非事务性命令关闭 OrienttDB 中的数据库

转载 作者:行者123 更新时间:2023-12-01 11:07:04 25 4
gpt4 key购买 nike

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

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

异常显示“当前数据库未在当前线程上打开”。然而,如果在创建顶点类型后将 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();
}
}

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

最佳答案

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

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

关于java - 非事务性命令关闭 OrienttDB 中的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32838541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com