解密:Druid数据库连接池的driverClassName驱动类可以不用配置原因
一次偶然的机会,不小心修改了driverClassName,结果竟然依然能获取连接,于是干脆直接删除,测试依然通过…
这就引发了我的好奇心,必须得一探究竟~
附上源代码:
druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mydb?characterEncoding=UTF-8
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
DruidUtils
package com.hyq.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DruidUtils {
//1.定义成员变量
private static DataSource dataSource;
//2.静态代码块
static{
try {
//3.创建属性集对象
Properties p = new Properties();
//4.加载配置文件 Druid 连接池不能够主动加载配置文件 ,需要指定文件
InputStream inputStream = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
//5. 使用Properties对象的 load方法 从字节流中读取配置信息
p.load(inputStream);
//6. 通过工厂类获取连接池对象
dataSource = DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取数据源
public static DataSource getDataSource() {
return dataSource;
}
//获取连接的方法
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
//释放资源
public static void close(Connection con, Statement statement){
if(con != null && statement != null){
try {
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection con, Statement statement, ResultSet resultSet){
if(con != null && statement != null && resultSet != null){
try {
resultSet.close();
statement.close();
//归还连接
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
解密开始
1 查看 createDataSource 创建数据源的细节
2 找到了创建数据源对象的代码 继续跟进
3 构造方法中没有什么发现,线索断了… 但是发现了初始化的方法,柳暗花明又一村,继续跟进
4 源代码的555行找打了,如果不配置驱动类的时候,会根据jdbcUrl来获取,继续跟进
5 答案已找到…
总结:
- 如果不配置驱动类,或者driverClassName写错,都会按照没有配置处理;
- 然后创建数据源对象时的初始化的方法,会根据jdbcUrl,自动获取驱动类