DAO及相关实现类
概述:Data Access Object访问数据信息的类和接口,包括了对数据的CRUD(Create、Retrival、Update、Delete),而不包含任何业务相关的信息。有时也称作:BaseDAO。
作用:为了实现功能的模块化,更有利于代码的维护和升级。
数据库连接池
开发基于数据库程序时的传统模式 | 1. 在主程序(如servlet、beans)中建立数据库连接 2. 进行sql操作 3. 断开数据库连接 | |
存在的问题 | 1. 数据库的连接资源并没有得到很好的重复利用 2. 对于每一次数据库连接,使用完后都得断开 3. 这种开发不能控制被创建的连接对象数 | |
基本思想 | 为数据库连接建立一个"缓冲池"。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从"缓冲池"中取出一个,使用完毕之后再放回去 | |
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个 | ||
连接池最小数据库连接数 | 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量 | |
连接池最大数据库连接数 | 限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中 | |
工作原理 |
好处:
资源重用
由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销
在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性
更快的系统反应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用
此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接
避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间
新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置
实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源
统一的连接管理
避免数据库连接泄漏
在较为完善的数据库连接池实现中,可根据预先的占用超时设定
强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露
分类:
C3P0,dbcp,druid(推荐)
代码实现:
Druid(德鲁伊)数据库连接池
src下的配置文件:druid.properties
url=jdbc:mysql:///test
username=root
password=root
driverClassName=com.mysql.jdbc.Driver
@Test
public void getConnection() throws Exception {
Properties pros = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
pros.load(is);
DataSource source = DruidDataSourceFactory.createDataSource(pros);
Connection conn = source.getConnection();
System.out.println(conn);
}
完整的使用JDBC
//完整的使用JDBC
public void testUpdateWithTx() {
Connection conn = null;
try {
//1.获取连接的操作(
//① 手写的连接:JDBCUtils.getConnection();
//② 使用数据库连接池:C3P0;DBCP;Druid
//2.对数据表进行一系列CRUD操作
//① 使用PreparedStatement实现通用的增删改、查询操作(version 1.0 \ version 2.0)
//version2.0的增删改public void update(Connection conn,String sql,Object ... args){}
//version2.0的查询 public <T> T getInstance(Connection conn,Class<T> clazz,String sql,Object ... args){}
//② 使用dbutils提供的jar包中提供的QueryRunner类
//提交数据
conn.commit();
} catch (Exception e) {
e.printStackTrace();
try {
//回滚数据
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}finally{
//3.关闭连接等操作
//① JDBCUtils.closeResource();
//② 使用dbutils提供的jar包中提供的DbUtils类提供了关闭的相关操作
}
}