數(shù)據連接池的原理就是解決多次連接數(shù)據庫的性能損耗,建立一個pool,用來存儲數(shù)據庫連接,需要的時候直接從連接池獲取,而不需要再次和數(shù)據庫建立連接。
目前常用的數(shù)據連接池(簡稱數(shù)據源)有以下幾種:
- DBCP
- DBCP2
- C3P0(有性能問題,不建議用)
- Druid(阿里數(shù)據源,推薦使用)
- Tomcat自帶連接池
- WebLogic數(shù)據源
這里面我目前常用的是Druid,性能不錯,而且自帶監(jiān)控功能,可以和Spring完整整合,監(jiān)控sql執(zhí)行性能,監(jiān)控service的執(zhí)行效率。
下面寫一個方法來使用數(shù)據連接池,代碼參見:com.critc.DataSourceTest
首先需要在pom.xml添加druid依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.25</version>
</dependency>
代碼如下:
public class DataSourceTest {
public static void main(String[] args)throws Exception {
Hashtable<String, String> map = new Hashtable<String, String>();
map.put("driverClassName", "com.mysql.jdbc.Driver");
map.put("url", "jdbc:mysql://127.0.0.1/test");
map.put("username", "root");
map.put("password", "root");
map.put("initialSize", "2");
map.put("maxActive", "10");
DataSource dataSource = DruidDataSourceFactory.createDataSource(map);
long l = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
Connection conn = dataSource.getConnection();
conn.close();
}
System.out.println("連接池執(zhí)行時間:" + (System.currentTimeMillis() - l));
long l2 = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
Connection conn = new JdbcTest().getConn();
conn.close();
}
System.out.println("JDBC連接執(zhí)行時間:" + (System.currentTimeMillis() - l2));
}
}
可以看出使用連接池獲取數(shù)據庫連接的時間遠遠小于直接連接數(shù)據庫。