gpt4 book ai didi

java - 为什么需要为每个连接使用 JDBC write Class.forName(...)?

转载 作者:行者123 更新时间:2023-11-30 06:52:18 27 4
gpt4 key购买 nike

如果我想连接到数据库,我应该这样写代码:

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/mysidorservicename", "sysdba", "password123");

为什么要在连接数据库之前加载具体的驱动程序? Class.forName 语句的结果被忽略——加载的类显然没有与 DriverManager 相关联。我可以在启动应用程序时加载用于不同数据库的所有驱动程序,而不是在每次连接之前编写 Class.forName 代码吗?

最佳答案

较旧的 DriverManager 实现(在 JDBC 4.0 之前,它是 JDK 6 的一部分),要求驱动程序有一个静态 block ,将它们注册到 DriverManager。当驱动程序管理器加载类时,静态 block 将被调用一次。对于您的问题 - 加载这些类的位置并不重要,只要您在尝试使用它们之前加载驱动程序即可。

自从 JDBC 4.0(如上所述,它是 JDK 6 的一部分)以来,您根本不必调用 Class.forName。引用DriverManager's javadoc :

The DriverManager methods getConnection and getDrivers have been enhanced to support the Java Standard Edition Service Provider mechanism. JDBC 4.0 Drivers must include the file META-INF/services/java.sql.Driver. This file contains the name of the JDBC drivers implementation of java.sql.Driver. For example, to load the my.sql.Driver class, the META-INF/services/java.sql.Driver file would contain the entry [etc..]

通俗地说,由驱动程序自行注册以声明它为给定的连接字符串提供 JDBC 服务,您只需从代码中删除 Class.forName 调用即可。

关于java - 为什么需要为每个连接使用 JDBC write Class.forName(...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39116196/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com