2011-06-26 223 views
0

我想知道爲我的Java servlet加載驅動程序的「正確」方式是什麼。JDBC/Connectorj:何時加載驅動程序?

目前,我有一個InitializeDrivers()函數,在我的應用程序開始時調用。

public static boolean InitializeDrivers() 
{ 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     return true; 
    } catch (ClassNotFoundException ex) { 
     // log error 
     return false; 
    } 
} 

之後,我繼續根據接收到的HTTP請求執行我的各種請求/插入到數據庫。但是,由於我的servlet每秒可以接收數百個請求,因此每個請求都會調用一次InitializeDrivers()。

這是做到這一點的正確方法,還是有辦法只加載驅動程序一次?

回答

2

當您在servlet中使用數據庫時,最好讓servlet容器通過連接池管理數據庫連接,而不是直接在servlet中獲取數據庫連接。

打開到數據庫服務器的連接是一個相對較慢的操作。另外,數據庫可以同時處理的連接數量是有限的。每次需要訪問數據庫時,當您打開數據庫連接時,您的應用程序將會很慢並且不可擴展。另外,數據庫連接不是線程安全的,因此您無法將數據庫連接存儲在servlet的靜態成員變量中,並且每次都使用它。

連接池爲您管理多個打開的連接(這樣您不必在每次需要訪問數據庫時都打開連接),並管理同時打開的連接數。例如,在Apache Tomcat中,您可以對其進行配置,以便通過JNDI查找javax.sql.DataSource對象,然後使用該對象從中獲取Connection對象。

此頁解釋瞭如何配置Tomcat和你的servlet使用DataSource

JNDI Datasource HOW-TO

如果你不想這樣做,你要繼續使用您的servlet的數據庫連接(我不推薦),那麼你可以在你的servlet靜態初始化塊加載驅動程序:

public class MyServlet extends HttpServlet { 
    static { 
     Class.forName("com.mysql.jdbc.Driver"); 
    } 

    // ... 
} 

注意,在JDBC 4.0,明確的加載驅動程序不再是必需的; JDBC將自動查找驅動程序,只要它們在類路徑中。

+0

這是一個很好的答案,謝謝! – Mathieu

+0

我開始玩連接池,這讓我想到另一個問題。如果你不介意再次分享你的專業知識:http://stackoverflow.com/questions/6500452/jdbc-connectorj-understanding-connection-pooling :) – Mathieu