连接池原理示例代码

来源:互联网 发布: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();}}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出租屋没窗户很闷怎么办 二手房交税后房主不卖怎么办 二房东收不到租拖欠房租怎么办 房东不给换门锁怎么办 租房到期房东联系不到租客怎么办 廉租房名下有车怎么办 路边停车收忘记交费怎么办 考编忘记交费了怎么办 深圳公租房入库了接下来怎么办 公租房5年以后怎么办 教务系统密码忘记了怎么办 林科大教务处密码忘记了怎么办 智学号密码忘了怎么办 正方教务管理系统忘记密码怎么办 正方教务系统忘记密码怎么办 教务网密码忘了怎么办 电动车解除限速报警器不响怎么办 公租房住满5年怎么办 广州公租房收入超标怎么办 深圳法院拍卖房子不肯搬走怎么办 上海奉贤公租房的期满怎么办 公租房人口少了怎么办 公租房太远了怎么办 商品房没有门厅业主该怎么办 公帐付款备注错了怎么办 我是农村户口在外省交社保怎么办 北京租房遇到黑中介怎么办 上海租房子不让带孩子怎么办 租的房子没窗户怎么办 北京安河桥安河家园租房被骗怎么办 领完失业金后怎么办 北京公租房太小怎么办 申请公租房太小怎么办 房东电费收贵了怎么办 申请公租房工资超了怎么办 重庆公租房工资超了怎么办 公租房申请父母房子贷款怎么办 公产房父母去世办公证怎么办 动迁过程中承租人去世了怎么办 公租房的房间带阳台怎么办 公租房合同到期没有社保怎么办