數據庫鏈接池是什麼?
java
數據庫鏈接池(Connection pooling)是程序啓動時創建足夠的數據庫鏈接,並將這些鏈接組成一個鏈接池,由程序動態地對池中的鏈接進行申請,使用,釋放。mysql
在對數據庫進行操做以前都要先獲取數據庫鏈接,而後才能向後進行操做,增刪改查,獲取結果集,浪費時間的地方就是在獲取數據庫鏈接上,以往每次操做的時候,先獲取鏈接,操做完以後關掉鏈接,這麼一次一次,時間都浪費在獲取鏈接上了,咱們須要的就是一個數據庫鏈接池,先建立好必定數量的鏈接放在池子裏,當咱們要用的時候,去池子中去找可用的鏈接,當用完以後,再把鏈接放回池子中,這樣咱們用的鏈接都是池子負責管理的,每次用完以後只要放回去,這樣相比於以前的獲取到鏈接,用完關閉速度很快,只是把鏈接拿來不用每次都建立,關閉,能夠省不少的時間。sql
使用c3p0能夠很輕鬆地構建數據庫鏈接池,是一個開源的項目,https://sourceforge.net/projects/c3p0/files/?source=navbar下載網址,一個壓縮包中包含jar包和例子,說明數據庫
須要的jar包,導入咱們的項目中就能使用了post
使用單例模式(餓漢式)構建數據庫鏈接池,測試
private static ComboPooledDataSource dataSource;
private static ConnectionManager connectionManager = new ConnectionManager();
private ConnectionManager(){
try {
//ComboPooledDataSource cpds = new ComboPooledDataSource();
// cpds.setDriverClass(「org.postgresql.Driver」);
// 加載jdbc驅動程序cpds.setJdbcUrl(「jdbc:postgresql:localhost / testdb」);
// cpds.setUser( 「swaldman」);
// cpds.setPassword( 「測試密碼」);
// 下面的設置是可選的 - c3p0能夠使用默認值
// cpds.setMinPoolSize(5);
// cpds.setAcquireIncrement(5);
// cpds.setMaxPoolSize(20); // DataSource cpds如今是一個徹底配置和可用的聚集數據源...
dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("root");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mail");
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setInitialPoolSize(5); //初始化鏈接數
dataSource.setMinPoolSize(1);//最小鏈接數
dataSource.setMaxPoolSize(20);//最大鏈接數
dataSource.setMaxStatements(50);//最長等待時間
dataSource.setMaxIdleTime(60);//最大空閒時間,單位毫秒
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
public static ConnectionManager getInstance(){
return connectionManager;
}
public synchronized Connection getConnection() {
Connection conn = null;
try {
conn=dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
在main方法中測試,輸出兩種方法所用的時間
ui
public static void main(String[] args) throws SQLException {
for(int i=0;i<50;i++) {
long begin = System.currentTimeMillis();
Connection conn = ConnectionManager.getInstance().getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM USER WHERE id=2");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
}
conn.close();
ps.close();
rs.close();
long end = System.currentTimeMillis();
System.out.print(end-begin+" ");
}
System.out.println("-------------");
for(int i=0;i<50;i++) {
long begin = System.currentTimeMillis();
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mail";
String username = "root";
String password = "root";
conn = DriverManager.getConnection(url, username, password);
PreparedStatement ps = conn.prepareStatement("SELECT * FROM USER WHERE id=2");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
}
conn.close();
ps.close();
rs.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.print(end - begin+" ");
}
}
利用數據庫鏈接池第一次使用耗時時間長,之後平均用時均爲1ms,不使用鏈接池的代碼平均都在15ms左右url
參考:http://blog.csdn.net/wenwen091100304/article/details/48035003
spa