连接池原理示例代码
来源:互联网 发布:js移动端手指滑动切换 编辑:程序博客网 时间:2024/04/30 07:29
package cn.jzy.dbpool;import java.lang.reflect.Proxy;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.DriverManager;import java.util.UUID;import java.util.Vector;public class DataSource {private Vector<ConnectionContext> dbPool;private int maxConnections = 100;private int waitTimeOut = 1000;private int incrementalConnection = 5;private int initConnection = 5;private int waitTimes = 10;private String nowConnectionId = "";private String driverStr = "";private String connectionStr = "";private String dbUser = "";private String dbPassword = "";public Vector<ConnectionContext> getDbPool() {return dbPool;}public void setDbPool(Vector<ConnectionContext> dbPool) {this.dbPool = dbPool;}public int getMaxConnections() {return maxConnections;}public void setMaxConnections(int maxConnections) {this.maxConnections = maxConnections;}public int getWaitTimeOut() {return waitTimeOut;}public void setWaitTimeOut(int waitTimeOut) {this.waitTimeOut = waitTimeOut;}public int getIncrementalConnection() {return incrementalConnection;}public void setIncrementalConnection(int incrementalConnection) {this.incrementalConnection = incrementalConnection;}public int getInitConnection() {return initConnection;}public void setInitConnection(int initConnection) {this.initConnection = initConnection;}public int getWaitTimes() {return waitTimes;}public void setWaitTimes(int waitTimes) {this.waitTimes = waitTimes;}public String getNowConnectionId() {return nowConnectionId;}public void setNowConnectionId(String nowConnectionId) {this.nowConnectionId = nowConnectionId;}public String getDriverStr() {return driverStr;}public void setDriverStr(String driverStr) {this.driverStr = driverStr;}public String getConnectionStr() {return connectionStr;}public void setConnectionStr(String connectionStr) {this.connectionStr = connectionStr;}public String getDbUser() {return dbUser;}public void setDbUser(String dbUser) {this.dbUser = dbUser;}public String getDbPassword() {return dbPassword;}public void setDbPassword(String dbPassword) {this.dbPassword = dbPassword;}// 初始化连接池public void initPool() {dbPool = new Vector<ConnectionContext>();createConnections(getInitConnection());}// 创建连接池private void createConnections(int incremental) {for (int i = 0; i < incremental; i++) {if (dbPool.size() >= maxConnections) {break;}ConnectionContext conT = createConnection();if (conT != null) {dbPool.addElement(conT);}}}// 创建连接private ConnectionContext createConnection() {try {Class.forName(driverStr);Connection con = DriverManager.getConnection(connectionStr);if (dbPool.size() == 0) {DatabaseMetaData metaData = con.getMetaData();int driverMaxConnection = metaData.getMaxConnections();if (driverMaxConnection > 0&& getMaxConnections() > driverMaxConnection) {setMaxConnections(driverMaxConnection);}}ConnectionInvocationHandle handle = new ConnectionInvocationHandle();handle.setCon(con);String id = UUID.randomUUID().toString();handle.setConnectionId(id);Connection proxyCon = (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(),new Class[] { Connection.class }, handle);ConnectionContext conT = new ConnectionContext(proxyCon, id, false);conT.setHandle(handle);return conT;} catch (Exception e) {e.printStackTrace();}return null;}// 取得连接public synchronized Connection getConnection() {if (dbPool == null) {return null;}Connection con = getFreeConnection();int waitTime=0;while(con==null&&waitTime<waitTimes){waitTime++;wait(getWaitTimeOut());con=getFreeConnection();}return con;}// 获取空闲的连接private Connection getFreeConnection() {Connection con = findFreeConnection();if(con==null){createConnections(getIncrementalConnection());con=findFreeConnection();if(con==null){return null;}}return con;}// 找到空闲的连接private Connection findFreeConnection() {Connection con = null;ConnectionContext conT = null;try {for (int i = 0; i < dbPool.size(); i++) {conT = dbPool.elementAt(i);if (testConnection(conT.getCon())) {if (!conT.isBusy()) {conT.setBusy(true);System.out.println("使用了第" + i + "个连接处的数据。");return conT.getCon();}} else {conT.getHandle().closeConnection();dbPool.remove(conT);}}return null;} catch (Exception e) {e.printStackTrace();return null;}}//测试连接是否存在private boolean testConnection(Connection con) {try {con.getMetaData();return true;} catch (Exception e) {e.printStackTrace();return false;}}public synchronized void refreshConnections() {if (dbPool == null) {return;}for (int i = 0; i < dbPool.size(); i++) {ConnectionContext conT = (ConnectionContext) dbPool.elementAt(i);if (conT.isBusy()) {wait(8000);}ConnectionContext _conT = this.createConnection();conT.setCon(_conT.getCon());conT.setBusy(false);conT.setHandle(_conT.getHandle());}}private void wait(int mSeconds) {try {Thread.sleep(mSeconds);} catch (InterruptedException e) {}}public synchronized void closeConnectionPool() {if (dbPool == null) {return;}ConnectionContext conT = null;for (int i = 0; i < dbPool.size(); i++) {conT = (ConnectionContext) dbPool.elementAt(i);if (conT.isBusy()) {wait(8000);}conT.getHandle().closeConnection();conT.setCon(null);dbPool.remove(conT);}}}
package cn.jzy.dbpool;import java.sql.Connection;public class ConnectionContext {private Connection con;private String connectionId;private boolean isBusy;private ConnectionInvocationHandle handle;public ConnectionContext(Connection con, String connectionId,boolean isBusy, ConnectionInvocationHandle handle) {super();this.con = con;this.connectionId = connectionId;this.isBusy = isBusy;this.handle = handle;}public ConnectionContext(Connection con, String connectionId, boolean isBusy) {super();this.con = con;this.connectionId = connectionId;this.isBusy = isBusy;}public Connection getCon() {return con;}public void setCon(Connection con) {this.con = con;}public String getConnectionId() {return connectionId;}public void setConnectionId(String connectionId) {this.connectionId = connectionId;}public boolean isBusy() {return isBusy;}public void setBusy(boolean isBusy) {this.isBusy = isBusy;}public ConnectionInvocationHandle getHandle() {return handle;}public void setHandle(ConnectionInvocationHandle handle) {this.handle = handle;}}
package cn.jzy.dbpool;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.sql.Connection;import java.util.Vector;public class ConnectionInvocationHandle implements InvocationHandler {private Connection con;private Vector<ConnectionContext> pool;private String connectionId;public Connection getCon() {return con;}public void setCon(Connection con) {this.con = con;}public Vector<ConnectionContext> getPool() {return pool;}public void setPool(Vector<ConnectionContext> pool) {this.pool = pool;}public String getConnectionId() {return connectionId;}public void setConnectionId(String connectionId) {this.connectionId = connectionId;}//关闭连接public void closeConnection(){try {con.close();} catch (Exception e) {e.printStackTrace();}}//获取连接ID的位置public int getVectorID(){for(int i=0;i<pool.size();i++){ConnectionContext conT=pool.elementAt(i);if(conT.getConnectionId().equals(connectionId)){return i;}}return 0;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object returnObj=null;if(method.getName().equals("close")){ConnectionContext conT=pool.elementAt(getVectorID());conT.setBusy(false);}else{returnObj=method.invoke(con, args);}return returnObj;}}
package cn.jzy.dbpool;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.UUID;import cn.jzy.ioc.IoCFactory;public class TestMain {public static void main(String[] args) {try {//方法一,直接通过ODBC获取Access数据库连接//Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//Connection con=DriverManager.getConnection("jdbc:odbc:jzyAccess");//方法二,通过自定义数据库连接池+ODBC连接Access数据库//DataSource ds=new DataSource();//ds.setDriverStr("sun.jdbc.odbc.JdbcOdbcDriver");//ds.setConnectionStr("jdbc:odbc:jzyAccess");//ds.initPool();//Connection con=ds.getConnection();IoCFactory factory = new IoCFactory();DataSource ds=(DataSource)factory.getBean("myds");ds.initPool();Connection con=ds.getConnection();Statement stmt=con.createStatement();String sql="select * from student";ResultSet rs=stmt.executeQuery(sql);while(rs.next()){System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getString(4));}rs.close();stmt.close();//con.close();} catch (Exception e) {e.printStackTrace();}}}