自己试着写数据库连池
来源:互联网 发布:c 语言学生管理系统 编辑:程序博客网 时间:2024/05/22 10:34
1.连接池配置属性DBbean:里面存放可以配置的一些属性
2.连接池接口IConnectionPool:里面定义一些基本的获取连接的一些方法
3.接口实现ConnectionPool:对上面操作进行实现,并加入一些其他方法
4.连接池管理ConnectionPoolManager:管理所有的不同的连接池,所有的连接都能通过这里进行获得连接
5.另外还有几个测试类,和连接信息模拟的类,这里就不进行xml 和配置文件信息的读取了
DBbean
package com.www.connectionPool1;public class DBbean { public DBbean(){} public void setDriverName(String driverName) { this.driverName = driverName; } public void setUrl(String url) { this.url = url; } public void setUserName(String userName) { this.userName = userName; } public void setPassword(String password) { this.password = password; } public void setPoolName(String poolName) { this.poolName = poolName; } 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 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 long getConnTimeOut() { return connTimeOut; } public void setConnTimeOut(long connTimeOut) { this.connTimeOut = connTimeOut; } public int getMaxActiveConnections() { return maxActiveConnections; } public void setMaxActiveConnections(int maxActiveConnections) { this.maxActiveConnections = maxActiveConnections; } 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 boolean isCheakPool() { return isCheakPool; } public void setCheakPool(boolean isCheakPool) { this.isCheakPool = isCheakPool; } 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 String getDriverName() { return driverName; } public String getUrl() { return url; } public String getUserName() { return userName; } public String getPassword() { return password; } public String getPoolName() { return poolName; } }
IConnectionPool
package com.www.connectionPool1;import java.sql.Connection;import java.sql.SQLException;public interface IConnectionPool { // 获得连接 public Connection getConnection(); // 获得当前连接 public Connection getCurrentConnection(); // 回收连接 public void releaseConn(Connection conn)throws SQLException; // 销毁清空 public void destroy(); // 连接池是活动状态 public boolean isActive(); // 定时器,检查连接池 public void cheackPool();}
ConnectionPool
package com.www.connectionPool1;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) throws SQLException { super(); this.dbBean = dbBean; init(); cheackPool(); } public void init() throws SQLException { 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) { // TODO Auto-generated catch block e.printStackTrace(); } } private Connection newConnection() throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub Connection conn = null; if (dbBean != null) { Class.forName(dbBean.getDriverName()); conn = DriverManager.getConnection(dbBean.getUrl(), dbBean.getUserName(), dbBean.getPassword()); } return conn; } public synchronized Connection getConnection() { // TODO Auto-generated method stub 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 (Exception e) { e.printStackTrace(); } return conn; } // 获得当前连接 public Connection getCurrentConnection() { // TODO Auto-generated method stub Connection conn = threadLocal.get(); if (!isValid(conn)) { conn = getConnection(); } return null; } // 判断连接是否可用 private boolean isValid(Connection conn) { // TODO Auto-generated method stub try { if (conn == null || conn.isClosed()) { return false; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } // 释放连接 public void releaseConn(Connection conn) throws SQLException { // TODO Auto-generated method stub if(isValid(conn)&&!(freeConnection.size()>dbBean.getMaxConnections())){ freeConnection.add(conn); activeConnection.remove(0); contActive--; threadLocal.remove(); // 唤醒所有正待等待的线程,去抢连接 notifyAll(); } } //销毁连接池 public synchronized void destroy() { // TODO Auto-generated method stub for(Connection conn:freeConnection){ try{ if(isValid(conn)){ conn.close(); } }catch(Exception e){ e.printStackTrace(); } } for(Connection conn:activeConnection){ try{ if(isValid(conn)){ conn.close(); } }catch(Exception e){ e.printStackTrace(); } } isActive = false; contActive =0; } // 连接池状态 public boolean isActive() { // TODO Auto-generated method stub return isActive; } // 定时检查连接池情况 public void cheackPool() { // TODO Auto-generated method stub if(dbBean.isCheakPool()){ new Timer().schedule(new TimerTask(){ @Override public void run() { // TODO Auto-generated method stub // 1.对线程里面的连接状态 // 2.连接池最小 最大连接数 // 3.其他状态进行检查,因为这里还需要写几个线程管理的类,暂时就不添加了 System.out.println("空线池连接数:"+freeConnection.size()); System.out.println("活动连接数::"+activeConnection.size()); System.out.println("总的连接数:"+contActive); } },dbBean.getLazyCheck(),dbBean.getPeriodCheck() ); } }}
package com.www.connectionPool1;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; try { pool = new ConnectionPool(bean); if(pool != null){ pools.put(bean.getPoolName(), pool); System.out.println("Info:Init connection successed ->" +bean.getPoolName()); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } // 获得连接,根据连接池名字 获得连接 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 com.www.connectionPool1;import java.util.ArrayList;import java.util.List;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 com.www.connectionPool1;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() { 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 com.www.connectionPool1;import java.sql.Connection;/** * 模拟线程启动,去获得连接 * @author Ran * */ public class ThreadConnection implements Runnable{ private IConnectionPool pool; 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.getCurrentConnection(); } return conn; } }
0 0
- 自己试着写数据库连池
- asp连数据库
- JdBC连数据库
- asp连SQL数据库
- .net中连数据库
- 连到SQL数据库
- 直连数据库
- jsp连sql数据库
- JDBC连Oracle数据库
- java 连执着数据库
- Flex 连数据库
- 怎么连数据库
- c# 连 各种数据库
- jsp连数据库大全
- ado连数据库
- 配置Hibernate连数据库
- vbs连oracle数据库
- c++连数据库查询
- gsoap使用方法,解析wsdl文档
- js判断空对象
- 栈
- [LeetCode]Maximal Square
- Drawcall优化策略
- 自己试着写数据库连池
- 挑战ISS,中国将自主建造宇宙空间站
- 指针小结
- SSH max authtries && SSH 配置文件简便地增强安全性
- OKhttp加载网络上的图片
- VBR ABR(1)
- 使用自定义工具链toolchain编译开源项目
- Android 接口回调个人见解
- XPath Cookbook-Axes(轴)