Java 在多线程应用程序中使用面向内存的数据库
我正在尝试在多线程应用程序中使用orientdb内存实例。我看过很多代码示例,但似乎并没有一个能涵盖这种情况。以下是我的测试代码: DbTest.javaJava 在多线程应用程序中使用面向内存的数据库,java,multithreading,orientdb,in-memory-database,Java,Multithreading,Orientdb,In Memory Database,我正在尝试在多线程应用程序中使用orientdb内存实例。我看过很多代码示例,但似乎并没有一个能涵盖这种情况。以下是我的测试代码: DbTest.java public class DbTest { public static void main(String [] args) { ODatabaseDocumentTx db = new ODatabaseDocumentTx("memory:MyDb").create(); Runnable myRu
public class DbTest {
public static void main(String [] args) {
ODatabaseDocumentTx db = new ODatabaseDocumentTx("memory:MyDb").create();
Runnable myRunnable = new MyRunnable(db);
Thread thread = new Thread(myRunnable);
thread.start();
}
}
MyRunnable.java
public class MyRunnable implements Runnable {
private ODatabaseDocumentTx db;
MyRunnable(ODatabaseDocumentTx db) {
this.db = db;
}
public void run() {
ODocument animal = new ODocument("Animal");
animal.field( "name", "Gaudi" );
animal.field( "location", "Madrid" );
animal.save();
}
}
这就产生了错误
线程“thread-3”com.orientechnologies.orient.core.Exception.ODatabaseException中出现异常:当前线程中未设置数据库实例。确保将其设置为:ODatabaseRecordThreadLocal.INSTANCE.set(db)
我读到我应该尝试使用连接池,但是连接池似乎不适用于内存数据库
ODatabaseDocumentTx db = ODatabaseDocumentPool.global().acquire("memory:MyDb", "admin", "admin");
线程“main”com.orientechnologies.orient.core.Exception.ostrageException中出现异常:无法在mode=rw的情况下打开本地存储“MyDb”
你知道这实际上应该如何工作吗?在开始之前尝试创建数据库
ODatabaseDocumentTx db = new ODatabaseDocumentTx("memory:MyDb").create();
然后使用线程中的池
ODatabaseDocumentTx db = ODatabaseDocumentPool.global().acquire("memory:MyDb", "admin", "admin");
ODatabaseDocumentPool
实例是线程安全的,可以重用。ODatabaseDocumentTx
不是线程安全的,只能由单个线程使用。
OrientDB API在这里有点难看,必须首先创建内存数据库,这在使用默认API时是不可能的。但是,在使用内存数据库时,池没有任何意义
因此,在您的示例中,最有效的方法是:
public class OrientTest {
static class MyRunnable implements Runnable {
@Override
public void run() {
// If using Java7+, use try-with-resources!
try (ODatabaseDocumentTx tx = getDatabase("memory:Test", "admin", "admin")) {
ODocument animal = tx.newInstance("Animal")
.field("name", "Gaudi")
.field("location", "Madrid");
tx.save(animal);
}
}
private ODatabaseDocumentTx getDatabase(String url, String userName, String password) {
ODatabaseDocumentTx tx = new ODatabaseDocumentTx(url);
// database is not open yet!
if (!tx.exists()) {
// this will create AND open the database!
// Default credentials are "admin"/"admin"
tx.create();
return tx;
}
return tx.open(userName, password);
}
}
public static void main(String[] args) {
new Thread(new MyRunnable()).start();
}
}
我使它成为一个静态方法,因此可以从任何地方调用它来加载db连接。唯一奇怪的行为是,当从构造函数调用
getDatabase()
时,它似乎什么都不做,除非它以前是在普通方法中调用的(不管是哪个线程)。我相信这是一个非常合理的解释,但不管它是如何起作用的。这也很好,回想起来,我应该意识到这就是这两个人相互作用的方式,谢谢。