0

虽然我已经找到了这个问题的解决方案,但我想知道为什么它会这样工作。

我创建了一个实现 ServletContextListener 的类,并将一个对象设置为上下文属性,该对象旨在构建一个可用于所有应用程序的 java.sql.Connection (MySQL DBMS)。

正如 Java 教程所说,在 JDBC 4.0 发布之后,不再需要调用 Class.forName("...") 来初始化特定的驱动程序。

对于 JavaSE 项目是这样,但对于 Web 应用程序却不是这样。

例如,当我调用 createStatement() 时,Container 会抛出 NullPointerException,因为 java.sql.Connection 不存在。因此,我在 Connection "setter" 之上添加了 Class.forName("...") 并且它完美地工作。

注意:我使用 Netbeans。包含此示例的特定项目已将最新的 mysql-connector-java-5.1.21-bin.jar 设置为其库之一。

谢谢。

4

1 回答 1

1

我创建了一个实现 ServletContextListener 的类,并将一个对象设置为上下文属性,该对象旨在构建一个可用于所有应用程序的 java.sql.Connection (MySQL DBMS)。

馊主意。您的 Web 应用程序现在不仅与 DB 具有线程不安全的交互,而且当 MySQL 决定回收连接时,您的 Web 应用程序也会在运行约 8 小时后崩溃,因为它已打开太久。不要那样做。使用连接池,只需按照标准 JDBC 习惯编写 JDBC 代码,即在尽可能短的范围内打开和关闭所有资源。


正如 Java 教程所说,在 JDBC 4.0 发布之后,不再需要调用 Class.forName("...") 来初始化特定的驱动程序。

对于 JavaSE 项目是这样,但对于 Web 应用程序却不是这样。

如果将包含该/META-INF/services/java.sql.Driver文件的 JDBC 4.0 兼容驱动程序 JAR 文件放置在/WEB-INF/libwebapp 的文件夹中,而不是其他位置,那么对于 Web 应用程序也是如此。


例如,当我调用 createStatement() 时,Container 会抛出 NullPointerException,因为 java.sql.Connection 不存在。因此,我在 Connection "setter" 之上添加了 Class.forName("...") 并且它完美地工作。

容器不可能抛出这个特定的异常。更有可能是您自己的代码做到了。顺便说一句,这个异常被抛出而不是 a 的事实SQLException: no suitable driver也表明您抑制了任何捕获的SQLException过程DriverManager#getConnection()并继续代码流,而不是抛出该异常和/或以某种方式中止代码流。这反过来也是一个坏主意。如果您绝对无法继续代码流,请不要抑制异常。

于 2012-08-15T13:44:26.067 回答