通过 jdbc 驱动程序和 h2console.war 连接到 postgresql

Posted

技术标签:

【中文标题】通过 jdbc 驱动程序和 h2console.war 连接到 postgresql【英文标题】:connecting to postgresql via jdbc driver and h2console.war 【发布时间】:2012-11-18 06:48:41 【问题描述】:

我使用 JBoss AS 7.1.1.Final 作为我的应用服务器。

我在 JBoss 社区用户论坛上发布了我的问题:question-here

转载如下:


在我的 MacBook Pro 上安装了 AS 7.1.1.Final。

下载了快速入门示例。能够成功部署和测试 helloworld、jboss-as-greeter 战争。

然后我设置了 postgresql 数据库引擎来尝试 jboss-as-cmt 示例。我能够编译和部署它。

一切都很好,除了一件事——我无法从应用服务器附带的 h2console web-app 连接到 postgresql 数据库。

jboss-as-cmt 战争完美运行,即我能够将客户添加到发票中。我可以 psql 进入数据库引擎,我可以看到所有的记录。我唯一的问题是我无法使用 h2console webapp 进入我创建的 jboss-as-cmt postgres 数据库。

我正在使用: 驱动程序类字段的“org.postgresql.Driver”。 JDBC URL 为“jdbc:postgresql://127.0.0.1:5432/jboss-as-cmt”。这与我在 Standalone-full.xml 配置文件中设置的 connection-url 值相同。 “sa”代表用户名和密码。

当我按下 h2console 应用程序上的“测试连接”按钮时,不幸的是我看到了 -

Class "org.postgresql.Driver" not found [90086-161]
org.h2.message.DbException: Class "org.postgresql.Driver" not found [90086-161]
    at org.h2.message.DbException.get(DbException.java:158)
    at org.h2.util.Utils.loadUserClass(Utils.java:429)
    at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:146)
    at org.h2.server.web.WebServer.getConnection(WebServer.java:653)
    at org.h2.server.web.WebApp.test(WebApp.java:839)
    at org.h2.server.web.WebApp.process(WebApp.java:215)
    at org.h2.server.web.WebApp.processRequest(WebApp.java:164)
    at org.h2.server.web.WebServlet.doGet(WebServlet.java:118)
    at org.h2.server.web.WebServlet.doPost(WebServlet.java:153)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930)
    at java.lang.Thread.run(Thread.java:680)
Caused by: org.h2.jdbc.JdbcSQLException: Class "org.postgresql.Driver" not found [90086-161]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
    ... 24 more
Caused by: java.lang.ClassNotFoundException: org.postgresql.Driver from [Module "com.h2database.h2:main" from local module loader @b4e29b (roots: /Users/avyayatek/Downloads/jboss-as-7.1.1.Final/modules)]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at org.h2.util.Utils.loadUserClass(Utils.java:424)
    ... 22 more

我能够建立从 jboss 管理控制台 (http://localhost:9990/console) 到数据源的成功连接。在数据源配置文件面板上,我将数据源的名称设置为“postgresDS”,将 jndi 设置为“java:jboss/postgresDS”。连接 URL 与我在 h2console 上使用的相同 - “jdbc:postgresql://127.0.0.1:5432/jboss-as-cmt”

我不知道为什么 h2console 没有连接到 postgresql 数据库引擎。它成功连接到 jboss-as-greeter 示例中使用的 h2 内存数据库。

我已将 JDBC 驱动程序放在 $JBOSS_HOME/modules/org/postgresql/main 文件夹中。在那里创建了 module.xml。在 ~/org/postgresql/ 文件夹中的 jar 中有一个 Driver.class 文件。我已修改 $JBOSS_HOME/standalone/configuration/standalone-full.xml 以添加与 postgresql 相关的数据源和驱动程序部分。

正如我所说,我可以构建 jboss-as-cmt 并进行部署,它可以按预期工作。如果我能让 h2console 连接到这个 postgresql 数据库,它会给我一些安宁。

总的来说,我是 JBoss 和服务器端的新手。

我附上了一些图片供参考。

感谢您的宝贵时间。


任何想法都受到高度赞赏。感谢您的见解和时间。

【问题讨论】:

如果您有问题,请在此处提出,不要链接到其他网站上的问题。 这很奇怪:Caused by: java.lang.ClassNotFoundException: org.postgresql.Driver from [Module "com.h2database.h2:main" from local module loader @b4e29b (roots: /Users/avyayatek/Downloads/jboss-as-7.1.1.Final/modules)]。 JBoss AS 7 尝试从 h2 数据库模块加载 PostgreSQL JDBC 驱动程序是没有意义的。也就是说,您为什么希望能够从 h2 控制台应用程序中使用 PgJDBC?不就是h2数据库吗? 无论如何,请阅读网站常见问题解答 (***.com/faq)。 -1,我同意@MarkRotteveel。您是 300 和 1 年会员,我希望您对这里的工作原理有所了解,并在提出问题时付出更多努力。 @CraigRinger 老实说,我不明白你怎么能断定我在发布问题之前没有做出任何努力或付出太多努力。你有权发表你的意见,但我要求你更明智一点。回到我的问题,我不认为 h2 控制台应用程序仅适用于 h2 数据库。为什么会有连接到其他数据库引擎的选项 - mysql、PostgreSQL、SQlite 等?在我与 JBoss AS 启动脚本一起使用的standalone-full.xml 配置文件中,有一个单独的部分定义了 postgres 数据源/驱动程序。我希望 h2console 应用程序能够加载适当的 JDBC 驱动程序,但它不是...... @CraigRinger H2 控制台工具可以连接到任何支持 JDBC API 的数据库。它不仅适用于 H2 数据库。我不知道它是如何与 JBoss 产品捆绑在一起的(我什至不知道它包含在其中)。 【参考方案1】:

首先,感谢@ThomasMueller,他的评论鼓励我进一步挖掘并找到实用的解决方案。还要感谢 JBoss 社区页面上的 Wolf-Dieter 为我指明了正确的方向。所以,我对@MarkRotteveel 的真诚建议是,在可信的论坛上发帖并没有什么坏处,当我们找到解决方案时,每个人都会受益。

这对我有用: 感谢source 的链接,我从源代码创建了 h2console,这一次,我将 postgres JDBC 驱动程序 jar 文件放在 WEB-INF/lib 文件夹中。现在,我可以使用 h2console 连接到 postgresql 数据库了。

快速入门附带的 h2console 应用在 WEB-INF/lib 文件夹中没有任何库 jar。相反,它指定 META-INF/MANIFEST.mf 文件中的依赖项。我很肯定在 JBoss 启动时加载了 h2 和 postgres 驱动程序 - 我可以看到日志。但是由于某种原因,这个应用程序只能识别 h2 驱动程序而无法识别 postgres 驱动程序。查看源文件,我相当肯定那里没有“硬编码”。所以,这对我来说仍然是个谜。

h2console 工具的替代品 - SQUirrel。

谢谢大家。希望这对某人有所帮助 - 不仅限于 SO。

【讨论】:

【参考方案2】:

驱动程序可以将自己注册为多个 JDBC 协议的处理程序。它可能已经改变,但在某一时刻,H2 会将自己注册为 jdbc:postgresql 的处理程序——这并非完全不合理,因为 H2 可以在 PostgreSQL 仿真模式下运行。如果您直接使用 DriverManager 会很好(因为它只需要 url),但如果您使用连接管理器(需要驱动程序类路径)会出现问题,因为驱动程序不是 org.postgresql.Driver。

如果您的类路径中同时包含 h2 和 postgresql 驱动程序,这也会导致问题。我不记得它是“第一个注册的”还是“最后一个注册的”,但是您从 DriverManager 获得的驱动程序将取决于 jar 的加载顺序。它引起了很多悲伤,也是我养成始终定义明确命名要使用的类路径的 DataSource 习惯的原因之一。一次性应用程序只需要一个连接,但它消除了歧义,这有点矫枉过正。

至于具体问题,我只是将 jars 添加到 java 类路径中。我有一个小的 bash shell 脚本,它将大约十几个 jar 放到类路径中,它允许我毫无问题地连接到大量数据库。它避免了每次我需要更新其中一个驱动程序时都需要重新构建 h2 jar。

【讨论】:

以上是关于通过 jdbc 驱动程序和 h2console.war 连接到 postgresql的主要内容,如果未能解决你的问题,请参考以下文章

使用 DataSource 通过 (Xerial) sqlite-jdbc 驱动程序连接到 SQLite

java之JDBC

JDBC的学习

Java 通过JDBC连接Mysql数据库

JDBC连接ORACLE

转Java 通过JDBC连接Mysql数据库的方法和实例图文说明