连接:客户端 -> 服务器(数据库服务),物理连接,非常消耗资源
连接频繁的开启和关闭,资源浪费
连接池:已经创建好连接,获得连接时,直接将连接池中随即返回一个连接。
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;
}