2011-06-26 279 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