代码是老师写的,我就写写我自己的一些理解,所以还是转载(.=^・ェ・^=)
先说说数据库连接池的好处:
1、建立一次数据库连接需要0.5-1s的时间,节省时间;
2、资源复用,只要第一次初始化10个连接,后面就可以一直用了;
3、优化系统性能。。
下面是代码:
package conn;
import java.sql.*;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import conn.Connec;
public class Base{
public static int POOL_SIZE = 10;//连接的数量
private static String CONN_URL = "jdbc:oracle:thin@localhost:1521:orcl";
//连接字符串:协议名(jdbc)+子协议名(oracle:thin)+子名称(@ip地址localhost:jdbc连接默认端口1521:数据库的名字orcl)
private static String USER_NAME = "ben";
private static String PASSWORD = "pass";//私有属性以连接数据库
private static List<Connec> list = new ArrayList<Connec>();
//建立对象为connec的list ,就是代理类的对象list
static {//获得数据库连接,初始化10个数据库连接,放到list里面
try{
Class.forName("oracle.jdbc.driver.OracleDriver");//加载类加载器
for(int i = 0;i<POOL_SIZE;i++){
list.add(new Connec(DriverManager.getConnection(CONN_URL,USER_NAME,PASSWORD)));//新建connec对象,创建新的连接,放到list里面
}
System.out.println("池初始化完毕,共有"+POOL_SIZE+"个可用连接!");
}catch(Exception e){
e.printStackTrace();
}
}
public static Connec getConn(){//使用conn连接
for(Connec conn :list){
if(conn.useable){
conn.useable = false;
POOL_SIZE--;
System.out.println("取走一个,池中现有"+POOL_SIZE+"个可用连接!");
return conn;
}
}
System.out.println("资源池已用尽,请等待!");
return null;
}
public static void close(ResultSet rs,PreparedStatement pstmt,Connection conn){
try{//关闭资源
if(rs != null && !rs.isClosed()){
rs.close();
}
if(pstmt != null && !pstmt.isClosed()){
pstmt.close();
}
if(conn != null && !conn.isClosed()){
conn.close();//调用的是connec里面的close方法
}
}catch(Exception e){
e.printStackTrace();
}
}
public void finalize(){//gc运行时会调用此方法,当系统内存空间不够的时候也会调用这个方法释放内存
for(Connec conn : list){
conn.destory();
}
}
/**
* 程序运行时,static静态块就会被运行,实例化10个数据库连接(这里用到了代理技术),
* 用conn=Base.getConn时,将conn对象的useable置为false,池连接数量-1,返回一个连接
* 用 Base.close()关闭资源
*/
}
下面这个使用代理技术写的connec对象,继承了connection端口。
package conn;
import java.sql.*;
import java.util.*;
public class Connec implements Connection{
public boolean useable;
private Connection conn;
public Connec(Connection conn){
this.conn = conn;
this.useable = true;
}
public void destory(){
try{
if(conn != null && !conn.isClosed()){
conn.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
public void close(){
this.useable = true;
Base.POOL_SIZE++;
System.out.println("归还一个,池中现有"+Base.POOL_SIZE+"个可用连接!");
}//重写了collection的close方法。
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
//未实现的方法太多了,就不放上来了
}
举个调用的时候的例子: public User login(User user) throws Exception {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = Base.getConn();//调用getConn方法获得连接
String sql = "select * from exam_user where uno = ? and upass = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getUno());
pstmt.setString(2, user.getUpass());
rs = pstmt.executeQuery();
if (rs.next()) {
user.setUleval(rs.getInt("uleval"));
return user;
}
} catch (Exception e) {
throw e;
} finally {
Base.close(rs, pstmt, conn);//调用close方法关闭资源;
}
return null;
}