?? gddbconnectionpool.java
字號:
package com.gd.jdbc.impl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.gd.jdbc.DbConnectionPool;
public class GdDbConnectionPool implements DbConnectionPool {
private String DB_DRIVER = "com.mysql.jdbc.Driver";
private String DB_User = "root";
private String DB_PASSWD = "root";
private String DATASRC_URL = "jdbc:mysql://localhost/myApp";
static final int defaultMaxConnections = 10;//默認的連接池的大小
private List freeConnections;//存放目前空閑的連接,空閑池
private Map busyConnections;//存放目前正在使用的連接,繁忙池
private int maxConnections;//設(shè)定連接池的大小
/**
* 構(gòu)造函數(shù)
* @param numConnections
*/
public GdDbConnectionPool (int numConnections) {
maxConnections = numConnections;
freeConnections = null;
busyConnections = null;
}
/**
* 構(gòu)造函數(shù)
*/
public GdDbConnectionPool () {
maxConnections = defaultMaxConnections;
freeConnections = null;
busyConnections = null;
}
/* (non-Javadoc)
* @see com.gd.jdbc.DbConnectionPool#destroyConnPool()
*/
public void destroyConnPool() throws SQLException {
//假如還有正在使用的連接
if (busyConnections != null) {
Set set = busyConnections.entrySet();
Iterator iterator = set.iterator();
//銷毀正在使用的連接
while (iterator.hasNext()) {
Map.Entry map = (Map.Entry)iterator.next();
Connection conn = (Connection)map.getValue();
conn.close();
}
busyConnections = null;
}
//假如還有空閑的連接
if (freeConnections != null) {
//銷毀空閑的連接
for (int i = 0; freeConnections.size() > i; i++) {
Connection conn = (Connection)freeConnections.get(i);
conn.close();
}
freeConnections = null;
}
}
/* (non-Javadoc)
* @see com.gd.jdbc.DbConnectionPool#getConnection()
*/
public synchronized Connection getConnection() throws SQLException {
if (freeConnections == null)
throw new SQLException("連接池還沒有創(chuàng)建");
try {
//表示暫時沒有空閑的連接
if (freeConnections.size() == 0)
wait();
} catch(InterruptedException e) {
e.printStackTrace();
}
//獲取空閑池的連接
Connection conn = (Connection)freeConnections.get(0);
freeConnections.remove(0);//在空閑池里銷毀已經(jīng)獲取的連接
busyConnections.put(Thread.currentThread(), conn);//將已經(jīng)獲取的連接放在繁忙池里
return conn;
}
/* (non-Javadoc)
* @see com.gd.jdbc.DbConnectionPool#initConnPool()
*/
public void initConnPool() throws SQLException {
try {
freeConnections = new ArrayList(maxConnections);
busyConnections = new HashMap(maxConnections);
//創(chuàng)建連接,并放在連接池中
Class.forName(DB_DRIVER);
//conn = DriverManager.getConnection(DATASRC_URL, DB_User, DB_PASSWD);
//GdDbConnection con = new GdDbConnection(this);
for (int i = 0; i < maxConnections; i++) {
freeConnections.add(DriverManager.getConnection(DATASRC_URL, DB_User, DB_PASSWD));
}
} catch (Exception e) {
freeConnections = null;
busyConnections = null;
throw new SQLException(e.toString());
}
}
/* (non-Javadoc)
* @see com.gd.jdbc.DbConnectionPool#returnConnection()
*/
public synchronized void returnConnection() throws SQLException {
//從繁忙池中銷毀已經(jīng)返回的連接
Connection conn = (Connection)busyConnections.get(Thread.currentThread());
if (conn == null)
throw new SQLException("沒有發(fā)現(xiàn)繁忙池中有連接");
busyConnections.remove(Thread.currentThread());
//將已經(jīng)返回的連接重新放回空閑池中
freeConnections.add(conn);
notify();
}
/* (non-Javadoc)
* @see com.gd.jdbc.DbConnectionPool#setConnWitch(java.lang.String)
*/
public void setConnWitch(String onOrOff) throws Exception {
try {
//假如為ON,則表示初始化連接池
if ("ON".equalsIgnoreCase(onOrOff)) {
initConnPool();
//假如為OFF,則表示銷毀連接池
} else if ("OFF".equalsIgnoreCase(onOrOff))
destroyConnPool();
} catch (Exception e) {
e.printStackTrace();
}
}
/* (non-Javadoc)
* @see com.gd.jdbc.DbConnectionPool#setMaxConns(int)
*/
public void setMaxConns(int numConnections) {
maxConnections = numConnections;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -