java - 'Class.forName("MY_JDBC_DRIVER")' 的目的是什么?

标签 java jdbc

我知道类加载对于在运行时使用类名加载类很有用。

但是,在我们的项目中使用 JDBC 时,我们知道要使用哪个驱动程序,并且大多数驱动程序管理器字符串是硬编码的。

我的问题是:为什么我们在这里使用 Class.forName("JDBC_DRIVER") 加载驱动程序?
为什么我们不能继续在类路径中添加驱动程序?因为我们知道要使用哪个驱动程序 jar。

我相信 Class.forName(JDBC_DRIVER) 会将驱动程序加载到 DriverManager 中。这是唯一的原因吗?

编辑 1:

DriverManager API doc声明

As part of its(DriverManager) initialization, the DriverManager class will attempt to load the driver classes referenced in the "jdbc.drivers" system property.

Applications no longer need to explictly load JDBC drivers using Class.forName(). Existing programs which currently load JDBC drivers using Class.forName() will continue to work without modification.

然后当我使用非 oracle 驱动程序时;我需要更改系统属性中的驱动程序名称字符串吗?

最佳答案

首先:使用现代 JDBC 驱动程序和当前的 JDK(至少 Java 6)不再需要调用 Class.forName()JDBC driver classes are now located使用 service provider mechanism .您应该能够简单地删除该调用并保持其余代码不变,它应该可以继续工作。

如果您没有使用当前的 JDK(或者如果您的 JDBC 驱动程序没有设置了适当的文件来使用该机制),那么驱动程序需要注册到DriverManager 使用 registerDriver .该方法通常从实际驱动程序类的静态初始化程序 block 中调用,该程序在类首次加载时触发,因此发出 Class.forName() 可确保驱动程序自行注册(如果尚未完成)。

无论您使用 Class.forName() 还是新的服务提供者机制,您都将始终需要类路径上的 JDBC 驱动程序(或通过一些ClassLoader 至少在运行时)。

tl;dr:是的,使用该 Class.forName() 调用是为了确保驱动程序已注册。如果您使用当前的 JDK 和当前的 JDBC 驱动程序,则不再需要此调用。

关于java - 'Class.forName("MY_JDBC_DRIVER")' 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7662902/

相关文章:

sql - 将最后的 'x' 结果保存在数据库中

java - 无法连接到数据库

java - 使用 Java 编写 Mac 应用程序包/文件夹

gps - 测量 gps 距离

sql - Oracle 分页查询中的列无效?

java - 声明输出参数并像查询结果、T-SQL、JAVA 一样选择它

java - 如何使用 spring boot + .yaml 创建配置文件?

java - SQLite 在按下按钮时导致崩溃

java - 在java中过滤文件

java - java.sql.SQLException :[Microsoft][ODBC Driver Manager] Invalid descriptor index 异常