DriverManager原理 (个人理解小记,有错误的地方还请指正)
DriverManager的静态代码块会有以下操作
1,扫描所有jar包中含有 META-INF/services/java.sql.Driver
2,然后获取其中的驱动名称,并加载对应驱动,基本上实现了java.sql.Driver接口的实现类都有一个静态代码块,里面调用了DriverManager.registerDrive(),因为类加载器加载类时会调用静态代码块,所以类加载器加载驱动时就会调用对应的静态代码块,从而注册到DriverManager的已注册驱动列表 registeredDrivers
如果引入了oracle驱动jar包,又引入了mysql驱动jar包,那按照上面的步骤,最后registeredDrivers里会有2条记录。
当获取数据库连接时,DriverManger.getConnection()会遍历registeredDrivers,并且还要根据传入的url测试是否可以连接(oracle和mysql两种驱动的url有不同的前缀,"jdbc:mysql:"和"jdbc:oracle:") ,
isDriverAllowed() 方法用于确保,注册的驱动类对调用类是可见的,因为 注册驱动的类 和 当前调用驱动的类 的 类加载器可以能并非同一个,导致不能互相调用
结论
也就是说jdk1.6后虽然可以不用class.forName手动加载驱动,但必须确保 当前调用的类加载器和加载驱动的类加载器是同一个,所以最好在获取连接前调用Class.forName("com.mysql.cj.jdbc.Driver")来确保 加载器是同一个