發布時間: 2017-10-19 10:22:55
一:?連接池的概念;
?連接池用于創建和管理數據庫連接的緩沖池技術,緩沖池中的連接可以被任何需要的連接數據庫的線程使用。當一個線程需要用JDBC對一個數據庫操作時,將從池中請求一個連接。當這個連接對象使用完畢后,將返回到連接池中,等待為其他的線程服務。?
二:連接池的工作原理;?
連接池的工作原理主要由三部分組成,分別為連接池的建立、連接池中連接的使用管理、連接池的關閉。
第一、連接池的建立。一般在系統初始化時,連接池會根據系統配置建立,并在池中創建了幾個連接對象,以便使用時能從連接池中獲取。連接池中的連接不能隨意創建和關閉,這樣避免了連接隨意建立和關閉造成的系統開銷。Java中提供了很多容器類可以方便的構建連接池,例如Vector、Stack等。
第二、連接池的管理。連接池管理策略是連接池機制的核心,連接池內連接的分配和釋放對系統的性能有很大的影響。其管理策略是:
當客戶請求數據庫連接時,首先查看連接池中是否有空閑連接,如果存在空閑連接,則將連接分配給客戶使用;如果沒有空閑連接,則查看當前所開的連接數是否已經達到較大連接數,如果沒達到就重新創建一個連接給請求的客戶;如果達到就按設定的較大等待時間進行等待,如果超出較大等待時間,則拋出異常給客戶。
當客戶釋放數據庫連接時,先判斷該連接的引用次數是否超過了規定值,如果超過就從連接池中刪除該連接,否則保留為其他客戶服務。
該策略保證了數據庫連接的有效復用,避免頻繁的建立、釋放連接所帶來的系統資源開銷。
第三、連接池的關閉。當應用程序退出時,關閉連接池中所有的連接,釋放連接池相關的資源,該過程正好與創建相反。
三:連接池的優點?;
連接池的主要優點有以下三個方面。
第一、減少連接創建時間。連接池中的連接是已準備好的、可重復使用的,獲取后可以直接訪問數據庫,因此減少了連接創建的次數和時間。
第二、簡化的編程模式。當使用連接池時,每一個單獨的線程能夠像創建一個自己的JDBC連接一樣操作,允許用戶直接使用JDBC編程技術。
第三、控制資源的使用。如果不使用連接池,每次訪問數據庫都需要創建一個連接,這樣系統的穩定性受系統連接需求影響很大,很容易產生資源浪費和高負載異常。連接池能夠使性能較大化,將資源利用控制在一定的水平之下。連接池能控制池中的連接數量,增強了系統在大量用戶應用時的穩定性。
1:數據配置文件;
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/togogo_java_1338
username=java1338
password=123456
2:代碼實現;
package net.togogo.java.jdbc.day2.pool;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;
public class JdbcPool {
private static String driver;
private static String url;
private static String username;
private static String password;
private static LinkedList<Connection> pool = new LinkedList<Connection>();
private static int poolsize = 10;
static {
try {
Properties prop = new Properties();
InputStream in = JdbcPool.class.getClassLoader().getResourceAsStream("jdbc.properties");
prop.load(in);
driver = prop.getProperty("driver");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
Class.forName(driver);
/**
* 初始化連接池的連接對象
*/
if (pool.size() == 0) {
for (int i = 0; i < poolsize; i++) {
try {
Connection conn = DriverManager.getConnection(url, username, password);
pool.add(conn);
System.out.println("[初始化]" + conn + "被加到池里面了?。?!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
/*
* 這里使用動態代理技術返回一個假的Connection,當dao調用假connection的任何方法時,
* 該方法體內會調用InvocationHandler.invoke方法
* 在invoke方法體內,發現dao調用的是close方法,則把鏈接還到池里,否則,調用真connection的對應方法。
* (non-Javadoc)
*
* @see javax.sql.DataSource#getConnection()
*/
public static Connection getConnection() throws SQLException { // spring aop
if (pool.size() > 0) {
final Connection conn = pool.removeFirst();
System.out.println("[被使用]" + conn + "從池里面取出去了?。?!");
return (Connection) java.lang.reflect.Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),
conn.getClass().getInterfaces(), new InvocationHandler() {
// proxy為代理對象 method為要調用的方法 args為方法的參數
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("close")) {
pool.addFirst(conn);
System.out.println("[被回收]" + conn + "------被還到池里面了??!------");
return null;
} else {
return method.invoke(conn, args);
}
}
});
}
throw new RuntimeException("對不起,池里沒有資源了?。?!");
}
}
package net.togogo.java.jdbc.day2.pool;
import java.sql.Connection;
import java.sql.SQLException;
public class TestJdbcPool {
public static void main(String[] args) {
try {
Connection con = JdbcPool.getConnection();
System.out.println("被使用的:" + con);
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
??
?
上一篇: {UI}設計-APP的顏色搭配的技巧
下一篇: {思科CCNA-RS}STP生成樹