JDBC连接池

概述

Connection对象一次性使用的创建和销毁耗时。
连接池可以让连接得到复用, 避免浪费。
程序初始化的时候,初始化多个连接,将多个连接放入到池(集合)中.每次获取的时候,都可以直接从连接池中进行获取.使用结束以后,将连接归还到池中。

原理

  1. 程序一开始就在连接池创建一定数量的连接
  2. 使用的时候直接取连接对象, 用完归还
  3. 如果池子里面的连接使用完了, 还有程序需要使用连接, 先等待一段时间,如果在这段时间之内有连接归还, 就拿去使用; 如果还没有连接归还, 新创建一个, 但是用完就毁
  4. 集合选择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&amp;useUnicode=true</property><property name="user">root</property><property name="password">root</property><property name="initialPoolSize">5</property></default-config>
</c3p0-config>

步骤

  1. 拷贝jar
  2. 拷贝配置文件(c3p0-config.xml)到src目录的resources【名字不要改】
  3. 创建C3P0连接池对象(会自动读取resources目录下的c3p0-config.xml,所以不需要我们解析配置文件) DataSource ds = new ComboPooledDataSource();
  4. 从池子里面获得连接

工具类

工具类,提供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进行简单封装的开源工具类库,能简化开发,同时也不会影响程序的性能

步骤

  1. 拷贝commons-dbutils-1.4.jar包
  2. 创建QueryRunner()对象,传入dataSource
  3. 调用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包详解相关推荐

  1. java dbcp_Java dbcp连接池基本使用方法详解

    1.依赖api的使用 导入jar包 org.apache.commons commons-dbcp2 2.7.0 导入dbcp.properties配置文件 获取连接 protected void d ...

  2. dbcp连接池配置详解_重学MySQL:事务与连接池,一文详解带你搞懂

    拼多多三面惨败,java中间件.数据库与spring框架,答不上... 吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点 Mysql事务 事务: 事务指逻辑上的一组操作,组成 ...

  3. Druid 连接池的实用 配置详解

    Druid连接池参数配置详解 druid为阿里巴巴的数据源,(数据库连接池),集合了c3p0.dbcp.proxool等连接池的优点,还加入了日志监控,有效的监控DB池连接和SQL的执行情况. DRU ...

  4. Druid连接池的实用配置详解

    DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...

  5. druid 连接db2_DRUID连接池的实用 配置详解

    DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...

  6. 作为后端开发人员应该懂的TCP、HTTP、Socket、Socket连接池,一文详解丨Linux后端开发

    前言:作为一名开发人员我们经常会听到HTTP协议.TCP/IP协议.UDP协议.Socket.Socket长连接.Socket连接池等字眼,然而它们之间的关系.区别及原理并不是所有人都能理解清楚,这篇 ...

  7. DRUID连接池的实用 配置详解

    https://www.cnblogs.com/wuyun-blog/p/5679073.html https://blog.csdn.net/hj7jay/article/details/51686 ...

  8. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

  9. java数据源是什么_《java数据源—连接池》

    <java数据源-连接池> 1.数据源的分类:直接数据源.连接池数据源. 2.连接池.数据源.JNDI a.数据源:Java中的数据源就是连接到数据库的一条路径,数据源中并无真正的数据,它 ...

最新文章

  1. private关键字和构造方法
  2. ormlite android studio,OrmLite-android入门体验
  3. 02_python是一种什么语言?
  4. CXF学习(4) 处理无法自动转换的复合数据类型
  5. oracle lms进程 内存,Oracle RAC 内存融合(Cache Fusion)
  6. android xml配置,Android XML设置z-Index
  7. gcc的简单使用教程
  8. python 的输入 输出
  9. 单链表的合并算法_图解算法:单链表两两反转 | 眼睛会了手就会系列
  10. BOOM!多模态遇上推荐系统
  11. Oracle和Mysql的区别 转载
  12. [spring]用IEDA创建spring boot项目
  13. 字符集及其存储方式(解决乱码问题)
  14. 安卓玩机教程---全机型安卓4----安卓12 框架xp edx lsp安装方法
  15. ASC2BCD及奇偶校验位
  16. 你知道这些SOLIDWORKS零件图知识吗?
  17. android支付宝免密支付功能,手机支付宝如何将免密支付功能关闭掉
  18. 基于CC2430的基础实验6---UART串口实验
  19. matlab中Folder是什么意思,matlab – @folder和文件夹
  20. 有哪些PDF分割工具?建议收藏这些工具

热门文章

  1. 京东JAVA面试心得与面试题详解
  2. 20部商战电影,电影中的商学院
  3. ChatGPT背后的“血汗工厂”:最低时薪才9块钱,有员工受到心理创伤
  4. 复数的除法(老是忘记,温故用)
  5. 如何做出正确的选择-你不是选择困难,只是不够了解自己
  6. 在虚拟机中使用命令下载文件方法
  7. web端页面视频播放
  8. el-transfer 的用法
  9. 【Android开发经验】APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了
  10. 提高个人工作效率的五大软件,你肯定不知道