【Java教程】连接池和DBUtils包详解
JDBC连接池
概述
Connection对象一次性使用的创建和销毁耗时。
连接池可以让连接得到复用, 避免浪费。
程序初始化的时候,初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中。
原理
- 程序一开始就在连接池创建一定数量的连接
- 使用的时候直接取连接对象, 用完归还
- 如果池子里面的连接使用完了, 还有程序需要使用连接, 先等待一段时间,如果在这段时间之内有连接归还, 就拿去使用; 如果还没有连接归还, 新创建一个, 但是用完就毁
- 集合选择LinkedList
增删比较快
LinkedList里面的removeFirst()和addLast()方法和连接池的原理吻合
第三方连接池
我们所定义的连接池和第三方的连接池相比,还是显得弱鸡。使用第三方工具需要导入jar包,有些还要导入配置文件。
• C3P0连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0是异步操作的,所以一些操作时间过长的JDBC通过其它的辅助线程完成。目前使用它的开源项目有Hibernate,Spring等。C3P0有自动回收空闲连接功能
• 德鲁伊druid连接池:阿里巴巴开源平台的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成。
• DBCP(DataBase Connection Pool)数据库连接池,是Apache上的一个Java连接池项目,也是Tomcat使用的连接池组件。dbcp没有自动回收空闲连接的功能。
datasource接口
概述
javax.sql.DataSource,数据库连接池公共的接口,其实就是连接池,可以获得Connection连接对象。各个数据库厂商提供了实现。
缺点
DataSource中并没有提供归还连接的方法,解决方法:
1、继承。
条件:可以控制父类, 最起码知道父类的名字
2、装饰者模式。
1. 创建一个MyConnection实现Connection2. 在MyConnection得到被增强的connection对象3. 改写MyConnection里面的close()方法的逻辑为归还4. MyConnection里面的其它方法 调用被增强的connection对象之前的逻辑5. 在MyDataSource03的getConnection()方法里面 返回了myConnection
3、动态代理。
示例
public class MyDataSource2 implements DataSource{private LinkedList<Connection> connectionPool = new LinkedList<>();public MyDataSource2() {for (int i = 0; i < 5; i++) {try {Connection conn = DriverManager.getConnection("jdbc:mysql:///day20?characterEncoding=utf8", "root", "123");connectionPool.add(conn);} catch (SQLException e) {e.printStackTrace();}}}@Overridepublic Connection getConnection() throws SQLException {//如果容器中有连接,则从容器中获取,如果容器中没有连接,就直接新创建连接Connection conn = null;if (connectionPool.size() > 0){conn = connectionPool.removeFirst();}else {conn = DriverManager.getConnection("jdbc:mysql:///day20?characterEncoding=utf8", "root", "123");}return conn;}
C3P0连接池
概述
开源的JDBC连接池。能自动回收空闲连接。
要求
1、导入c3p0-0.9.1.2.jar到lib
2、导配置文件c3p0-config.xml
配置信息
<c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql:///10_周宇科_课设_书店?characterEncoding=UTF-8&useUnicode=true</property><property name="user">root</property><property name="password">root</property><property name="initialPoolSize">5</property></default-config>
</c3p0-config>
步骤
- 拷贝jar
- 拷贝配置文件(c3p0-config.xml)到src目录的resources【名字不要改】
- 创建C3P0连接池对象(会自动读取resources目录下的c3p0-config.xml,所以不需要我们解析配置文件) DataSource ds = new ComboPooledDataSource();
- 从池子里面获得连接
工具类
工具类,提供DataSource对象,保证整个项目只有一个DataSource对象
public class C3P0Util {private static DataSource dataSource;static {dataSource = new ComboPooledDataSource();}public static DataSource getDataSource(){return dataSource;}
}
DRUID连接池
概述
阿里巴巴开发的号称为监控而生的数据库连接池,是国内目前性能最好的数据库连接池。
要求
导入druid-1.0.9.jar
导配置文件druid.properties
步骤
1. 导入DRUID jar包
2. 拷贝配置文件到src目录的resources中
3. 根据配置文件创建Druid连接池对象
4. 从Druid连接池对象获得Connection
实现
1、创建druid.properties, 放在src目录下,编辑好内容
url=jdbc:mysql:///day20username=rootpassword=123driverClassName=com.mysql.jdbc.Driver
2、编写Java代码
Properties properties = new Properties();// 关联druid.properties文件InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(is);DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);Connection connection = dataSource.getConnection();
写个工具类
public class DruidUtil {private static DataSource dataSource;static {try {Properties properties = new Properties();InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(is);//druid底层是使用的工厂设计模式,去加载配置文件,创建DruidDataSource对象dataSource = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}public static DataSource getDataSource(){return dataSource;}}
DBUtils数据库工具jar包
概述
对JDBC进行简单封装的开源工具类库,能简化开发,同时也不会影响程序的性能
步骤
- 拷贝commons-dbutils-1.4.jar包
- 创建QueryRunner()对象,传入dataSource
- 调用update()方法
方法
1、创建QueryRunner对象
new QueryRunner(DataSource ds) 提供连接池,DBUtils底层自动维护连接connection
2.1、执行增删改的SQL语句
int update(String sql, Object… params) 执行增删改的SQL语句, params参数就是可变参数,参数个数取决于语句中问号的个数
2.2、执行查询的SQL语句
query(String sql, ResultSetHandler<T> rsh, Object... params) 其中ResultSetHandler是一个接口,代表结果集处理者。- BeanHandler() 查询一条记录封装到JavaBean对象- BeanListHandler() 查询多条记录封装到List<JavaBean> list- MapHandler() 查询一条记录封装到Map对象- MapListHandler() 查询多条记录封装到List<Map> list- ScalarHandler() 封装单个记录的 eg:统计数量
封装到JavaBean条件, 查询出来的数据的列名必须和JavaBean属性一致
示例
增删改:String sql = "insert into user values (null,?,?,?)";//1. 创建QueryRunner对象QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());//2. 使用QueryRunner对象调用update(sql,...)执行增删改的SQL语句queryRunner.update(sql,"aobama","666666","圣枪游侠");查多条:String sql = "select * from user where id>?";QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());List<Map<String, Object>> mapList = queryRunner.query(sql, new MapListHandler(), 1);for (Map<String, Object> map : mapList) {System.out.println(map);}查一行:String sql = "select * from user where id=?";QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());//执行SQL语句U user = queryRunner.query(sql, new BeanHandler<>(U.class), 3);System.out.println(user);查一个:String sql = "select count(*) from user";QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());//需要用long接收,因为你格局得大一点long count = (long) queryRunner.query(sql,new ScalarHandler());System.out.println(count);
以上就是笔者的连接池和DBUtils包的笔记了,水平局限略略略,但希望能帮到你,喵~
转载请注明出处,谢谢!
【Java教程】连接池和DBUtils包详解相关推荐
- java dbcp_Java dbcp连接池基本使用方法详解
1.依赖api的使用 导入jar包 org.apache.commons commons-dbcp2 2.7.0 导入dbcp.properties配置文件 获取连接 protected void d ...
- dbcp连接池配置详解_重学MySQL:事务与连接池,一文详解带你搞懂
拼多多三面惨败,java中间件.数据库与spring框架,答不上... 吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点 Mysql事务 事务: 事务指逻辑上的一组操作,组成 ...
- Druid 连接池的实用 配置详解
Druid连接池参数配置详解 druid为阿里巴巴的数据源,(数据库连接池),集合了c3p0.dbcp.proxool等连接池的优点,还加入了日志监控,有效的监控DB池连接和SQL的执行情况. DRU ...
- Druid连接池的实用配置详解
DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...
- druid 连接db2_DRUID连接池的实用 配置详解
DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...
- 作为后端开发人员应该懂的TCP、HTTP、Socket、Socket连接池,一文详解丨Linux后端开发
前言:作为一名开发人员我们经常会听到HTTP协议.TCP/IP协议.UDP协议.Socket.Socket长连接.Socket连接池等字眼,然而它们之间的关系.区别及原理并不是所有人都能理解清楚,这篇 ...
- DRUID连接池的实用 配置详解
https://www.cnblogs.com/wuyun-blog/p/5679073.html https://blog.csdn.net/hj7jay/article/details/51686 ...
- java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例
java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...
- java数据源是什么_《java数据源—连接池》
<java数据源-连接池> 1.数据源的分类:直接数据源.连接池数据源. 2.连接池.数据源.JNDI a.数据源:Java中的数据源就是连接到数据库的一条路径,数据源中并无真正的数据,它 ...
最新文章
- private关键字和构造方法
- ormlite android studio,OrmLite-android入门体验
- 02_python是一种什么语言?
- CXF学习(4) 处理无法自动转换的复合数据类型
- oracle lms进程 内存,Oracle RAC 内存融合(Cache Fusion)
- android xml配置,Android XML设置z-Index
- gcc的简单使用教程
- python 的输入 输出
- 单链表的合并算法_图解算法:单链表两两反转 | 眼睛会了手就会系列
- BOOM!多模态遇上推荐系统
- Oracle和Mysql的区别 转载
- [spring]用IEDA创建spring boot项目
- 字符集及其存储方式(解决乱码问题)
- 安卓玩机教程---全机型安卓4----安卓12 框架xp edx lsp安装方法
- ASC2BCD及奇偶校验位
- 你知道这些SOLIDWORKS零件图知识吗?
- android支付宝免密支付功能,手机支付宝如何将免密支付功能关闭掉
- 基于CC2430的基础实验6---UART串口实验
- matlab中Folder是什么意思,matlab – @folder和文件夹
- 有哪些PDF分割工具?建议收藏这些工具