ServletContextListener - 属性 - 设置java.sql.Connection对象

时间:2012-08-15 13:30:43

标签: java-ee servlets nullpointerexception database-connection servlet-listeners

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

我已经创建了一个实现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。

感谢。

1 个答案:

答案 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()并继续代码流而不是抛出该异常和/或以某种方式中止代码流。这反过来也是一个坏主意。如果绝对无法继续代码流,请不要禁止异常。