Dbcp连接池

为什么使用连接池?

简言之:减少没必要的系统开销

凡是涉及到数据库访问的web应用,数据库连接管理是一个难点,也是未来大型应用性能优化的重点,如果对于连接资源管理混乱,将会使系统资源开销过大。制约大型应用性能的提升。

优化方案:使用连接池技术,将创建好的连接资源管理起来,当需要使用连接时,从连接池中获取,使用完毕之后将连接还回连接池,避免重复的创建和销毁连接资源,较少系统的开销。

怎样简单的使用连接池?

引入文件。百度云链接容易失效就不放,本博客仅用于个人学习,有想学的可以找我要文件,私信就行。

 

Dbcp 是连接池的一种实现方式

 1 导入dbcp 相关的jar包

2  导入dbcp的配置文件, 的dbcp.properties .

方法和前面一样。

再导入一个新的对应键。

 对工具类进行升级,稍后会对工具类那篇文章进行更新。

package util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;



public class jdbcUtil3 {
	//创建连接池
		static DataSource pool = null;
		//创建properties
		 static Properties  pro =  new Properties();
		 //创建Thread	local<Connection>,可以为同一个线程保存同一个连接,为不同线程保存不同的连接
		 private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
		 
		 //加载配置文件到流对象后创建连接池
		 static{
			InputStream is = null;
			try {
				//加载properties文件到properties对象中
				is = jdbcUtil3.class.getResourceAsStream("/conf/dbcp.properties");
				pro.load(is);
			//	Class.forName(pro.getProperty("driverClassName"));
			//创建连接池
				pool = BasicDataSourceFactory.createDataSource(pro);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 	
			finally{
				try {
					is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		//获取连接
		public static  Connection getConnection() throws Exception{
			Connection conn = tl.get();//获得当前线程中的连接
			//如果当前线程中没有连接,就获取连接(使用连接池)
			if(conn == null){//如果当前线程中没有连接
				String url = pro.getProperty("url");
				String user = "root";
				String password = "root123";	
				//创建连接
			    conn = pool.getConnection();
			    //将连接保存到当前线程
			    tl.set(conn);
			}
			return conn;	
		}
		//释放资源/关闭连接
		public static void release(ResultSet rs,PreparedStatement psm,Connection conn) throws SQLException{
			if(rs!=null){
				rs.close();
			}
			if(psm!=null){
				psm.close();
			}
			if(conn!=null){
				conn.close();
				//关闭连接时,将连接从当前线程中移出,防止,内存溢出
				tl.remove();
			}	
		}
}

测试一下吧:

package jdbc;

import java.sql.Connection;

import util.jdbcUtil3;

public class TestjdbcUtil3 {
	public static void main(String[] args) throws Exception {
		Connection conn = jdbcUtil3.getConnection();
		System.out.println(conn);
		Connection conn1 = jdbcUtil3.getConnection();
		System.out.println(conn1);
		Connection conn2 = jdbcUtil3.getConnection();
		System.out.println(conn2);
		Thread t1 = new Thread(){
			public void run(){
				Connection conn3;
				try {
				 conn3 =	jdbcUtil3.getConnection();
					System.out.println("t1: " +conn3);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		};
		t1.start();
	}
}

结果为:,,你没有看错,用连接池连接的,会有点不一样,不是干瘪的一行地址了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值