【问题标题】:Loading JDBC driver加载 JDBC 驱动程序
【发布时间】:2011-08-24 22:17:30
【问题描述】:

我听说加载 JDBC 驱动程序的首选方法是:

Class.forName(driverName);

我知道这更适合多个驱动程序之间的动态决策,可能从 XML 配置文件或用户输入中读取。我很好奇的是,调用这个语句是如何将指定的驱动程序加载到我们甚至没有在任何地方存储生成的“类”对象的环境中的。 JavaDocs 条目说:

public static Class forName(String className)
                 throws ClassNotFoundExceptionReturns 

返回与给定字符串名称的类或接口关联的 Class 对象

那么,Java 开发者是如何通过这句话来促成驱动对象的存在的呢?

【问题讨论】:

标签: java jdbc


【解决方案1】:

Class#forName() 运行 static initializers(你知道,static 适用于类,而不适用于实例)。 JDBC 驱动实现should 在静态初始化器中注册自己。

public class SomeDriver implements Driver {

    static {
        DriverManager.registerDriver(new SomeDriver());
    }

}

请注意,存在错误的 JDBC 驱动程序,例如 org.gjt.mm.mysql.Driver,它会在构造函数中错误地注册自身。这就是为什么您需要在这些驱动程序之后拨打newInstance() 以让他们自行注册。

【讨论】:

  • 我明白了,先生。谢谢。一路最佳答案:)
  • @BalusC,为什么我们需要使用 Class.forName 来运行静态初始化程序?如果我们直接使用SomeDriver,例如如果我们已经有它的一个实例,或者我们直接调用SomeDriver.StaticMethod,那不就已经确保调用静态初始化器了吗?
  • @Pacerier:因为你不想依赖SomeDriver(即你不想在代码中的任何地方使用import)。这样,您的代码可以跨各种 JDBC 驱动程序移植,而无需在每次您(或最终用户!)切换驱动程序或数据库时更改它。相关:stackoverflow.com/q/7550612
  • @BalusC,我的意思是如果在代码的某个地方,它已经做了SomeDriver.StaticMethod,或new SomeDriversome_driver.Method,那么为什么我们需要使用Class.forName来运行静态初始化程序?
  • @Pacerier:您的代码有问题。您确实不需要自己通过Class#forName() 显式加载类(前提是在调用getConnection() 之前加载了类)。
猜你喜欢
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2013-03-03
  • 2015-10-10
  • 2017-05-17
  • 2017-01-15
  • 1970-01-01
相关资源
最近更新 更多