为啥 JDBC 驱动程序调用在 Tomcat 中有效,但在 JBOSS 中无效

Posted

技术标签:

【中文标题】为啥 JDBC 驱动程序调用在 Tomcat 中有效,但在 JBOSS 中无效【英文标题】:Why JDBC driver call works in Tomcat but not in JBOSS为什么 JDBC 驱动程序调用在 Tomcat 中有效,但在 JBOSS 中无效 【发布时间】:2012-09-05 23:03:37 【问题描述】:

我有一个应用程序通过 Tomcat 使用DriverManager 中的以下方法连接到数据库

DriverManager.getConnection(url, user,password);

在 Tomcat 中可以正常工作,完全没有问题。

但是当我将同一个应用程序移植到 JBOSS 时,连接总是返回 NULL

我有一些要求会阻止我通过使用DriverManager.getConnection(url) 访问JNDI 资源来建立JDBC 连接;

有谁知道为什么会发生这种情况以及我该如何解决?

这是我收到的堆栈跟踪.....

java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:419)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:536)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:228)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at TestSterlingConnection.getStrelingDBDetails(TestSterlingConnection.java:48)
    at TestSterlingConnection.makeCall(TestSterlingConnection.java:95)
    at TestSterlingConnection.doGet(TestSterlingConnection.java:77)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)

【问题讨论】:

【参考方案1】:

可能是因为您的类路径中没有合适的 JDBC 驱动程序。驱动程序现在使用ServiceLoader (META-INF/services) 机制自动注册自己。所以它只需要在类路径上。 DriverManager.getConnection 扫描已注册的驱动程序以找到与 url 模式匹配的驱动程序(即 oracle、postgres 等)。您的 Tomcat 实例可能在 lib 目录之一中有一个 jdbc jar 文件。

【讨论】:

我相信你是正确的,因为 jdbc jar 文件位于我正在部署的 war 文件中的 lib 目录中。你知道我应该把jar文件放在哪里吗?我了解不应修改 JBOSSPATH/lib。 不熟悉 JBOSS,但是搜索“在 JBOSS 上安装 jdbc 驱动程序”会发现类似 this 的链接,建议将驱动程序放在这里:jboss-as/server//lib 可以还可以查看ServiceLoader 中的编码器示例,以创建一个 bean 来遍历所有已注册的驱动程序并记录它找到的内容。然后你就知道有什么没有了。 实际上驱动程序已经在 appconfig/lib 文件夹中,所以驱动程序不是问题。 我添加了显示已找到驱动程序的堆栈跟踪。 是同一个版本的驱动吗? JDBC4 驱动程序能够自行注册。【参考方案2】:

我通过在容器外的这个盒子上执行相同的调用来消除 JBOSS。当我这样做时,我会收到相同的错误消息,这使我相信此问题是由某些网络配置引起的。我现在正在上报负责维护此服务器的管理员。

非常感谢!!非常感谢您的帮助 glen。

【讨论】:

以上是关于为啥 JDBC 驱动程序调用在 Tomcat 中有效,但在 JBOSS 中无效的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 7强制注销了JDBC Driver,为啥?

怀疑 Jdbc 和 Tomcat 的内存泄漏

在 Tomcat7 中使用 JDBC 连接池进行事务处理

为啥我的程序运行一段时间后就没反应了,Tomcat也没报错,但是重新启动Tomcat后程序又能正常运行?

JDBC连接mysql导入jar包后为啥没反应啊

为啥 DB2 Type 4 JDBC Driver 正在寻找本机库 db2jcct2?