JDBC Driver的加载机制
1.用以下代码取得url里对应的Connection
Connection conn = DriverManager.getConnection(url, user, password);
2.进一步查看源代码,可以发现是通过遍历DriverManager里的
DriverInfo来尝试加载url对应的Connection的。那么问题就是,遍历的这些DriverInfo是哪里来的,它在DriverManager里是一个Vector。遍历代码如下:
if (!initialized) {
initialize();
}
synchronized (DriverManager.class){
// use the readcopy of drivers
drivers = readDrivers;
}
// Walk through the loaded drivers attempting to make a connection.
// Remember the first exception that gets raised so we can reraise it.
SQLException reason = null;
for (int i = 0; i < drivers.size(); i++) {
DriverInfo di = (DriverInfo)drivers.elementAt(i);
// If the caller does not have permission to load the driver then
// skip it.
if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {
println(" skipping: " + di);
continue;
}
try {
println(" trying " + di);
Connection result = di.driver.connect(url, info);
if (result != null) {
// Success!
println("getConnection returning " + di);
return (result);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
}
3.上面的 initialize();就是问题的关键。进一步阅读源代码,进入loadInitialDrivers()方法。
private static void loadInitialDrivers() {
String drivers;
try {
drivers = (String) java.security.AccessController.doPrivileged(
new sun.security.action.GetPropertyAction("jdbc.drivers"));
} catch (Exception ex) {
drivers = null;
}
// If the driver is packaged as a Service Provider,
// load it.
// Get all the drivers through the classloader
// exposed as a java.sql.Driver.class service.
DriverService ds = new DriverService();
// Have all the privileges to get all the
// implementation of java.sql.Driver
java.security.AccessController.doPrivileged(ds);
println("DriverManager.initialize: jdbc.drivers = " + drivers);
if (drivers == null) {
return;
}
4.这里的DriverService起到了加载驱动的作用,进入DriverService的定义:
class DriverService implements java.security.PrivilegedAction {
Iterator ps = null;
public DriverService() {};
public Object run() {
ps = Service.providers(java.sql.Driver.class);
try {
while (ps.hasNext()) {
ps.next();
} // end while
} catch(Throwable t) {
// Do nothing
}
return null;
} //end run
}
5.(3)里的 java.security.AccessController.doPrivileged(ds);会调用ds的run方法,也就是DriverService的run方法。run方法里ps = Service.providers(java.sql.Driver.class);这一句,会遍历整个classpath上的jar包,包的META-INF/services里有一个文件名为java.sql.Driver的文件,里面记录了这个包里继承了java.sql.Driver的类的类名,执行ps.next();则会加载对应的类。
分享到:
相关推荐
1. `sqljdbc_4.0.2206.100_chs.exe` 是Windows环境下的安装程序,用户可以通过执行这个文件将驱动添加到系统路径,方便在Java应用中自动发现和加载。 2. `sqljdbc_4.0.2206.100_chs.tar.gz` 是适用于Linux和Unix等...
6. **安全性**:JDBC Driver 4.0提供集成的身份验证机制,包括Windows身份验证(Kerberos)、集成安全性以及SQL Server的其他安全特性,确保数据访问的安全。 7. **兼容性**:除了SQL Server 2005及更高版本,该...
Microsoft SQL Server 2005 JDBC Driver是一款由微软公司开发的Java数据库连接(JDBC)驱动程序,专门用于Java应用程序与Microsoft SQL Server 2005数据库之间的通信。这款驱动程序实现了Java Database Connectivity...
本文将深入分析JDBC驱动的加载机制,特别是sun提供的JDBC-ODBC桥接驱动的加载过程。 #### JDBC驱动加载原理 JDBC驱动加载是一个关键步骤,它决定了Java应用程序能否成功地与数据库建立连接。在本例中,我们将探讨...
JDBC 4.0 版本引入了 Java SPI 机制来加载驱动程序,使用 ServiceLoader 机制来加载驱动程序,并将其注册到 DriverManager 中。这样,应用程序就可以使用 JDBC 驱动程序来连接到数据库并进行数据交互。
### GBase-8s数据库JDBC Driver程序员指南关键知识点概览 #### 1. 概述 - **GBase-8s JDBC Driver**:由南大通用数据技术股份有限公司开发,是一款用于连接GBase-8s数据库的Java数据库连接驱动程序。 - **目标读者*...
3. 确认类加载机制无误,包括在代码中正确注册驱动和配置应用容器。 4. 调整和验证运行时的类路径设置。 5. 使用开发工具和源码来定位问题,例如通过IDE的调试功能。 6. 如果涉及数据库连接池(如DBCP),检查并优化...
总的来说,Eclipse JDBC驱动加载包简化了Java开发者与数据库的交互,提供了高效、灵活和可移植的数据库访问机制。无论是新手还是经验丰富的开发者,都能通过掌握JDBC技术提升其数据库应用开发的能力。
SQL Server JDBC Driver是微软公司为Java应用程序提供的一种与SQL Server数据库进行交互的Java数据库连接(JDBC)驱动程序。在Java编程中,JDBC驱动扮演着至关重要的角色,它允许Java开发者通过编写Java代码来访问和...
例如,通过`Class.forName("oracle.jdbc.driver.OracleDriver")`加载驱动,然后使用`DriverManager.getConnection()`方法创建数据库连接。 **使用步骤** 1. 下载并放置`ojdbc7.jar`到项目类路径。 2. 注册驱动:`...
Hive JDBC驱动是连接Hadoop生态...无论是在数据提取、转换、加载(ETL)流程,还是在报表生成、数据分析任务中,它们都是不可或缺的工具。通过持续的版本迭代,Hive JDBC驱动不断优化,以适应不断发展的大数据需求。
除了手动注册驱动,现代的JDBC驱动通常采用自动注册机制,通过`META-INF/services/java.sql.Driver`文件来声明自己。当JDBC启动时,它会自动加载服务提供者配置文件中列出的驱动。 然而,`DriverManager`的注册方式...
2. **建立连接**: 在Java代码中,使用`Class.forName()`方法加载JDBC驱动,然后通过`DriverManager.getConnection()`创建数据库连接。例如: ```java Class.forName(...
通过这些机制,JDBC能够实现数据库驱动程序的动态加载和管理,从而支持多种不同的数据库系统,使得Java应用程序具有高度的数据库独立性和灵活性。这一设计体现了面向接口编程的原则,增强了系统的可扩展性和维护性。
"JDBCDriver"就是这个机制中的关键组件,它是连接Java应用程序和数据库的桥梁。 JDBC驱动主要有四种类型: 1. **类型1(JDBC-ODBC桥接驱动)**:这是最早的驱动方式,通过Java调用ODBC(Open Database ...
HSqlDB的驱动类jdbcDriver也遵循了类似的模式。在静态初始化块中,一个新的jdbcDriver实例被创建并注册到DriverManager。connect方法则负责解析URL参数,创建HsqlProperties对象,并最终返回一个实现了java.sql....
在Java编程环境中,JDBC(Java Database Connectivity)是连接数据库的标准接口,而`Dm7JdbcDriver17.jar`就是实现了这个接口的特定版本,用于支持达梦数据库的版本7。 达梦数据库是一款国产自主的高性能、高安全性...