自己用Java编写的连接池
来源:互联网 发布:淘宝买处方药 编辑:程序博客网 时间:2024/05/26 07:29
参考网上各方面的资料,自己编写了一个连接池,不过连接池存在一些问题,希望大神们指点,不多说了,直接在代码上有注释:
package com.tyxh.mypool;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.util.Properties;import java.util.Vector;public class DBConnectFactory {private static DBConnectFactory factory = null; private static final int INIT_SIZE = 2; //连接池初始化大小private static final int MAX_SIZE = 10; //连接池的最大值private String driver;private String url;private String username;private String password;private long activeTime = 5000;private Vector<DBConnection> connectPool = null;//存放数据库连接的向量public DBConnectFactory() {//初始化连接的配置this.initProperties();//初始化数据库的连接池this.initPool();}private void initProperties() {Properties dbPro = new Properties();InputStream input = this.getClass().getResourceAsStream("db.properties");try {dbPro.load(input);this.driver = dbPro.getProperty("driver");this.url = dbPro.getProperty("url");this.username = dbPro.getProperty("username");this.password = dbPro.getProperty("password");} catch (IOException e) {e.printStackTrace();}}private void initPool() {if(null == connectPool) {//创建数据库连接池connectPool = new Vector<DBConnection>(INIT_SIZE);//循环创建数据库连接for (int i = 0; i < INIT_SIZE; i++) {DBConnection db = new DBConnection(driver, url, username, password);System.out.println("创建了DBConnection连接");connectPool.add(db);}}}public static synchronized DBConnectFactory getDBConnectFactory() {if(null == factory) {factory = new DBConnectFactory();}return factory;}public DBConnection createNewConectionTimer() {//此方法的作用是:当获取连接的时候,如果连接不够了,才会执行这个方法创建连接synchronized (connectPool) {DBConnection db = new DBConnectionTimer(driver, url, username, password, activeTime);System.out.println("创建了DBConnectionTimer连接");connectPool.add(db);return db;}}public Connection getConnection() {System.out.println("此时连接池中还有的连接数: " + connectPool.size());synchronized (connectPool) {Connection conn = null;DBConnection db = null;while(true) {//循环查找空闲的连接,直到找到位置for (int i = 0; i < connectPool.size(); i++) {db = connectPool.get(i);if(!db.isUsed()) {System.out.println("有空闲的连接");//此连接处于空闲状态if(db instanceof DBConnectionTimer) {System.out.println("取得的链接是DBConnectionTimer");//如果db是DBConnectionTimer对象DBConnectionTimer dbTimer = (DBConnectionTimer)db;dbTimer.cacel(); //取消定时conn = db.getConn();db.setUsed(true); //设置此链接繁忙状态return conn;} else {System.out.println("取得的连接是DBConnection");//如果db是DBConnection对象conn = db.getConn();db.setUsed(true); //设置此链接繁忙状态return conn;}}}System.out.println("没有空闲的连接");//如果没有找到空闲的连接,则创建连接if(null == conn && connectPool.size() < this.MAX_SIZE) {//如果连接池的大小小于要求的最大连接数,才可以创建db = this.createNewConectionTimer();conn = db.getConn();db.setUsed(false);//新创建的连接设置为空闲状态return conn;}//如果连接池的大小达到了最大连接数if(null == conn && connectPool.size() == this.MAX_SIZE) {System.out.println("连接池满了");try {//进行等待,知道有链接进入空闲状态connectPool.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}public void releaseConnection(Connection conn) {synchronized (connectPool) {for (int i = 0; i < connectPool.size(); i++) {DBConnection db = connectPool.get(i);if(db instanceof DBConnectionTimer) {DBConnectionTimer dbTimer = (DBConnectionTimer) db;DBConTimerTask task = new DBConTimerTask(connectPool, dbTimer);dbTimer.tick(task);System.out.println("释放了DBConnectionTimer的对象");}else {//固定的连接,一直存在if(conn == db.getConn()) {db.setUsed(false);connectPool.notify();System.out.println("释放了DBConnection的对象");break;}}}}}}
package com.tyxh.mypool;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBConnection {private String driver;private String url;private String username;private String password;private boolean isUsed;private Connection conn;public DBConnection(String driver,String url,String username,String password){this.driver = driver;this.url = url;this.username = username;this.password = password;this.isUsed = false;//创建数据库连接this.createConnection();}private void createConnection() {try {Class.forName(this.driver);conn = DriverManager.getConnection(url, username, password);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}public String getDriver() {return driver;}public void setDriver(String driver) {this.driver = driver;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public boolean isUsed() {return isUsed;}public void setUsed(boolean isUsed) {this.isUsed = isUsed;}public Connection getConn() {return conn;}public void setConn(Connection conn) {this.conn = conn;}}
package com.tyxh.mypool;import java.util.Timer;public class DBConnectionTimer extends DBConnection {private long activeTime;private Timer timer;public DBConnectionTimer(String driver, String url, String username,String password, long activeTime) {super(driver, url, username, password);this.activeTime = activeTime;timer = new Timer();}public void tick(DBConTimerTask task) {try{this.timer.schedule(task, activeTime);System.out.println("定时开始");} catch(IllegalStateException e) {//e.printStackTrace();System.err.println("已经存在task了");}}public void cacel(){this.timer.cancel();System.out.println("取消定时");}}
package com.tyxh.mypool;import java.sql.SQLException;import java.util.TimerTask;import java.util.Vector;public class DBConTimerTask extends TimerTask {private Vector<DBConnection> connectPool = null;private DBConnectionTimer dbTimer;public DBConTimerTask(Vector<DBConnection> connectPool,DBConnectionTimer dbTimer) {super();this.connectPool = connectPool;this.dbTimer = dbTimer;}@Overridepublic void run() {//将过期的数据库连接移除try {dbTimer.getConn().close();} catch (SQLException e) {e.printStackTrace();}connectPool.remove(dbTimer);System.out.println("移除超出生命周期的数据库连接!");}}
package com.tyxh.mypool;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class MulTest extends Thread {@Overridepublic void run() {DBConnectFactory factory = DBConnectFactory.getDBConnectFactory();Connection conn = factory.getConnection();try {Statement state = conn.createStatement();String sql = "select count(*) from employees";ResultSet rs = state.executeQuery(sql);while(rs.next()){System.out.println(rs.getInt(1));}} catch (SQLException e) {e.printStackTrace();} finally {factory.releaseConnection(conn);} }}
package com.tyxh.mypool;import java.sql.Connection;public class MainTest {public static void main(String[] args) {MulTest mul1 = new MulTest();mul1.start();MulTest mul2 = new MulTest();mul2.start();MulTest mul3 = new MulTest();mul3.start();MulTest mul4 = new MulTest();mul4.start();MulTest mul5 = new MulTest();mul5.start();MulTest mul6 = new MulTest();mul6.start();MulTest mul7 = new MulTest();mul7.start();MulTest mul8 = new MulTest();mul8.start();MulTest mul9 = new MulTest();mul9.start();MulTest mul10 = new MulTest();mul10.start();MulTest mul11 = new MulTest();mul11.start();MulTest mul12 = new MulTest();mul12.start();}}
#db.properties #this properties is for database connectdriver=oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:@localhost:1521:XEusername=hrpassword=hr
- 自己用Java编写的连接池
- 利用Java编写自己的线程池
- 用JAVA编写自己的机器人
- 编写自己的动态连接库.so
- 自己编写Python连接MySQL的支持
- 用Java编写自己的机器人 Robot类的应用
- java线程池---编写自己的线程池
- 用JAVA编写自己的机器人,然后一起“厮杀”
- 自己用Java编写的简易计算器源代码
- 【造轮子】用java编写属于自己的mvc---前言
- 用Java编写自己的机器人,为你承担苦力
- 用java robot编写自己的机器人,实现自动测试
- [Java]编写自己的Matrix矩阵类
- 用xml配置自己的连接池
- 自己编写的简单的线程池
- Java:如何编写自己的Java类加载器
- 数据库连接池编写自己的jdbc框架
- 编写自己的jdbc数据库连接池
- hibernate3种状态引起的问题
- android电池(五):电池 充电IC(PM2301)驱动分析篇
- 详解MySQL中EXPLAIN解释命令
- 关于Flash air实现Android原生Activity生命周期函数的方法
- 71道经典Android面试题和答案--重要知识点都涉及到了
- 自己用Java编写的连接池
- (转)Android杂谈--内存泄露(1)--contentView缓存使用与ListView优化
- Android仿Iphone通知角标的实现(二)
- SQL Server与MySQL分页
- JS 控制文本框只能输入数字方法
- 带CheckBox的TreeView
- EJB到底是什么东东
- 母函数讲解及应用
- uva 10066