【问题标题】:JDBC connection- Class.forName vs Class.forName().newInstance?JDBC 连接 - Class.forName 与 Class.forName().newInstance?
【发布时间】:2011-06-06 03:09:35
【问题描述】:

想知道为什么Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver").newInstance(); 在我使用它们连接到数据库时都能正常工作。正确地,不是前者不应该工作,因为没有创建新实例。然而,它仍然有效。我使用的是 netbeans 6.9.1。感谢您的意见!

【问题讨论】:

    标签: mysql jdbc


    【解决方案1】:

    Class.forName("xxx") 不会创建到数据库的连接,它只是加载 JDBC 驱动程序并注册它,以便后续的DriverManager.getConnection(...) 调用可以工作。不需要自己实例化驱动程序。

    【讨论】:

    • 谢谢!最后一个 qn- 如果你实例化它,那么随后的 DriverManager.getConnection(..) 将不会再次重新实例化它,对吗?只有在第一步中没有实例化它才会这样做?
    • 我怀疑只是通过加载类,驱动程序管理器已经实例化它,由驱动程序中的静态块触发。老实说,我并不完全确定。如果你想使用你已经实例化的驱动程序(例如环绕它),你需要避免使用 DriverManager 来获取连接,或者使用 DriverManager 静态方法注册你自己的驱动程序实例。
    【解决方案2】:

    使用支持 jdbc 4.0 的驱动程序,您甚至不需要 Class.forName()。 驱动程序应该有内置的机制来动态加载自己, 当 DriverManager 查找它时。

    (参考:http://download.oracle.com/javase/6/docs/api/java/sql/DriverManager.html) DriverManager 方法 getConnection 和 getDrivers 已得到增强,以支持 Java 标准版服务提供者机制。 JDBC 4.0 驱动程序必须包含文件 META-INF/services/java.sql.Driver。此文件包含 java.sql.Driver 的 JDBC 驱动程序实现的名称。例如,要加载 my.sql.Driver 类,META-INF/services/java.sql.Driver 文件将包含以下条目:

    my.sql.Driver

    应用程序不再需要使用 Class.forName() 显式加载 JDBC 驱动程序。当前使用 Class.forName() 加载 JDBC 驱动程序的现有程序将继续工作而无需修改。

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 2011-01-06
      • 2011-07-25
      • 1970-01-01
      • 2023-03-14
      • 2013-08-06
      • 2013-02-08
      • 1970-01-01
      相关资源
      最近更新 更多