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

时间:2012-11-18 06:48:41

标签: postgresql jdbc jboss7.x h2

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

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

转载如下:


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

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

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

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

jboss-as-cmt战争完美无缺,即我能够将客户添加到发票中。我可以psql进入db引擎,我可以看到所有的记录。我唯一的问题是我不能使用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和服务器端的新手。

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

感谢您的时间。


任何想法都非常感谢。感谢您的见解和时间。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

如果在类路径中同时包含h2和postgresql驱动程序,这也会导致问题。我不记得它是“第一个注册的”还是“最后一个注册的”,但是你从DriverManager获得的驱动程序将取决于装载罐的顺序。它引起了很多的悲痛,并且我养成了一直习惯于定义一个明确命名要使用的类路径的DataSource的习惯。对于只需要一次连接的一次性应用程序来说,这有点过分,但它消除了歧义。

至于特定问题,我只是将jar添加到java类路径中。我有一个小的bash shell脚本,它将十几个jar放到类路径上,它允许我连接到大量的数据库而没有问题。每次我需要更新其中一个驱动程序时,它都不需要重建h2 jar。