JDBC破坏双亲委派机制
java有自己的一套 资源管理服务JNDI 等等,是由启动类加载器加载的,说明类是放在rt.jar
包中。java提供Driver接口,厂商根据自己的需求实现功能。
双亲委派机制:当前类加载器收到类加载的请求后,先不自己尝试加载类,而是先将请求委派给父类加载器,调用父类的 loadClass() 方法,这是一个递归的过程(因此,所有的类加载请求,都会先被传送到启动类加载器),只有当父类加载器加载失败时,当前类加载器才会尝试自己去自己负责的区域加载。
所以判断是否破坏双亲委派机制的一个重要指标是类加载的请求顺序
未破坏双亲委派机制的情况
下面是我们连接数据库常用的代码;
String url = "jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL";
String username = "root";
String password = "root";
String driverClassName = "com.mysql.cj.jdbc.Driver";
// 注册驱动
Class.forName(driverClassName);
// 获取连接
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println("数据库连接成功 --》" + connection);
我们点进java的Driver接口,可以看到:
package java.sql;
import java.util.logging.Logger;
public interface Driver {
Connection connect(String url, java.util.Properties info)
throws SQLException;
boolean acceptsURL(String url) throws SQLException;
DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info)
throws SQLException;
int getMajorVersion();
int getMinorVersion();
boolean jdbcCompliant();
public Logger getParentLogger() throws SQLFeatureNotSupportedException;
}
所以上面的方法都需要厂商来实现。
- 第一步注册驱动,在DriverManager 类中实现
java 提供了DriverManager来管理各种驱动(Driver),点进看源码:
public class DriverManager {
// List of registered JDBC drivers
// 存储已经注册的驱动,这是一个由 JUC 下 ReentrantLock 实现的可以高并发的 List ,
// 如果想要注册驱动,就需要 调用 addIfAbsent 方法添加进 List。
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>