OrientDB - 由连接池控制的JDBC驱动程序

时间:2016-01-19 20:49:55

标签: orientdb

我们正在将一些使用关系数据库的应用程序更改为OrientDB(2.1.9)。 这个事务将以小步骤完成,我们将首先从JDBC驱动程序方法开始,也许我们稍后将切换到本机实现。

我们有一个基于Spring Integration的应用程序,我们使用JDBC驱动程序从Oracle数据库更改为OrientDB。

数据库连接由Tomcat 8连接池管理,事务行为由Spring的事务管理器处理:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="driverClassName" value="com.orientechnologies.orient.jdbc.OrientJdbcDriver" />
            ...
</bean>             

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
</bean>

将数据库更改为OrientDB后,我们遇到以下错误:

  

com.orientechnologies.orient.core.exception.ODatabaseException:数据库实例未在当前线程中设置。确保设置它:ODatabaseRecordThreadLocal.INSTANCE.set(db);

关于多线程的OrientDB文档声明:

  

OrientDB支持对数据库的多线程访问。 ODatabase *和OrientGraph *实例不是线程安全的,因此您必须为每个线程获取一个实例,并且每个数据库实例每次只能在一个线程中使用。有关OrientDB如何管理并发的更多信息,请参阅并发。

     

由于v2.1 OrientDB不允许从同一个线程隐式使用多个数据库实例。在同一个线程中管理多个实例的任何尝试都必须针对您使用它的数据库实例BFORE显式调用方法db.activateOnCurrentThread()。

这提出了一个问题,因为所有数据库连接管理都由连接池处理(应该是这样)。 因此,为了实现OrientDB提出的解决方案,我必须能够访问底层的ODatabaseDocumentTx数据库,以便应用activateOnCurrentThread()方法。

为了能够做到这一点,我必须从JDBC驱动程序类和OrientJdbcConnection创建一个包装器。

在OrientJdbcConnection中,我通过使用Java Reflection:

获得了底层数据库
public class OrientJdbcConnectionWrapper extends OrientJdbcConnection {

     @Override
     public void commit() throws SQLException {

     final ODatabaseDocumentTx database = getPrivateDatabaseFieldByReflection();

     database.activateOnCurrentThread();

     super.commit();
}

JDBC Driver类包装器现在返回一个包装的连接:     公共类OrientJdbcDriverWrapper扩展了OrientJdbcDriver {

    public Connection connect(final String url, final Properties info) throws SQLException {
       if (!acceptsURL(url)) {
          throw new SQLException(DO_NOT_ACCEPT_URL_ERROR + url);
       }

       return new OrientJdbcConnectionWrapper(url, info);
    }

}

最后,连接池的配置现在使用包装的驱动程序:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="driverClassName" value="x.y.z.driver.orientdb.OrientJdbcDriverWrapper" />
</bean>

正如预期的那样,这很有效,但我并不完全确定这是正确的方法,因为我没有看到任何人遇到过这个问题。

另一方面,OrientDB文档确实建议在多线程环境中使用activateOnCurrentThread()。

1 个答案:

答案 0 :(得分:0)

OrientDB有自己的数据库池,可以轻松配置:

.class {
    color: yellow;

    &:hover {
        color: blue;
    }
    &[href] {
        color: white;

        &:hover {
            color: red;
        }
    }
}

注意:我通过其orient-jdbc驱动程序使用OrientDB。