虽然我已经找到了这个问题的解决方案,但我想知道它为什么会这样运作。
我已经创建了一个实现ServletContextListener的类,并且我将一个对象设置为一个对象,用于构建一个可用于所有应用程序的java.sql.Connection(MySQL DBMS)。
正如Java Tutorial所说,在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。
感谢。
答案 0 :(得分:1)
我创建了一个实现ServletContextListener的类,我将一个对象设置为一个对象,用于构建一个可用于所有应用程序的java.sql.Connection(MySQL DBMS)。
糟糕的主意。您的Web应用程序现在不仅与数据库进行了线程安全交互,而且当MySQL决定回收连接因为它已经打开太长时间后,您的Web应用程序也会在运行约8小时后崩溃。不要那样做。使用连接池,只需根据标准JDBC习惯用法编写JDBC代码,即打开和,尽可能缩短所有资源。
正如Java Tutorial所说,在JDBC 4.0发布之后,不再需要调用Class.forName(“...”)来初始化特定的驱动程序。
对于JavaSE项目来说这是真的,但对于Web应用程序来说却不是。
对于Web应用程序也是如此,如果包含/META-INF/services/java.sql.Driver
文件的JDBC 4.0兼容驱动程序JAR文件放在webapp的/WEB-INF/lib
文件夹中,而不是放在其他位置。
例如,当我调用createStatement()时,Container会抛出NullPointerException,因为java.sql.Connection不存在。因此,我在Connection“setter”的顶部添加了Class.forName(“...”),它可以完美地工作。
容器可能不可能抛出这个特殊的异常。它更可能只是你自己的代码才能做到这一点。顺便说一下,抛出此异常而不是SQLException: no suitable driver
的事实也表明您在SQLException
期间抑制了任何捕获的DriverManager#getConnection()
并继续代码流而不是抛出该异常和/或以某种方式中止代码流。这反过来也是一个坏主意。如果绝对无法继续代码流,请不要禁止异常。