连接池学习笔记

连接:客户端 -> 服务器(数据库服务),物理连接,非常消耗资源
       连接频繁的开启和关闭,资源浪费
连接池:已经创建好连接,获得连接时,直接将连接池中随即返回一个连接。
DataSource(接口) - 数据源 Apache-DBCP连接池 BasicDataSource(实现类)
       C3P0 ComboPooledDataSource

连接池使用步骤:
       1.导包
       2.实现类 BasicDataSourceFactory BasicDataSource
       3.属性的注入 (直接使用配置文件)
       4.获得、关闭连接

一、DBCP连接池

DBCP — DataBase Connection Poll,使用 BasicDataSource(实现类)完成连接池的创建以及连接的获得与关闭。
1.手动注入信息

// 创建连接池对象 driver url username password
		BasicDataSource dataSource = new BasicDataSource();
		// 注入配置信息 - 属性
		dataSource.setDriverClassName("");
		dataSource.setUrl("");
		dataSource.setUsername("");
		dataSource.setPassword("");
		Connection conn = dataSource.getConnection();
		conn.close();  // 连接池获得的连接,必须要关闭

2.使用配置文件注入
注意:配置文件中的四个要素名称必须为:driverClassName、url、username、password

Properties pro = new Properties();
		try {
			pro.load(new FileInputStream(Demo02.class.getClassLoader().getResource("util/db.properties").getFile()));
			// 传入一个Properties对象(包含配置文件),自动读取、解析配置文件,获得相应的参数
			// 要求:配置文件中的key,要符合DBCP的规定
			DataSource dataSource = BasicDataSourceFactory.createDataSource(pro);
			// 向连接池获取连接
			Connection conn = dataSource.getConnection();
			Connection conn1 = JDBCUtils.getConnection();
			
			conn.close();  // 连接池获得的连接,必须要关闭
			conn1.close();
			
			System.out.println(conn); // Null,将连接返回给连接池,实现资源的重复使用
			System.out.println(conn1); // 关闭连接,失效
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}	catch (Exception e) {
			e.printStackTrace();
		}
		

二、C3P0连接池

跟DBCP连接池类似,并且更加简单。
注意:配置文件必须直接放在src文件夹下,因此不需要通过路径查找。

public static void main(String[] args) {
		// 构造器会默认到类路径下搜索,c3p0-config.xml 并且解析,固定格式
		ComboPooledDataSource dataSource = new ComboPooledDataSource("haha");
		
		// c3p0-config.xml 必须直接放在src下面
		/*
		 * dataSource.setDriverClass(driverClass); 
		 * dataSource.setJdbcUrl(jdbcUrl);
		 * dataSource.setUser(user); 
		 * dataSource.setPassword(password);
		 */
		try {
			Connection conn = dataSource.getConnection();
			System.out.println(conn);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

配置文件-----c3p0-config,xml 必须是这个命名

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <!-- 默认配置
  	   new ComboPooledDataSource();
   -->
  <default-config>
    <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
	<property name="jdbcUrl">jdbc:oracle:thin:@192.168.6.66:1521:orcl</property>
	<property name="user">student</property>
	<property name="password">123456</property>
	<property name="initialPoolSize">5</property>
	<property name="maxPoolSize">20</property>
	<property name="minPoolSize">10</property>
  </default-config>
  <!-- 命名配置
  	   new ComboPooledDataSource("haha");
   -->
  <named-config name="haha"> 
    <property name="driverClass">com.mysql.jdbc.Driver</property>
	<property name="jdbcUrl">jdbc:mysql:///java1903</property>
	<property name="user">root</property>
	<property name="password">123456</property>
  </named-config>
  
</c3p0-config>

三、DBUtils使用

DBUtils作用是简化CUDR(增删改查)操作。
       使用QueryRunner ,类似于JDBC中的Statement,优点是直接得到想要的结果集,不需要手动封装。

public List<Emp> findAllEmp() {
//		QueryRunner qu = new QueryRunner();
		QueryRunner qu = new QueryRunner(C3P0Utils.getDataSource());
		// sql: 要执行的sql语句 ??
		// rsh: ResultSetHanlder 结果处理
		// conn: 涉及到事务管理时,需要手动指定一个固定的连接
		// params: 参数,个数/类型 随意(可变长参数,就是参数类型后面有.....),对应sql语句中的?
		// Class 字节码类型 getClass(),每一个类都对应一个
		try {
			//BeanListHandler<Emp>将结果集中的每一条记录都封装到指定的javabean中(如这边的Emp),再将这些javabean封装到list中返回
			List<Emp> list = qu.query("select * from emp", 
					new BeanListHandler<Emp>(Emp.class));
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
		}
//		qu.query(conn, sql, rsh);
//		qu.query(sql, rsh, params);
//		qu.query(conn, sql, rsh, params);
		return null;
	}
发布了21 篇原创文章 · 获赞 0 · 访问量 122
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览