javaorientdbgraph-databasesorientdb3.0

Connecting to an embedded OrientDB server in Java


I'm looking to run a Java process on several machines, each of which will need to start a local OrientBD server, load a graph, perform our processes, then close. As such, I need to be able to embed the OServer start process from within Java.

There is plenty of advice about how to do so, including SA questions, however most seem to be out of date (so please don't mark this as a duplicate prematurely). The most directly relevant seems to be this, however it doesn't work - at least for me. With the below code, I get the subsequent error:

    try {
        final OServer server = OServerMain.create();
        server.startup(server.getClass().getResourceAsStream("/orientdb-server-config.xml"));
        server.activate();
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(-1);
    }

2021-12-07 21:47:39:323 INFO  Loading configuration from input stream [OServerConfigurationLoaderXml]
2021-12-07 21:47:39:633 INFO  OrientDB Server v3.2.3 (build dc98198215aa57baf29b32adb657dc3733acdb55, branch develop) is starting up... [OServer]java.lang.NullPointerException
    at com.orientechnologies.orient.core.Orient.onEmbeddedFactoryInit(Orient.java:957)
    at com.orientechnologies.orient.core.db.OrientDBEmbedded.<init>(OrientDBEmbedded.java:97)
    at com.orientechnologies.orient.core.db.OrientDBInternal.embedded(OrientDBInternal.java:119)
    at com.orientechnologies.orient.server.OServer.startupFromConfiguration(OServer.java:388)
    at com.orientechnologies.orient.server.OServer.startup(OServer.java:314)
    at ems.definitions.instance.Graph.<init>(Graph.java:47)

I am using OrientDB version 3.2.3; the 'ALL' .jar downloaded from here. Note that this jar does not contain the parameters file orientdb-server-config.xml, so I have downloaded it directly from the source GitHub.

Is there an issue with my specific implementation, my approach in general or with the default config file I'm using? I look forward to hearing your thoughts.


Solution

  • The issue was three-fold:

    1. I was using the 'ALL' .jar provided by the website. Instead I needed to use the libraries provided in the full source.
    2. I did not account for the fact that when the code failed, it did not delete the database it half-created, thus could not execute the code I tried to remedy. I had to implement a temporary fail-safe to drop the database prior to initialisation to avoid this.
    3. I was using the wrong(?) strategy in general.

    My working method is as below.

    orientDB = new OrientDB("embedded:/tmp/","admin","adminpwd", OrientDBConfig.defaultConfig());
    
    /** THIS IS VERY MUCH ONLY FOR LOCAL TESTING **/
    if(orientDB.exists(name))
        orientDB.drop(name);
    
    if(!orientDB.exists(name)) // if the database does not already exist, create it.
        orientDB.execute("create database " + name + " PLOCAL users ( admin identified by 'adminpwd' role admin)");
    db = orientDB.open(name, "admin", "adminpwd");