Java Web程序設計——數據庫連接池與DBUtils工具
數據庫連接池
什麼是數據庫連接池
- 在使用JDBC編程時,每次訪問數據庫都需要創建對象,訪問完畢後也需要斷開連接(銷燬對象)。爲了避免頻繁的創建數據庫連接,提出來數據庫連接池技術。
- 應用程序就不需要創建和斷開連接對象,而是交給數據庫連接池管理。
- 數據庫連接池斷開,不是銷燬對象,而是把連接對象歸還給連接池。
- 數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用現有的數據庫連接,而不是重新建立。
- 採用數據庫連接池操作數據庫的示意圖:
- 優點:通過數據庫連接池管理連接對象,減少了數據庫連接對象的創建和銷燬,提高了數據庫的訪問效率。
- 數據庫連接池基本參數:
- 初始化大小:數據庫連接池裏面初始的連接對象個數
- 最大連接數:數據庫連接池裏面最大的連接對象個數
- 最大等待時間:用戶通過連接池取連接對象時,需要等待的世界
- 最大空閒連接:數據庫連接池裏面,在用戶訪問趨於穩定時,最大空閒連接個數
- 最小空閒連接:在用戶訪問趨於頂峯時,數據庫連接池裏面剩餘的最小連接對象個數。
DataSource接口
- 爲了獲取數據庫連接對象(Connection),JDBC提供了javax.sql.DataSource接口,它負責與數據庫建立連接,並定義了返回值Connection對象的方法:
Connection getConnection()
Connection getConnection(String username,String password)
- 習慣性的把實現了javax.sql.DataSource接口的類稱爲數據源,即數據的來源。在數據源中存儲了所有建立數據庫連接的信息。
DBCP數據源
- DBCP數據源連接池(DataBase Connection Pool),是由apache組織提供的數據庫連接池技術,開源免費。
- 在項目開發中,使用DBCP的基本步驟:
- 前提導入DBCP的jar包:commons-dbcp.jar,commons-pool.jar
- DBCP獲取連接對象:設置連接參數。四個連接參數:driverName,url,username,password
例:
package chapter10;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class Example01 {
public static DataSource ds = null;
static {
//獲取DBCP數據源實現類對象
BasicDataSource bds = new BasicDataSource();
//設置連接數據庫所需要的四個連接參數
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jbdc:mysql://localhost:3306/jdbc");
bds.setUsername("root");
bds.setPassword(null);
//設置連接池參數
bds.setInitialSize(5); //初始化參數
bds.setMaxIdle(10);
ds = bds;
}
public static void main(String[] args) throws SQLException {
//數據庫連接池獲取連接對象
Connection con = ds.getConnection();
//獲取連接參數
DatabaseMetaData metaData = con.getMetaData();
System.out.println(metaData.getURL());
System.out.println(metaData.getUserName());
System.out.println(metaData.getDriverName());
}
}
- BasicDataSource類的常用方法:
C3P0數據源
- C3P0數據源是目前最流行的數據庫連接池技術之一,它的性能更加優越,也提供了對後期數據框架hibernate很好的支持,它是開源免費的。
- 在項目開發中,使用C3P0的基本步驟:
- 前提導入C3P0的jar包,提供了C3P0的核心類方法
- 設置連接參數:四個連接參數:driverName,url,username,password
例:
package chapter10;
import java.beans.PropertyVetoException;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Example02 {
public static DataSource ds = null;
// 初始化C3P0數據源
static {
ComboPooledDataSource cpds = new ComboPooledDataSource();
try {
// 設置四個連接參數
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
cpds.setUser("root");
cpds.setPassword("");
// 設置連接池參數
cpds.setInitialPoolSize(5);
cpds.setMaxPoolSize(15);
ds = cpds;
} catch (PropertyVetoException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
}
public static void main(String[] args) throws SQLException {
System.out.println(ds.getConnection());
}
}
- ComboPooledDataSource類常用的方法:
DBUtils工具
- DBUtils工具介紹:是由apache提供。是commons組件一員。是對jdbc簡單的封裝,減少操作數據庫的代碼。使用前,需要導入DBUtils的jar包。
QueryRunner類
- QueryRunner類是DBUtils組件下的核心類,通常和ResultSetHandler接口配合使用,對jdbc代碼進行了簡單的封裝,減少操作數據庫大代碼量。
- QueryRunner類提供了集中常見的方法:
query(String,ResultSetHandler rsh,Object... params)
update(String sql,Object... params)
update(String sql)
ResultSetHandler接口
- ResultSetHandler接口用於處理ResultSet結果集,它可以將結果集中的數據轉爲不同的形式。
- ResultSetHandler提供了集中常見的實現類,具體如下: