我知道类加载对于在运行时使用类名加载类很有用.
但是,在我们的项目中使用JDBC时,我们知道我们将使用哪个驱动程序,并且主要是驱动程序管理器字符串是硬编码
我的问题是:为什么我们Class.forName("JDBC_DRIVER")在这里加载驱动程序?
为什么我们不能继续在类路径中添加驱动程序?因为我们知道我们将使用哪个驱动程序jar.
我相信Class.forName(JDBC_DRIVER)会加载驱动程序DriverManager.这是唯一的原因吗?
编辑1:
作为其(DriverManager)初始化的一部分,DriverManager类将尝试加载"jdbc.drivers"系统属性中引用的驱动程序类.
应用程序不再需要使用显式加载JDBC驱动程序
Class.forName().当前加载JDBC驱动程序的现有程序Class.forName()将继续工作而无需修改.
然后,当我使用oracle驱动程序以外; 我是否需要更改系统属性中的驱动程序名称字符串?
Joa*_*uer 24
第一个:使用现代JDBC驱动程序和当前的JDK(至少是Java 6),Class.forName()不再需要调用.现在使用服务提供程序机制定位JDBC驱动程序类.您应该能够简单地删除该调用并保持其余代码不变,它应该继续工作.
如果你不使用当前的JDK(或者如果您有没有一个JDBC驱动程序不具有设置为使用该机制将相应的文件),则驱动程序需要与注册DriverManager使用registerDriver.该方法通常从实际驱动程序类的静态初始化程序块调用,该类在第一次加载时被触发,因此发出Class.forName()确保驱动程序自行注册(如果尚未完成).
无论您是使用Class.forName()新服务提供程序还是新服务提供程序机制,您始终都需要类路径上的JDBC驱动程序(ClassLoader至少在运行时通过某些程序可用).
tl; dr:是的,该调用的唯一用途Class.forName()是确保驱动程序已注册.如果您使用当前的JDK和当前的JDBC驱动程序,则此调用不再是必需的.
Eug*_*hov 12
Class.forName(JDBC_DRIVER)调用将在DriverManager中注册您的JDBC驱动程序,因此您可以通过url来解决它,例如"jdbc:odbc:Database"等等...
通常驱动程序类具有这样的静态初始化代码,它在Class.forName()上调用:
public class Driver implements java.sql.Driver {
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
您仍然必须将JDBC驱动程序jar放入类路径中.
或者,您可以使用特定于数据库的DataSource,然后可以声明性地指定数据源类型,例如在Spring上下文或Web服务器JNDI中.这是一个例子.
| 归档时间: |
|
| 查看次数: |
16993 次 |
| 最近记录: |