public class ConnectionPool {
private String driver;
private String url;
private String user;
private String password;
private String testTable;
private int initalConNum = 1;//连接池的初始大小
private int increatmentalConNum = 3;//自动增长的数量
private int maxConn = 20; //连接池最大的大小
private Vector<PooledConnection> connections = null;//存放连接池中链接数据库的向量
public ConnectionPool(String driver, String url, String user, String password) {
this.driver = driver;
this.url = url;
this.user = user;
this.password = password;
try {
createPool();
} catch (Exception e) {
e.printStackTrace();
}
}
public int getInitalConNum() {
return initalConNum;
}
public int getIncreatmentalConNum() {
return increatmentalConNum;
}
public int getMaxConn() {
return maxConn;
}
public String getTestTable() {
return testTable;
}
public void setTestTable(String testTable) {
this.testTable = testTable;
}
/**
* 创建一个数据库连接池
*
* @throws Exception
*/
public synchronized void createPool() throws Exception {
if (connections != null) {
return;
}
//实例化数据库驱动
Driver _driver = (Driver) Class.forName(driver).newInstance();
//注册驱动
DriverManager.registerDriver(_driver);
//创建保存连接的向量
this.connections = new Vector<PooledConnection>();
//根据初始化中设置的值来创建连接
createConnections(initalConNum);
}
/**
* 创建连接
*
* @param numConn 连接数量
*/
private void createConnections(int numConn) {
for (int i = 0; i < numConn; ++i) {
if (connections.size() >= maxConn) {
break;
}
try {
connections.addElement(new PooledConnection(newConnection()));
} catch (SQLException sqle) {
sqle.printStackTrace();
}
}
}
/**
* 创建一个新的数据库连接
*
* @return
* @throws SQLException
*/
private Connection newConnection() throws SQLException {
Connection conn = DriverManager.getConnection(url, user, password);
//如果是第一次创建数据库,即检查数据库,获取此数据库允许支持的最大连接数目
if (connections.size() == 0) {
DatabaseMetaData metaData = conn.getMetaData();
int driverMaxConn = metaData.getMaxConnections();
if (driverMaxConn > 0 && maxConn > driverMaxConn) {
maxConn = driverMaxConn;
}
}
return conn;
}
public synchronized PooledConnection getConnection() {
if (connections == null) {
return null;
}
PooledConnection conn = getFreeConnection();
while (conn == null) {//conn==null表示没有可用的连接,表示所有连接正在使用当中
_wait(250);
conn = getFreeConnection();
}
return conn;
}
private PooledConnection getFreeConnection() {
PooledConnection conn = findFreeConnection();
if (conn == null) {
System.out.println("目前数据库中没有可用的连接,创建一些连接");
createConnections(increatmentalConNum);
conn = findFreeConnection();
if (conn == null) {
return null;
}
}
return conn;
}
/**
* 从所有的连接中查找一个可用的连接
*
* @return
*/
private PooledConnection findFreeConnection() {
for (int i = 0, size = connections.size(); i < size; ++i) {
PooledConnection pc = connections.elementAt(i);
if (!pc.getIsBusy()) {
Connection conn = pc.getConnection();
pc.setIsBusy(true);
if (!isValid(conn)) {
try {
conn = newConnection();
pc.setConnection(conn);
} catch (SQLException sqle) {
sqle.printStackTrace();
connections.remove(i--);
continue;
}
}
return pc;
}
}
return null;
}
/**
* 判断连接是否可用
*
* @param conn
* @return
*/
public boolean isValid(Connection conn) {
try {
return conn.isValid(3000);
} catch (SQLException sqle) {
sqle.printStackTrace();
return false;
}
}
/**
* 返回一个数据库连接到连接池中,并把此连接置为空闲。
* 所有使用连接池获得的数据库连接均应在不使用此连接时返回它。
* @param conn
*/
public void returnConnection(Connection conn) {
if (connections == null) {
return;
}
PooledConnection pConn;
Enumeration<PooledConnection> enumera = connections.elements();
while (enumera.hasMoreElements()) {
pConn = enumera.nextElement();
if (conn == pConn.getConnection()) {
pConn.setIsBusy(false);
break;
}
}
}
/**
* 刷新所有连接池的对象
*/
public synchronized void refreshConnections() {
if (connections == null) {
return;
}
PooledConnection pConn;
Enumeration<PooledConnection> enumera = connections.elements();
while (enumera.hasMoreElements()) {
pConn = enumera.nextElement();
while (pConn.getIsBusy()) {
_wait(1000);
}
closeConnctionPool();
try {
pConn.setConnection(newConnection());
pConn.setIsBusy(false);
} catch (SQLException sqle) {
sqle.printStackTrace();
}
}
}
/**
* 关闭池中所有连接并清空连接池
*/
public void closeConnctionPool() {
if (connections == null) {
return;
}
PooledConnection pConn;
Enumeration<PooledConnection> enumera = connections.elements();
while (enumera.hasMoreElements()) {
pConn = enumera.nextElement();
if (pConn.getIsBusy()) {
_wait(5000);
}
closeConnction(pConn.getConnection());
connections.removeElement(pConn);
}
connections = null;
}
/**
* 关闭一个数据库连接
*
* @param conn
*/
private void closeConnction(Connection conn) {
try {
conn.close();
conn = null;
} catch (SQLException sqle) {
sqle.printStackTrace();
}
}
/**
* 使程序等待指定的秒数
*
* @param seconds
*/
private void _wait(int seconds) {
try {
Thread.sleep(seconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 打印连接池中所有连接的状态
*/
public void _print() {
System.out.println("total connections: " + connections.size());
for (int i = 0, size = connections.size(); i < size; i++) {
System.out.println(i + ": " + connections.get(i).getIsBusy());
}
}
/**
* 保存连接池对象的类
*/
// public class PooledConnection {
//
// private Connection conn = null;
// private boolean isBusy;
//
// public PooledConnection(Connection conn) {
// this.conn = conn;
// }
//
// public Connection getConnection() {
// return conn;
// }
//
// public void setConnection(Connection conn) {
// this.conn = conn;
// }
//
// public boolean isBusy() {
// return isBusy;
// }
//
// public void setIsBusy(boolean isBusy) {
// this.isBusy = isBusy;
// }
//
// public ResultSet executeQuery(String sql) throws SQLException {
// return conn.createStatement().executeQuery(sql);
// }
//
// public int executeUpdate(String sql) throws SQLException {
// return conn.createStatement().executeUpdate(sql);
// }
// }
}
public class DBManager {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/cloud_ap";
private static final String USER = "root";
private static final String PASSWORD = "root";
private static PooledConnection pConn;
private static ConnectionPool connPool;
private static DBManager dbManager;
private DBManager() {
if (dbManager != null) {
return;
}
connPool = new ConnectionPool(DRIVER, URL, USER, PASSWORD);
try {
connPool.createPool();
dbManager = this;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取一个数据库连接对象
* @return
*/
public static PooledConnection getConnection() {
if (dbManager == null) {
synchronized (DBManager.class) {
dbManager =new DBManager();
}
}
pConn = connPool.getConnection();
return pConn;
}
public static DBManager getDbManager(){
if (dbManager == null) {
synchronized (DBManager.class) {
new DBManager();
}
}
return dbManager;
}
/**
* 关闭连接池
*/
public void close() {
connPool.closeConnctionPool();
}
}
public boolean getMac(String mac) {
boolean flag = false;
String sql = "select * from ap_info where macaddr='" + mac + "'";
PooledConnection pConn = null;
Statement stmt = null;
ResultSet rs = null;
try {
pConn = DBManager.getConnection();
stmt = pConn.getConnection().createStatement();
rs = stmt.executeQuery(sql);
flag = rs.next();
} catch (SQLException sqle) {
System.out.println(sqle.getMessage());
sqle.printStackTrace();
} finally {
if (pConn != null) {
pConn.setIsBusy(false);
System.out.println("conn:"+pConn.getConnection());
}
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
} catch (SQLException sqle) {
System.out.println(sqle.getMessage());
sqle.printStackTrace();
}
}
return flag;
}