数据库连接池

本文介绍了一个简单的数据库连接池实现方案,通过预创建多个数据库连接并维护在一个列表中,以达到提高应用程序性能的目的。该方案利用代理技术实现了连接的复用,并提供了获取和释放连接的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码是老师写的,我就写写我自己的一些理解,所以还是转载(.=^・ェ・^=)

先说说数据库连接池的好处:

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;
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值