OrientDB 和 PostgreSQL JDBC 驱动程序发生冲突(InvocationTargetException):除了 JDBC 之外,是不是有一个包含所有内容的 OrientDB JAR
Posted
技术标签:
【中文标题】OrientDB 和 PostgreSQL JDBC 驱动程序发生冲突(InvocationTargetException):除了 JDBC 之外,是不是有一个包含所有内容的 OrientDB JAR?【英文标题】:OrientDB and PostgreSQL JDBC drivers are ***ing (InvocationTargetException): is there an OrientDB JAR with everything except JDBC?OrientDB 和 PostgreSQL JDBC 驱动程序发生冲突(InvocationTargetException):除了 JDBC 之外,是否有一个包含所有内容的 OrientDB JAR? 【发布时间】:2015-12-11 06:32:24 【问题描述】:我的应用程序将 OrientDB 和 PostgreSQL 数据库用于不同的目的。
以前它们似乎可以共存,但今天我的代码停止了工作。调试时,似乎 OrientDB 驱动程序正在尝试连接到我的 PostgreSQL 数据库,而我期望 PostgreSQL 驱动程序连接。
这是事件的顺序:
-
OrientDB 连接已建立(使用 OrientGraphFactory.setupPool()),事务已启动。
在 PostgreSQL 数据库上进行连接尝试,尝试创建连接对象时出错。
这是创建 PostgreSQL 连接的代码段:
Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:postgresql://" + [...]);
return connection;
在 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 驱动程序似乎发生了冲突。
在这种情况下,我实际上并不需要 OrientDB 的 JDBC 功能。但是,我找不到不包含 JDBC 的 OrientDB JAR。主页允许您下载 JDBC-all 或 JDBC-only。在哪里可以找到将所有依赖项捆绑到一个 JAR 中但没有 JDBC 的 JAR?
【问题讨论】:
东方的哪个版本?据我了解,您使用的是胖罐,对吗? @a_horse_with_no_name 您应该提交您的评论作为答案。我试过了,效果很好。 @RobertoFranchini 使用 OrientDB 2.1.6,我正在使用下载页面中的 JDBC-all JAR。我认为那是胖 JAR。 【参考方案1】:这可能不是驱动程序本身造成的,而是DriverManager
“混淆”了哪个驱动程序处理哪个 URL。
您可以通过直接向驱动程序请求连接来绕过DriverManager
:
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");
对于当前的 Java 和驱动程序版本不再是必需的。
【讨论】:
【参考方案2】:我在这里解决了问题:
https://github.com/orientechnologies/orientdb/commit/8e0f4bed41999cf68ae9de229b3ff6a4260813da
对DriverManager如何注册驱动,然后调用getConnection方法有误解。
解决方案。 我的建议是根本不要使用 orientdb-jdbc-all jar。如果您不需要使用嵌入在您的应用程序中的 orient 并通过 JDBC 访问它,那么它真的太大了。
相反,使用你的依赖管理框架(maven,gradle?)来导入orient jars,如果你需要与远程数据库交互,也许只有orientdb-client,如果你需要在你的应用程序中嵌入orient,也许更多。
如果您需要通过 JDBC 与远程 Orient Server 交互,请仅使用 che orientdb-jdbc。但是你需要固定的,所以你应该从源代码构建它,或者等待下一个 2.1.8 版本。
如果您想继续使用 jdbc fat jar,您可以再次从源代码构建它,或者您可以等待下一个修补程序版本 (2.1.8)。
希望对您有所帮助, 最好的问候
【讨论】:
我知道这很蹩脚,但目前没有使用任何管理框架(maven、gradle)。因此,使用包含所有依赖项的 JAR 对我来说确实是最简单的方法。话虽这么说,快速修复很棒。但是现在,我必须将 @a_horse_with_no_name 的答案标记为正确的答案,因为它可以立即解决我的问题。但我会鼓励 OrientDB 团队为像我这样的用户发布一个“简单客户端”JAR 以及提供的其他两个 JAR 包。 我了解您的需求,但是即使没有 JDBC 层,fat jar 也会非常大。里面有很多东西,即使我们尽最大努力减少第三方依赖。您可能会遇到类加载问题,龙肯定会吃掉您的 CPU :)。我的建议是使用 dep 框架,只使用你需要的东西。以上是关于OrientDB 和 PostgreSQL JDBC 驱动程序发生冲突(InvocationTargetException):除了 JDBC 之外,是不是有一个包含所有内容的 OrientDB JAR的主要内容,如果未能解决你的问题,请参考以下文章
请任何人告诉我 Spring 批处理是不是支持 OrientDb