0

雖然我已經發現這個問題的解決方案,我不知道爲什麼是這樣工作的。的ServletContextListener - 屬性 - 設置java.sql.Connection對象

我已經創建了一個實現了ServletContextListener類和我設置爲上下文屬性旨在建立適用於所有的應用程序一個java.sql.Connection(MySQL的數據庫管理系統)的對象。

由於Java教程說,JDBC 4.0發佈之後,就沒有必要調用Class.forName(「...」)再初始化一個特定的驅動程序。

對於JavaSE的項目這是真的,但對於Web應用程序是不是雖然。

當我打電話的createStatement()例如,容器拋出的java.sql.Connection中不存在一個NullPointerException異常。因此,我在Connection「setter」的頂部添加了Class.forName(「...」),它完美地工作。

注:我使用NetBeans。包含此示例的特定項目已將其最新的mysql-connector-java-5.1.21-bin.jar設置爲其庫中的一個。

謝謝。

回答

1

我已經創建了一個實現了ServletContextListener類和我設置爲上下文屬性旨在建立適用於所有的應用程序一個java.sql.Connection(MySQL的數據庫管理系統)的對象。

壞主意。您的Web應用程序現在不僅與數據庫進行了線程安全交互,而且在MySQL運行約8小時後,因爲打開時間太長而決定收回連接,您的Web應用程序也會崩潰。不要這樣做。使用連接池並根據標準JDBC慣用法編寫JDBC代碼,即打開以儘可能最短的範圍關閉所有資源。


由於Java教程說,JDBC 4.0發佈之後,就沒有必要調用Class.forName( 「...」)再初始化一個特定的驅動程序。

對於JavaSE項目來說這是真的,但對於Web應用程序來說卻不是這樣。

這對於Web應用程序,以及是否包含/META-INF/services/java.sql.Driver文件中的JDBC 4.0兼容驅動程序JAR文件真正被放置在/WEB-INF/lib文件夾中的Web應用程序,而不是其他地方。


當我打電話的createStatement()例如,容器拋出的java.sql.Connection中不存在一個NullPointerException異常。因此,我在Connection「setter」的頂部添加了Class.forName(「...」),它完美地工作。

容器可能不可能拋出這個特殊的異常。這很可能只是你自己的代碼而已。順便說一下,拋出此異常而不是SQLException: no suitable driver的事實也表明,您在DriverManager#getConnection()期間禁止了任何捕獲的SQLException,並繼續執行代碼流,而不是拋出該異常和/或以某種方式中止代碼流。這反過來也是一個壞主意。如果絕對無法繼續執行代碼流,請勿抑制異常。

+0

謝謝你的完整答案。關於你所說的「壞主意」,我不打算將它用作官方應用程序,而是將ServletContext屬性作爲「JDBC」服務器來測試,就這些。你是對的。 Container自身不會拋出異常,但是由於我嘗試在Servlet之一中「拯救」的對象而引發了NullPointerException,我用「instanceof」測試了它自己產生的對象,答案是「null」... – LucDaher 2012-08-16 14:13:18

+0

我試過了關於將MySQL Connector/J JAR文件插入到我的應用程序WEB-INF/lib中的建議,但不幸的是NullPointerException又被拋出。順便說一下,我忘了提及我的應用程序Container是Apache Tomcat。注意:我已經檢查過JAR內容和文件夾META-INF/service,尊重「java.sql.Driver」。 – LucDaher 2012-08-16 14:40:00

+0

顯然這是一個Tomcat的特定問題。你在使用什麼Tomcat版本?也許這是一個在班級加載時根本沒有(正確)在JAR中考慮'/ META-INF/services'的老版本。 – BalusC 2012-08-16 14:58:50