【问题标题】:JDBC/Connectorj: When to load drivers?JDBC/Connectorj:何时加载驱动程序?
【发布时间】:2011-06-26 13:38:38
【问题描述】:

我想知道为我的 Java servlet 加载驱动程序的“正确”方法是什么。

目前,我有一个 InitializeDrivers() 函数,我在应用程序开始时调用它。

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

完成后,我继续根据收到的 HTTP 请求对数据库执行各种请求/插入。但是,由于我的 servlet 每秒可以接收数百个请求,因此每个请求都会调用一次 InitializeDrivers()。

这是正确的方法吗,还是有办法只加载一次驱动程序?

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    当你在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 就会自动查找。

    【讨论】:

    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2011-08-22
    • 2011-04-26
    相关资源
    最近更新 更多