链接池思想
在数据库链接时,Connection资源很是珍贵,但又频繁被使用,因此建立一个容器来专门管理这些链接
使用链接池实现Connection复用:
1.建立一个链接池对象
2.链接池对象生成并管理若干链接
(线程池中的线程是本身在线程池中使用线程,使用以后线程池将线程回收给后面的线程使用)
(链接池对象本身生成链接对象,咱们使用时直接从链接池获得链接对象)(线程池是先使用线程,在交给线程池管理,一个是链接池先建立链接,在给使用)java
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的配置也可使用编码的方式完成,但由于是硬代码,灵活性太差mysql
DBCP
A:导入jar包
B:建立链接池对象
1.导入配置文件
2.建立输入流以及Properties集合,将数据读入集合(经过类加载器中的方法直接读src目录下面的文件)
3.DataSource ds = BasicDataSourceFactory.createDataSource(集合)
C:获取并使用链接
Connection con = ds.getConnection()
D:存回链接池
con.close()
抽取数据库链接池工具类,不用每次都建立一个链接池sql
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));缓存
池:
字符串常量池
包装类缓存池
数据库链接池
线程池
音乐池
资源复用,效率高函数