爲什麼必須使用數據庫連接池:
1.普通的JDBC數據庫連接使用DriverManager來獲取,每次向數據庫建立連接時都要將Connection加載到內存中,再驗證用戶名和密碼。需要數據庫連接的時候,就向數據庫要求一個,執行完後就斷開連接,這樣的方式會消耗大量的資源和時間,數據庫的連接資源並沒有得到很好的重複利用。若是同時有幾百人甚至幾千人在線,頻繁地進行數據庫連接操作,這將會佔用很多的系統資源,嚴重的甚至會造成服務器的奔潰。
2.使用DriverManager方式獲取JDBC數據庫連接,每一次數據庫連接,操作完會後都要斷開,否則,如果程序出現異常而未能關閉,將會導致數據庫系統內存泄漏,最終將導致重啓數據庫。
3.同時,這種開發不能控制被創建的連接對象數,系統資源會被毫無顧忌地分配出去,若果連接過多,也可能導致內存泄漏,服務器奔潰。
使用數據庫連接池,可以避免以上幾種問題。數據庫連接池允許應用程序重複使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閒空閒時間超過最大空閒時間的數據庫連接來避免因爲沒有釋放數據庫連接而引起的數據庫連接漏洞;連接池的數據庫連接數受最大連接數和最小連接數控制,因此不會出現連接過多內存泄漏的情況。
使用連接池和不使用連接池的區別:
1.獲取連接的方式:
不使用:直接和數據庫建立連接
使用:直接從連接池中獲取連接
2.斷開連接的方式:
不使用:直接和數據庫斷開連接
使用:將連接對象還給連接池
常用的連接池有Apache組織開發的DBCP和阿里巴巴開發的Druid,簡單介紹一下如何使用者兩種連接池:
1.DBCP:
1)準備jar包:
commons-dbcp-1.4.jar commons-pool-1.5.6.jar
2)實現連接池的相關的代碼
public class DBCPUtil {
private static Properties p;
private static DataSource dataSource;
static {
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream in = loader.getResourceAsStream("db.properties");
Properties p = new Properties();
p.load(in);
//通過工廠類方式創建緩衝池
dataSource = BasicDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection conn,Statement state,ResultSet result){
try {
if(result != null){
result.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(state != null){
state.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
db.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hcd
username=root
password=admin
2.Druid:
1)將jar包導入到項目中:
druid-1.0.9.jar
2)實現連接池的相關的代碼(基本跟DBCP的一樣):
public class DruidUtil {
private static Properties p;
private static DataSource dataSource;
static{
try {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = loader.getResourceAsStream("db.properties");
p = new Properties();
p.load(inputStream);
//通過工廠類獲取DataSource對象
dataSource = DruidDataSourceFactory.createDataSource(p);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection conn,Statement state,ResultSet result){
try {
if(result != null){
result.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(state != null){
state.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}