连接池思想
在数据库连接时,Connection资源非常珍贵,但又频繁被使用,所以创建一个容器来专门管理这些连接
使用连接池实现Connection复用:
1.创建一个连接池对象
2.连接池对象生成并管理若干连接
(线程池中的线程是自己在线程池中使用线程,使用之后线程池将线程回收给后面的线程使用)
(连接池对象自己生成连接对象,我们使用时直接从连接池得到连接对象)(线程池是先使用线程,在交给线程池管理,一个是连接池先创建连接,在给使用)
3.当与数据库交互时,从连接池获取连接
4.连接使用完,以前是直接释放,现在直接存回连接池
5.存回连接池的目的是供下次使用
优点:
A.实现Connection的复用
B.效率更高
Java中常用的数据库连接池实现(管理程序与数据库的连接)
C3p0 ----- 用xml配置文件规范
DBCP ----- 用properties配置文件规范
C3p0连接池使用
A:必须下载相关jar包
连接池管理连接的,必须还得导入mysql与java连接的jar包才能正常使用
B:创建连接池对象,传入相关的配置信息(具体要使用哪一种配置的连接池)
必须配置的四个配置项(驱动名,url,账号,密码)
可选配置项,连接的管理策略----初始化连接个数,最大连接数,空闲时的最小连接数......
C:从连接池对象取连接,并使用
D:将连接存回连接池
C3p0总结
1.导包
2.配置文件直接复制到src下面,注意必须在src下,且文件名不能修改
固定:c3p0-config.xml 因为解析原码被底层封装
3.创建连接池对象
DataSource ds = new ComboPooledDataSource();
底层实现:
A:自动读取并解析配置文件
B:根据解析的数据创建若干连接
解析c3po-config.xml
用集合嵌套进行解析
Map<String(name-config的属性),HashMap<String(property的属性),String(property的文本)>>
内层HashMap中存的是,元素属性值,元素文本值(连接池的具体配置信息)
外层Map中存储的是具体使用哪一条配置信息来创建相应的连接池
4.获取连接 使用
ds.getConnection(); 从连接池取出一个连接
5.连接用完之后存回连接池
con.close(); 这是使用的连接池重写之后的Close方法,将连接放回,没有释放 其它使用的资源需要释放
特点:资源复用,效率高,底层实现隐藏
C3p0解析配置文件时,配置文件中可以有多套配置信息
default-config(默认配置,只能有一个)和named-config(命名配置,可以0或多个)
使用方法:
DataSource ds = new ComboPooledDataSource; //默认配置
DataSource ds = new ComboPooledDataSource("配置文件中对应的name的值")
常用的配置最好放在xml的前面,因为xml解析存在效率问题
C3p0的配置也可以使用编码的方式完成,但因为是硬代码,灵活性太差
DBCP
A:导入jar包
B:创建连接池对象
1.导入配置文件
2.创建输入流以及Properties集合,将数据读入集合(通过类加载器中的方法直接读src目录下面的文件)
3.DataSource ds = BasicDataSourceFactory.createDataSource(集合)
C:获取并使用连接
Connection con = ds.getConnection()
D:存回连接池
con.close()
抽取数据库连接池工具类,不用每次都创建一个连接池
DBUtils:
和连接池一起使用,封装了一系列的“处理对象”处理和“结果”处理
JavaBean书写规范
A:必须有包
B:必须实现序列化接口
C:属性私有,提供公共的访问方式
D:必须提供无参构造public
使用:
A:QueryRunner qr = new QueryRunner(数据库连接池对象)
B:查询操作
qr.query(参数1,参数2,参数3)
参数1 —— SQL语句
参数2 —— 结果集(需要的代理对象)
参数3 —— 补齐SQL语句的参数(占位符的值)(底层使用预处理对象preparedStatement)
C:封装连接返回线程池
实现细节:
1:QueryRunner 执行SQL语句时,会从数据库连接池取出一个连接
使用完,自己将连接存回线程池
2:查询时,query("SQL语句",new BeanListHandler<泛型>(反射对象),[占位符参数])
此条代理对象返回的是一个List<JavaBean>集合,存储每一条数据所对应的对象
BeanListHandler怎么代理我们执行的?
A:BeanListHandler 中的泛型决定了返回的集合的泛型
B:根据反射对象获取无参构造,创建对象
C:取出表记录中的字段名和字段值,利用反射和方法名拼接,为对象赋值
D:将对象存入集合然后返回
代理对象:
BeanHandler 将单条记录(多条记录的情况下,第一天记录)组装成JavaBean对象
ArrayHandler 将单条记录(多条数据选取第一条)的每一个字段值存储进一个Object数据
ArrayListHandler 将每一条记录的每一个字段值存为一个数组,将所有数组存进集合
ScalarHandler 查询单个结果(聚合函数)
ColumanListHandler 将某一列的值存入一个集合
MapHandler 将第一条记录的字段名作为键,字段值作为值存入一个Map集合
MapListHandler 将每一条记录转换成Map,再将Map存入List选一个值作为Map集合所对应键,然后值为其对应的Map字段名字段值集合
KeyedHandler 选一个值作为Map集合所对应键,然后值为其对应的Map字段名字段值集合
增删改操作使用update方法,返回Long
Long line = qr.update(sql, params);
如果创建QueryRunner的时候没有传入连接词对象
List<User> rs = qr.query(C3p0Utils.getDs().getConnection(), sql, new BeanListHandler<User>(User.class));
池:
字符串常量池
包装类缓存池
数据库连接池
线程池
音乐池
资源复用,效率高