- Datasource是一个接口,DriverManager是具体的类。接口可以很多种实现方式,这正是java多态的特性。
- Datasource会帮我们创建、管理和分配数据库连接,它有多种实现,如:dbcp、Druid、HikariCP等。
接下来看HikariCP是如何获取连接的:通过阅读HikariCP的源码,发现它在初始化的时候最终获取Connection是调用
driver.connect(jdbcUrl, driverProperties);
,而DriverManager获取Connection也是调用driver.connect(url, info);
。具体的连接由数据库的驱动实现。
DriverManager.getConnection(“”)调用最终会走到如下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24//获取注册的驱动进行 如:Class.forName("")注册驱动
for(DriverInfo aDriver : registeredDrivers) {
// If the caller does not have permission to load the driver then
// skip it.
if(isDriverAllowed(aDriver.driver, callerCL)) {
try {
println(" trying " + aDriver.driver.getClass().getName());
Connection con = aDriver.driver.connect(url, info);
if (con != null) {
// Success!
println("getConnection returning " + aDriver.driver.getClass().getName());
return (con);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
} else {
println(" skipping: " + aDriver.getClass().getName());
}
}HikariCP初始化会走到DriverDataSource类的getConnection方法
1
2
3
4
5
public Connection getConnection() throws SQLException
{
return driver.connect(jdbcUrl, driverProperties);
}
总结
Datasource和DriverManager最终获取Connection的方式都是一样的,都是通过driver.connect()获取,只不过Datasource(指具体的连接池实现)会在初始化的帮我们创建一定数量的连接,这样就不需要每次都去创建Connection,需要使用的时候们只要去池中取未被使用的连接就可以,使用完的连接会被自动释放。而DriverManager需要每次都去创建,这样会耗费内存和时间(除非你只需一个连接就能搞定)。因此,我们在编写项目的时候,都推荐使用了连接池。