连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
这种把连接“汇集”起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC 连接的 1 个线程。当不处理事务时,这个连接就会闲置。相反,连接池允许闲置的连接被其它需要的线程使用。
事实上,当一个线程需要用 JDBC 对某一个数据库操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用。
在使用JDBC进行与数据库有关的应用开发中,数据库连接的管理是一个难点。很多时候,连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用效率的瓶颈。对于众多用户访问的Web应用,采用数据库连接技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很多。
连接池要有一个容器来管理创建的连接, 保存对象的容器要用集合, Collection对象, 将来用户使用完后这个Connection, 连接池的对象处于等待状态, 以供下一个用户来使用, 连接池要自动收回没有被池化的对象,达到重复使用. 使用连接池的优点是减少连接创建时间,简化的编程模式和受控的资源使用.
使用配置文件读取信息
connectionPool.properties
url=jdbc:oracle:thin:127.0.0.1:1521:oral
driverClassName=oracle.jdbc.driver.OracleDriver
username=scott
password=tiger
poolSize=100
connectionPool.java
package com.deng.connectionPool;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Vector;
/**
* @author: 邓永胜
* @time: Jan 17, 2010 - 9:15:48 AM
*/
public class connectionPool {
private Vector<Connection> pool;
private String url;
private String username;
private String password;
private String driverClassName;
private int poolSize = 1; //连接池的大小,也就是连接池中有多少个数据库连接。
private static connectionPool instance = null;
public synchronized Connection getConnection() {
if(pool.size()>0){
Connection conn = pool.get(0);
pool.remove(conn);
return conn;
}else{
return null;
}
}
//创建一个私有的方法, 当实例化这个对象时进行初始化
private connectionPool() {
init();
}
/*
* 运用单例模式,返回一个私有的static实例
*/
public static connectionPool getInstance(){
if(instance == null) {
instance = new connectionPool();
}
return instance;
}
/*
* 初始化连接池, 先创建一个容器对象,来装连接池的对象 poolSize为要创建的连接池的连接个数
*/
public void init() {
pool = new Vector<Connection>(poolSize);
readConfig();
addConnection();
}
/*
* 释放连接的对象,将其放回到连接池中
*/
public synchronized void release(Connection conn){
pool.add(conn);
}
/*
* 关闭连接池中的所有对象
*/
public synchronized void closePool(){
for(int i = 0 ; i<pool.size(); i++){
Connection conn = pool.get(i);
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
pool.remove(i);
}
}
private void addConnection() {
Connection conn = null;
for(int i = 0; i<poolSize; i++){
try {
Class.forName(driverClassName);
conn = DriverManager.getConnection(url, username, password);
pool.add(conn); //往池中加连接对象
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private void readConfig() {
// 获取工程的路径:D:/MyEclipse Files/Business/ConnectionPool
String path = System.getProperty("user.dir")
+ "//src//com//deng//connectionPool//connectionPool.properties";
try {
FileInputStream fis = new FileInputStream(path);
Properties properties = new Properties();
properties.load(fis);
this.url = properties.getProperty("url");
this.username = properties.getProperty("username");
this.password = properties.getProperty("password");
this.driverClassName = properties.getProperty("driverClassName");
this.poolSize = Integer.parseInt(properties.getProperty("poolSize"));
// System.out.println(url + username + password + driverClassName);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}