OrientDB和PostgreSQL JDBC驱动程序相互冲突(InvocationTargetException):除了JDBC之外,还有OrientDB JAR吗?

OrientDB和PostgreSQL JDBC驱动程序相互冲突(InvocationTargetException):除了JDBC之外,还有OrientDB JAR吗?,postgresql,jdbc,orientdb,Postgresql,Jdbc,Orientdb,我的应用程序出于不同的目的同时使用OrientDB和PostgreSQL数据库 以前它们似乎可以共存,但今天我的代码停止工作了。调试后,当我希望PostgreSQL驱动程序连接时,OrientDB驱动程序似乎正在尝试连接到我的PostgreSQL数据库 以下是事件的顺序: 已建立OrientDB连接(使用OrientGraphFactory.setupPool()),事务已启动 在PostgreSQL数据库上尝试连接,尝试创建连接对象时出错 以下是创建PostgreSQL连接的代码段: Clas

我的应用程序出于不同的目的同时使用OrientDB和PostgreSQL数据库

以前它们似乎可以共存,但今天我的代码停止工作了。调试后,当我希望PostgreSQL驱动程序连接时,OrientDB驱动程序似乎正在尝试连接到我的PostgreSQL数据库

以下是事件的顺序:

  • 已建立OrientDB连接(使用OrientGraphFactory.setupPool()),事务已启动
  • 在PostgreSQL数据库上尝试连接,尝试创建连接对象时出错
  • 以下是创建PostgreSQL连接的代码段:

    Class.forName("org.postgresql.Driver");
    Connection connection = DriverManager.getConnection(
        "jdbc:postgresql://" + [...]);
    
    return connection;
    
    Driver drv = new org.postgresql.Driver();
    Properties props = new Properties();
    props.put("username", "foo_user");
    props.put("password", "database_password");
    Connection connection = drv.getConnection("jdbc:postgresql://dbhost/db_name", props);
    
    在DriverManager.getConnection()行抛出InvocationTargetException。下面是堆栈跟踪,清楚地表明OrientDB驱动程序正试图连接:

    Error on opening database 'jdbc:postgresql://[hostname]/[db_name]'
    com.orientechnologies.orient.core.exception.ODatabaseException: Error on opening database 'jdbc:postgresql://[hostname]/[db_name]'
        at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.<init>(ODatabaseDocumentTx.java:204)
        at com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.<init>(ODatabaseDocumentTx.java:168)
        at com.orientechnologies.orient.jdbc.OrientJdbcConnection.<init>(OrientJdbcConnection.java:62)
        at com.orientechnologies.orient.jdbc.OrientJdbcDriver.connect(OrientJdbcDriver.java:52)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
    
    打开数据库“jdbc:postgresql://[hostname]/[db_name]时出错”
    com.orientechnologies.orient.core.exception.ODatabaseException:打开数据库“jdbc:postgresql://[hostname]/[db_name]时出错
    在com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.(ODatabaseDocumentTx.java:204)
    在com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx.(ODatabaseDocumentTx.java:168)
    在com.orientechnologies.orient.jdbc.OrientJdbcConnection。(OrientJdbcConnection.java:62)
    位于com.orientechnologies.orient.jdbc.OrientJdbcDriver.connect(OrientJdbcDriver.java:52)
    位于java.sql.DriverManager.getConnection(DriverManager.java:664)
    位于java.sql.DriverManager.getConnection(DriverManager.java:247)
    
    实际上,JDBC驱动程序似乎正在发生冲突


    在这种情况下,我并不需要OrientDB的JDBC功能。但是,我找不到不包含JDBC的OrientDB JAR。主页允许您下载JDBC all或仅下载JDBC。哪里可以找到一个JAR,它将所有依赖项捆绑到一个JAR中,但没有JDBC?

    这可能不是由驱动程序本身造成的,而是由
    DriverManager
    对哪个驱动程序处理哪个URL感到“困惑”

    通过直接向驱动程序请求连接,可以绕过
    DriverManager

    Class.forName("org.postgresql.Driver");
    Connection connection = DriverManager.getConnection(
        "jdbc:postgresql://" + [...]);
    
    return connection;
    
    Driver drv = new org.postgresql.Driver();
    Properties props = new Properties();
    props.put("username", "foo_user");
    props.put("password", "database_password");
    Connection connection = drv.getConnection("jdbc:postgresql://dbhost/db_name", props);
    


    不相关,但是:
    Class.forName(“org.postgresql.Driver”)不再是必需的

    我在这里解决了这个问题:

    对于DriverManager如何注册驱动程序,然后调用getConnection方法,这是一个误解

    解决方案。 我的建议是根本不要使用orientdb jdbc all jar。如果您不需要在应用程序中使用orient embedded并通过JDBC访问它,那么它实在太大了

    相反,使用依赖关系管理框架(maven,gradle?)导入orient JAR,如果需要与远程数据库交互,可能只导入orientdb客户端,如果需要在应用程序中嵌入orient,可能会导入更多

    如果需要通过JDBC与远程Orient服务器交互,请仅使用che orientdb JDBC。但是您需要固定的版本,所以您应该从源代码构建它,或者等待下一个2.1.8版本

    如果您想继续使用JDBCFATJAR,您也可以立即从源代码构建它,或者等待下一个修补程序版本(2.1.8)

    希望这有帮助,,
    致以最诚挚的问候

    哪种版本的orient?据我所知,你使用的是脂肪罐,对吗?@a_horse_,没有名字,你应该提交你的评论作为答案。我试过了,效果很好。@RobertoFranchini使用Orientdb2.1.6,我使用的是下载页面上的JDBC all JAR。我认为这是个大罐子,我知道它很蹩脚,但目前还没有使用任何管理框架(maven,gradle)。因此,对我来说,使用一个包含所有依赖项的JAR确实是最简单的方法。话虽如此,快速修复的效果非常好。但现在,我必须用“没有名字的马”来标记@a_horse_是正确的答案,因为它立刻解决了我的问题。但是我鼓励OrientDB团队为像我这样的用户发布一个“简单客户端”JAR和另外两个JAR包。我理解您的需求,但是胖JAR,即使没有JDBC层,也会非常大。而且里面有很多东西,即使我们尽最大努力减少对第三方的依赖。您可能会遇到类加载问题,龙会吃掉您的CPU,当然:)。我的建议是使用dep框架,只使用您需要的。