連接池的管理用了了享元模式,這里對連接池進行簡單設計。
一、設計思路
1.連接池配置屬性DBbean:里面存放可以配置的一些屬性
2.連接池接口IConnectionPool:里面定義一些基本的獲取連接的一些方法
3.接口實現ConnectionPool:對上面操作進行實現,並加入一些其他方法
4.連接池管理ConnectionPoolManager:管理所有的不同的連接池,所有的連接都能通過這里進行獲得連接
5.另外還有幾個測試類,和連接信息模擬的類,這里就不進行xml 和配置文件信息的讀取了
- package pool;
- /**
- * 這是外部可以配置的連接池屬性
- * 可以允許外部配置,擁有默認值
- * @author Ran
- *
- */
- public class DBbean {
- // 連接池屬性
- private String driverName;
- private String url;
- private String userName;
- private String password;
- // 連接池名字
- private String poolName;
- private int minConnections = 1; // 空閑池,最小連接數
- private int maxConnections = 10; // 空閑池,最大連接數
- private int initConnections = 5;// 初始化連接數
- private long connTimeOut = 1000;// 重復獲得連接的頻率
- private int maxActiveConnections = 100;// 最大允許的連接數,和數據庫對應
- private long connectionTimeOut = 1000*60*20;// 連接超時時間,默認20分鍾
- private boolean isCurrentConnection = true; // 是否獲得當前連接,默認true
- private boolean isCheakPool = true; // 是否定時檢查連接池
- private long lazyCheck = 1000*60*60;// 延遲多少時間后開始 檢查
- private long periodCheck = 1000*60*60;// 檢查頻率
- public DBbean(String driverName, String url, String userName,
- String password, String poolName) {
- super();
- this.driverName = driverName;
- this.url = url;
- this.userName = userName;
- this.password = password;
- this.poolName = poolName;
- }
- public DBbean() {
- }
- public String getDriverName() {
- if(driverName == null){
- driverName = this.getDriverName()+"_"+this.getUrl();
- }
- return driverName;
- }
- public void setDriverName(String driverName) {
- this.driverName = driverName;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getPoolName() {
- return poolName;
- }
- public void setPoolName(String poolName) {
- this.poolName = poolName;
- }
- public int getMinConnections() {
- return minConnections;
- }
- public void setMinConnections(int minConnections) {
- this.minConnections = minConnections;
- }
- public int getMaxConnections() {
- return maxConnections;
- }
- public void setMaxConnections(int maxConnections) {
- this.maxConnections = maxConnections;
- }
- public int getInitConnections() {
- return initConnections;
- }
- public void setInitConnections(int initConnections) {
- this.initConnections = initConnections;
- }
- public int getMaxActiveConnections() {
- return maxActiveConnections;
- }
- public void setMaxActiveConnections(int maxActiveConnections) {
- this.maxActiveConnections = maxActiveConnections;
- }
- public long getConnTimeOut() {
- return connTimeOut;
- }
- public void setConnTimeOut(long connTimeOut) {
- this.connTimeOut = connTimeOut;
- }
- public long getConnectionTimeOut() {
- return connectionTimeOut;
- }
- public void setConnectionTimeOut(long connectionTimeOut) {
- this.connectionTimeOut = connectionTimeOut;
- }
- public boolean isCurrentConnection() {
- return isCurrentConnection;
- }
- public void setCurrentConnection(boolean isCurrentConnection) {
- this.isCurrentConnection = isCurrentConnection;
- }
- public long getLazyCheck() {
- return lazyCheck;
- }
- public void setLazyCheck(long lazyCheck) {
- this.lazyCheck = lazyCheck;
- }
- public long getPeriodCheck() {
- return periodCheck;
- }
- public void setPeriodCheck(long periodCheck) {
- this.periodCheck = periodCheck;
- }
- public boolean isCheakPool() {
- return isCheakPool;
- }
- public void setCheakPool(boolean isCheakPool) {
- this.isCheakPool = isCheakPool;
- }
- }
package pool;
/**
* 這是外部可以配置的連接池屬性
* 可以允許外部配置,擁有默認值
* @author Ran
*
*/
public class DBbean {
// 連接池屬性
private String driverName;
private String url;
private String userName;
private String password;
// 連接池名字
private String poolName;
private int minConnections = 1; // 空閑池,最小連接數
private int maxConnections = 10; // 空閑池,最大連接數
private int initConnections = 5;// 初始化連接數
private long connTimeOut = 1000;// 重復獲得連接的頻率
private int maxActiveConnections = 100;// 最大允許的連接數,和數據庫對應
private long connectionTimeOut = 1000*60*20;// 連接超時時間,默認20分鍾
private boolean isCurrentConnection = true; // 是否獲得當前連接,默認true
private boolean isCheakPool = true; // 是否定時檢查連接池
private long lazyCheck = 1000*60*60;// 延遲多少時間后開始 檢查
private long periodCheck = 1000*60*60;// 檢查頻率
public DBbean(String driverName, String url, String userName,
String password, String poolName) {
super();
this.driverName = driverName;
this.url = url;
this.userName = userName;
this.password = password;
this.poolName = poolName;
}
public DBbean() {
}
public String getDriverName() {
if(driverName == null){
driverName = this.getDriverName()+"_"+this.getUrl();
}
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPoolName() {
return poolName;
}
public void setPoolName(String poolName) {
this.poolName = poolName;
}
public int getMinConnections() {
return minConnections;
}
public void setMinConnections(int minConnections) {
this.minConnections = minConnections;
}
public int getMaxConnections() {
return maxConnections;
}
public void setMaxConnections(int maxConnections) {
this.maxConnections = maxConnections;
}
public int getInitConnections() {
return initConnections;
}
public void setInitConnections(int initConnections) {
this.initConnections = initConnections;
}
public int getMaxActiveConnections() {
return maxActiveConnections;
}
public void setMaxActiveConnections(int maxActiveConnections) {
this.maxActiveConnections = maxActiveConnections;
}
public long getConnTimeOut() {
return connTimeOut;
}
public void setConnTimeOut(long connTimeOut) {
this.connTimeOut = connTimeOut;
}
public long getConnectionTimeOut() {
return connectionTimeOut;
}
public void setConnectionTimeOut(long connectionTimeOut) {
this.connectionTimeOut = connectionTimeOut;
}
public boolean isCurrentConnection() {
return isCurrentConnection;
}
public void setCurrentConnection(boolean isCurrentConnection) {
this.isCurrentConnection = isCurrentConnection;
}
public long getLazyCheck() {
return lazyCheck;
}
public void setLazyCheck(long lazyCheck) {
this.lazyCheck = lazyCheck;
}
public long getPeriodCheck() {
return periodCheck;
}
public void setPeriodCheck(long periodCheck) {
this.periodCheck = periodCheck;
}
public boolean isCheakPool() {
return isCheakPool;
}
public void setCheakPool(boolean isCheakPool) {
this.isCheakPool = isCheakPool;
}
}
- package pool;
- import java.sql.Connection;
- import java.sql.SQLException;
- public interface IConnectionPool {
- // 獲得連接
- public Connection getConnection();
- // 獲得當前連接
- public Connection getCurrentConnecton();
- // 回收連接
- public void releaseConn(Connection conn) throws SQLException;
- // 銷毀清空
- public void destroy();
- // 連接池是活動狀態
- public boolean isActive();
- // 定時器,檢查連接池
- public void cheackPool();
- }
package pool;
import java.sql.Connection;
import java.sql.SQLException;
public interface IConnectionPool {
// 獲得連接
public Connection getConnection();
// 獲得當前連接
public Connection getCurrentConnecton();
// 回收連接
public void releaseConn(Connection conn) throws SQLException;
// 銷毀清空
public void destroy();
// 連接池是活動狀態
public boolean isActive();
// 定時器,檢查連接池
public void cheackPool();
}
- package pool;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.util.List;
- import java.util.Timer;
- import java.util.TimerTask;
- import java.util.Vector;
- public class ConnectionPool implements IConnectionPool {
- // 連接池配置屬性
- private DBbean dbBean;
- private boolean isActive = false; // 連接池活動狀態
- private int contActive = 0;// 記錄創建的總的連接數
- // 空閑連接
- private List<Connection> freeConnection = new Vector<Connection>();
- // 活動連接
- private List<Connection> activeConnection = new Vector<Connection>();
- // 將線程和連接綁定,保證事務能統一執行
- private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
- public ConnectionPool(DBbean dbBean) {
- super();
- this.dbBean = dbBean;
- init();
- cheackPool();
- }
- // 初始化
- public void init() {
- try {
- Class.forName(dbBean.getDriverName());
- for (int i = 0; i < dbBean.getInitConnections(); i++) {
- Connection conn;
- conn = newConnection();
- // 初始化最小連接數
- if (conn != null) {
- freeConnection.add(conn);
- contActive++;
- }
- }
- isActive = true;
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- // 獲得當前連接
- public Connection getCurrentConnecton(){
- // 默認線程里面取
- Connection conn = threadLocal.get();
- if(!isValid(conn)){
- conn = getConnection();
- }
- return conn;
- }
- // 獲得連接
- public synchronized Connection getConnection() {
- Connection conn = null;
- try {
- // 判斷是否超過最大連接數限制
- if(contActive < this.dbBean.getMaxActiveConnections()){
- if (freeConnection.size() > 0) {
- conn = freeConnection.get(0);
- if (conn != null) {
- threadLocal.set(conn);
- }
- freeConnection.remove(0);
- } else {
- conn = newConnection();
- }
- }else{
- // 繼續獲得連接,直到從新獲得連接
- wait(this.dbBean.getConnTimeOut());
- conn = getConnection();
- }
- if (isValid(conn)) {
- activeConnection.add(conn);
- contActive ++;
- }
- } catch (SQLException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- return conn;
- }
- // 獲得新連接
- private synchronized Connection newConnection()
- throws ClassNotFoundException, SQLException {
- Connection conn = null;
- if (dbBean != null) {
- Class.forName(dbBean.getDriverName());
- conn = DriverManager.getConnection(dbBean.getUrl(),
- dbBean.getUserName(), dbBean.getPassword());
- }
- return conn;
- }
- // 釋放連接
- public synchronized void releaseConn(Connection conn) throws SQLException {
- if (isValid(conn)&& !(freeConnection.size() > dbBean.getMaxConnections())) {
- freeConnection.add(conn);
- activeConnection.remove(conn);
- contActive --;
- threadLocal.remove();
- // 喚醒所有正待等待的線程,去搶連接
- notifyAll();
- }
- }
- // 判斷連接是否可用
- private boolean isValid(Connection conn) {
- try {
- if (conn == null || conn.isClosed()) {
- return false;
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return true;
- }
- // 銷毀連接池
- public synchronized void destroy() {
- for (Connection conn : freeConnection) {
- try {
- if (isValid(conn)) {
- conn.close();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- for (Connection conn : activeConnection) {
- try {
- if (isValid(conn)) {
- conn.close();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- isActive = false;
- contActive = 0;
- }
- // 連接池狀態
- @Override
- public boolean isActive() {
- return isActive;
- }
- // 定時檢查連接池情況
- @Override
- public void cheackPool() {
- if(dbBean.isCheakPool()){
- new Timer().schedule(new TimerTask() {
- @Override
- public void run() {
- // 1.對線程里面的連接狀態
- // 2.連接池最小 最大連接數
- // 3.其他狀態進行檢查,因為這里還需要寫幾個線程管理的類,暫時就不添加了
- System.out.println("空線池連接數:"+freeConnection.size());
- System.out.println("活動連接數::"+activeConnection.size());
- System.out.println("總的連接數:"+contActive);
- }
- },dbBean.getLazyCheck(),dbBean.getPeriodCheck());
- }
- }
- }
package pool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
public class ConnectionPool implements IConnectionPool {
// 連接池配置屬性
private DBbean dbBean;
private boolean isActive = false; // 連接池活動狀態
private int contActive = 0;// 記錄創建的總的連接數
// 空閑連接
private List<Connection> freeConnection = new Vector<Connection>();
// 活動連接
private List<Connection> activeConnection = new Vector<Connection>();
// 將線程和連接綁定,保證事務能統一執行
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
public ConnectionPool(DBbean dbBean) {
super();
this.dbBean = dbBean;
init();
cheackPool();
}
// 初始化
public void init() {
try {
Class.forName(dbBean.getDriverName());
for (int i = 0; i < dbBean.getInitConnections(); i++) {
Connection conn;
conn = newConnection();
// 初始化最小連接數
if (conn != null) {
freeConnection.add(conn);
contActive++;
}
}
isActive = true;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 獲得當前連接
public Connection getCurrentConnecton(){
// 默認線程里面取
Connection conn = threadLocal.get();
if(!isValid(conn)){
conn = getConnection();
}
return conn;
}
// 獲得連接
public synchronized Connection getConnection() {
Connection conn = null;
try {
// 判斷是否超過最大連接數限制
if(contActive < this.dbBean.getMaxActiveConnections()){
if (freeConnection.size() > 0) {
conn = freeConnection.get(0);
if (conn != null) {
threadLocal.set(conn);
}
freeConnection.remove(0);
} else {
conn = newConnection();
}
}else{
// 繼續獲得連接,直到從新獲得連接
wait(this.dbBean.getConnTimeOut());
conn = getConnection();
}
if (isValid(conn)) {
activeConnection.add(conn);
contActive ++;
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return conn;
}
// 獲得新連接
private synchronized Connection newConnection()
throws ClassNotFoundException, SQLException {
Connection conn = null;
if (dbBean != null) {
Class.forName(dbBean.getDriverName());
conn = DriverManager.getConnection(dbBean.getUrl(),
dbBean.getUserName(), dbBean.getPassword());
}
return conn;
}
// 釋放連接
public synchronized void releaseConn(Connection conn) throws SQLException {
if (isValid(conn)&& !(freeConnection.size() > dbBean.getMaxConnections())) {
freeConnection.add(conn);
activeConnection.remove(conn);
contActive --;
threadLocal.remove();
// 喚醒所有正待等待的線程,去搶連接
notifyAll();
}
}
// 判斷連接是否可用
private boolean isValid(Connection conn) {
try {
if (conn == null || conn.isClosed()) {
return false;
}
} catch (SQLException e) {
e.printStackTrace();
}
return true;
}
// 銷毀連接池
public synchronized void destroy() {
for (Connection conn : freeConnection) {
try {
if (isValid(conn)) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
for (Connection conn : activeConnection) {
try {
if (isValid(conn)) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
isActive = false;
contActive = 0;
}
// 連接池狀態
@Override
public boolean isActive() {
return isActive;
}
// 定時檢查連接池情況
@Override
public void cheackPool() {
if(dbBean.isCheakPool()){
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// 1.對線程里面的連接狀態
// 2.連接池最小 最大連接數
// 3.其他狀態進行檢查,因為這里還需要寫幾個線程管理的類,暫時就不添加了
System.out.println("空線池連接數:"+freeConnection.size());
System.out.println("活動連接數::"+activeConnection.size());
System.out.println("總的連接數:"+contActive);
}
},dbBean.getLazyCheck(),dbBean.getPeriodCheck());
}
}
}
- package pool;
- import java.sql.Connection;
- import java.sql.SQLException;
- import java.util.Hashtable;
- /**
- * 連接管理類
- * @author Ran
- *
- */
- public class ConnectionPoolManager {
- // 連接池存放
- public Hashtable<String,IConnectionPool> pools = new Hashtable<String, IConnectionPool>();
- // 初始化
- private ConnectionPoolManager(){
- init();
- }
- // 單例實現
- public static ConnectionPoolManager getInstance(){
- return Singtonle.instance;
- }
- private static class Singtonle {
- private static ConnectionPoolManager instance = new ConnectionPoolManager();
- }
- // 初始化所有的連接池
- public void init(){
- for(int i =0;i<DBInitInfo.beans.size();i++){
- DBbean bean = DBInitInfo.beans.get(i);
- ConnectionPool pool = new ConnectionPool(bean);
- if(pool != null){
- pools.put(bean.getPoolName(), pool);
- System.out.println("Info:Init connection successed ->" +bean.getPoolName());
- }
- }
- }
- // 獲得連接,根據連接池名字 獲得連接
- public Connection getConnection(String poolName){
- Connection conn = null;
- if(pools.size()>0 && pools.containsKey(poolName)){
- conn = getPool(poolName).getConnection();
- }else{
- System.out.println("Error:Can't find this connecion pool ->"+poolName);
- }
- return conn;
- }
- // 關閉,回收連接
- public void close(String poolName,Connection conn){
- IConnectionPool pool = getPool(poolName);
- try {
- if(pool != null){
- pool.releaseConn(conn);
- }
- } catch (SQLException e) {
- System.out.println("連接池已經銷毀");
- e.printStackTrace();
- }
- }
- // 清空連接池
- public void destroy(String poolName){
- IConnectionPool pool = getPool(poolName);
- if(pool != null){
- pool.destroy();
- }
- }
- // 獲得連接池
- public IConnectionPool getPool(String poolName){
- IConnectionPool pool = null;
- if(pools.size() > 0){
- pool = pools.get(poolName);
- }
- return pool;
- }
- }
package pool;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Hashtable;
/**
* 連接管理類
* @author Ran
*
*/
public class ConnectionPoolManager {
// 連接池存放
public Hashtable<String,IConnectionPool> pools = new Hashtable<String, IConnectionPool>();
// 初始化
private ConnectionPoolManager(){
init();
}
// 單例實現
public static ConnectionPoolManager getInstance(){
return Singtonle.instance;
}
private static class Singtonle {
private static ConnectionPoolManager instance = new ConnectionPoolManager();
}
// 初始化所有的連接池
public void init(){
for(int i =0;i<DBInitInfo.beans.size();i++){
DBbean bean = DBInitInfo.beans.get(i);
ConnectionPool pool = new ConnectionPool(bean);
if(pool != null){
pools.put(bean.getPoolName(), pool);
System.out.println("Info:Init connection successed ->" +bean.getPoolName());
}
}
}
// 獲得連接,根據連接池名字 獲得連接
public Connection getConnection(String poolName){
Connection conn = null;
if(pools.size()>0 && pools.containsKey(poolName)){
conn = getPool(poolName).getConnection();
}else{
System.out.println("Error:Can't find this connecion pool ->"+poolName);
}
return conn;
}
// 關閉,回收連接
public void close(String poolName,Connection conn){
IConnectionPool pool = getPool(poolName);
try {
if(pool != null){
pool.releaseConn(conn);
}
} catch (SQLException e) {
System.out.println("連接池已經銷毀");
e.printStackTrace();
}
}
// 清空連接池
public void destroy(String poolName){
IConnectionPool pool = getPool(poolName);
if(pool != null){
pool.destroy();
}
}
// 獲得連接池
public IConnectionPool getPool(String poolName){
IConnectionPool pool = null;
if(pools.size() > 0){
pool = pools.get(poolName);
}
return pool;
}
}
- package pool;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 初始化,模擬加載所有的配置文件
- * @author Ran
- *
- */
- public class DBInitInfo {
- public static List<DBbean> beans = null;
- static{
- beans = new ArrayList<DBbean>();
- // 這里數據 可以從xml 等配置文件進行獲取
- // 為了測試,這里我直接寫死
- DBbean beanOracle = new DBbean();
- beanOracle.setDriverName("oracle.jdbc.driver.OracleDriver");
- beanOracle.setUrl("jdbc:oracle:thin:@7MEXGLUY95W1Y56:1521:orcl");
- beanOracle.setUserName("mmsoa");
- beanOracle.setPassword("password1234");
- beanOracle.setMinConnections(5);
- beanOracle.setMaxConnections(100);
- beanOracle.setPoolName("testPool");
- beans.add(beanOracle);
- }
- }
package pool;
import java.util.ArrayList;
import java.util.List;
/**
* 初始化,模擬加載所有的配置文件
* @author Ran
*
*/
public class DBInitInfo {
public static List<DBbean> beans = null;
static{
beans = new ArrayList<DBbean>();
// 這里數據 可以從xml 等配置文件進行獲取
// 為了測試,這里我直接寫死
DBbean beanOracle = new DBbean();
beanOracle.setDriverName("oracle.jdbc.driver.OracleDriver");
beanOracle.setUrl("jdbc:oracle:thin:@7MEXGLUY95W1Y56:1521:orcl");
beanOracle.setUserName("mmsoa");
beanOracle.setPassword("password1234");
beanOracle.setMinConnections(5);
beanOracle.setMaxConnections(100);
beanOracle.setPoolName("testPool");
beans.add(beanOracle);
}
}
測試:
- package pool;
- import java.sql.Connection;
- /**
- * 模擬線程啟動,去獲得連接
- * @author Ran
- *
- */
- public class ThreadConnection implements Runnable{
- private IConnectionPool pool;
- @Override
- public void run() {
- pool = ConnectionPoolManager.getInstance().getPool("testPool");
- }
- public Connection getConnection(){
- Connection conn = null;
- if(pool != null && pool.isActive()){
- conn = pool.getConnection();
- }
- return conn;
- }
- public Connection getCurrentConnection(){
- Connection conn = null;
- if(pool != null && pool.isActive()){
- conn = pool.getCurrentConnecton();
- }
- return conn;
- }
- }
package pool;
import java.sql.Connection;
/**
* 模擬線程啟動,去獲得連接
* @author Ran
*
*/
public class ThreadConnection implements Runnable{
private IConnectionPool pool;
@Override
public void run() {
pool = ConnectionPoolManager.getInstance().getPool("testPool");
}
public Connection getConnection(){
Connection conn = null;
if(pool != null && pool.isActive()){
conn = pool.getConnection();
}
return conn;
}
public Connection getCurrentConnection(){
Connection conn = null;
if(pool != null && pool.isActive()){
conn = pool.getCurrentConnecton();
}
return conn;
}
}
- package pool;
- public class Client {
- public static void main(String[] args) throws InterruptedException {
- // 初始化連接池
- Thread t = init();
- t.start();
- t.join();
- ThreadConnection a = new ThreadConnection();
- ThreadConnection b = new ThreadConnection();
- ThreadConnection c = new ThreadConnection();
- Thread t1 = new Thread(a);
- Thread t2 = new Thread(b);
- Thread t3 = new Thread(c);
- // 設置優先級,先讓初始化執行,模擬 線程池 先啟動
- // 這里僅僅表面控制了,因為即使t 線程先啟動,也不能保證pool 初始化完成,為了簡單模擬,這里先這樣寫了
- t1.setPriority(10);
- t2.setPriority(10);
- t3.setPriority(10);
- t1.start();
- t2.start();
- t3.start();
- System.out.println("線程A-> "+a.getConnection());
- System.out.println("線程B-> "+b.getConnection());
- System.out.println("線程C-> "+c.getConnection());
- }
- // 初始化
- public static Thread init() {
- Thread t = new Thread(new Runnable() {
- @Override
- public void run() {
- IConnectionPool pool = initPool();
- while(pool == null || !pool.isActive()){
- pool = initPool();
- }
- }
- });
- return t;
- }
- public static IConnectionPool initPool(){
- return ConnectionPoolManager.getInstance().getPool("testPool");
- }
- }
package pool;
public class Client {
public static void main(String[] args) throws InterruptedException {
// 初始化連接池
Thread t = init();
t.start();
t.join();
ThreadConnection a = new ThreadConnection();
ThreadConnection b = new ThreadConnection();
ThreadConnection c = new ThreadConnection();
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
Thread t3 = new Thread(c);
// 設置優先級,先讓初始化執行,模擬 線程池 先啟動
// 這里僅僅表面控制了,因為即使t 線程先啟動,也不能保證pool 初始化完成,為了簡單模擬,這里先這樣寫了
t1.setPriority(10);
t2.setPriority(10);
t3.setPriority(10);
t1.start();
t2.start();
t3.start();
System.out.println("線程A-> "+a.getConnection());
System.out.println("線程B-> "+b.getConnection());
System.out.println("線程C-> "+c.getConnection());
}
// 初始化
public static Thread init() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
IConnectionPool pool = initPool();
while(pool == null || !pool.isActive()){
pool = initPool();
}
}
});
return t;
}
public static IConnectionPool initPool(){
return ConnectionPoolManager.getInstance().getPool("testPool");
}
}
小結 :
1.連接池誕生原因是,如果每次都從數據庫獲得連接,時間比較長,因此我們提前做建立一些連接,放在連接池里面,每次都從里面取
2.上面僅僅寫了連接池基本原理,關於多線程下連接池的管理沒寫,后面對多線程操作熟練了添加吧


