二十四、并发编程之简易数据连接池

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29479041/article/details/85122557
public class MyDataSource {
	private LinkedList<Connection> pool = new LinkedList(); //链表放连接池用
	private static final int INIT_CONNECTIONS = 10;//初始化连接数
	private  static final String DRIVER_CLASS="com.mysql.jdbc.Driver";//驱动
	private  static final String USER="";//用户
	private  static final String PASSWORD="";// 密码
	private  static final String URL="";//地址

	private Lock lock = new ReentrantLock();
	Condition c1 = lock.newCondition();

	static {
		try {
			Class.forName(DRIVER_CLASS);//加载驱动
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	public MyDataSource() {
		for(int i =0; i<INIT_CONNECTIONS;i++) {
			try {
				Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);//创建连接
				pool.addLast(conn);//将连接放进连接池
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	//获取连接
	public Connection getConnect() {
		Connection result = null;
		lock.lock();
		try {
			while(pool.size()<=0) {//如果连接池里的连接小于等于0,就得让获取连接的线程等待
				try {
					c1.await();//让获取连接的线程等待
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			if(!pool.isEmpty()) {//连接池不为空
				result = pool.removeFirst();//拿到第一个连接
			}
			return result;
		}finally {
			lock.unlock();
		}
	}
	//释放连接
	public void release(Connection conn) {
		if(conn != null) {
			lock.lock();
			try {
				pool.addLast(conn);//将连接放回到连接池
				c1.signal();//叫醒获取连接的线程
			}finally {
				lock.unlock();
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_29479041/article/details/85122557
今日推荐