Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多线程应用程序中使用面向内存的数据库_Java_Multithreading_Orientdb_In Memory Database - Fatal编程技术网

Java 在多线程应用程序中使用面向内存的数据库

Java 在多线程应用程序中使用面向内存的数据库,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

我正在尝试在多线程应用程序中使用orientdb内存实例。我看过很多代码示例,但似乎并没有一个能涵盖这种情况。以下是我的测试代码:

DbTest.java

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()
时,它似乎什么都不做,除非它以前是在普通方法中调用的(不管是哪个线程)。我相信这是一个非常合理的解释,但不管它是如何起作用的。这也很好,回想起来,我应该意识到这就是这两个人相互作用的方式,谢谢。