数据库连接池

连接池的概述

  1. 概念:其实就是一个容器(集合),存放数据库连接的容器。

    当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,

    从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
  2. 好处:
    • 节约资源

      • 用户访问高效
  3. 实现:
    1. 标准接口:DataSource javax.sql包下的

      1. 方法:

        • 获取连接:getConnection()

          • 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,

            则不会再关闭连接了。而是归还连接
      2. 一般我们不去实现它,有数据库厂商来实现
        1. C3P0:数据库连接池技术
        2. Druid:数据库连接池实现技术,由阿里巴巴提供的
  4. C3P0:数据库连接池技术
    • 步骤:

      1. 导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,

        • 不要忘记导入数据库驱动jar包
      2. 定义配置文件:
        • 名称: c3p0.properties 或者 c3p0-config.xml
        • 路径:直接将文件放在src目录下即可。
      3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
      4. 获取连接: getConnection
    • 代码:

      //1.创建数据库连接池对象

      DataSource ds = new ComboPooledDataSource();

      //2. 获取连接对象

      Connection conn = ds.getConnection();
  5. Druid:数据库连接池实现技术,由阿里巴巴提供
    1. 步骤:

      1. 导入jar包 druid-1.0.9.jar
      2. 定义配置文件:
        • 是properties形式的
        • 可以叫任意名称,可以放在任意目录下
      3. 加载配置文件。Properties
      4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
      5. 获取连接:getConnection
    • 代码:

      //3.加载配置文件

      Properties pro = new Properties();

      InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");

      pro.load(is);

      //4.获取连接池对象

      DataSource ds = DruidDataSourceFactory.createDataSource(pro);

      //5.获取连接

      Connection conn = ds.getConnection();
    1. 定义工具类

      1. 定义一个类 JDBCUtils
      2. 提供静态代码块加载配置文件,初始化连接池对象
      3. 提供方法
        1. 获取连接方法:通过数据库连接池获取连接
        2. 释放资源
        3. 获取连接池的方法

      driverClassName=com.mysql.jdbc.Driver

      url=jdbc:mysql://127.0.0.1:3306/db3?useSSL=true

      username=root

      password=root

      initialSize=5

      maxActive=10

      maxWait=3000

      public class JDBCUtils {

        /**
      * 定义数据源
      */
      private static DataSource ds; static {
      try {
      /**
      * 加载配置文件
      */
      InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
      Properties pro = new Properties();
      pro.load(is);
      /**
      * 获取数据源
      */
      ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) {
      e.printStackTrace();
      } catch (Exception e) {
      e.printStackTrace();
      }
      } /**
      * 获取数据源
      * @return 返回数据源
      */
      public static DataSource getDataSource(){
      return ds;
      } /**
      * 获取连接对象
      * @return 返回连接对象
      * @throws SQLException 抛出的编译异常
      */
      public static Connection getConn() throws SQLException {
      return ds.getConnection();
      } /**
      * 关闭连接
      * @param stmt sql执行对象
      * @param conn 数据库连接对象
      */
      public static void close(Statement stmt, Connection conn){
      if(stmt != null){
      try {
      stmt.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      } if(conn != null){
      try {
      conn.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      }
      } /**
      * 关闭资源的重载方法
      * @param rs 处理结果集的对象
      * @param stmt 执行sql语句的对象
      * @param conn 连接数据库的对象
      */
      public static void close(ResultSet rs, Statement stmt, Connection conn){ if(rs != null){
      try {
      rs.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      } if(stmt != null){
      try {
      stmt.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      } if(conn != null){
      try {
      conn.close();
      } catch (SQLException e) {
      e.printStackTrace();
      }
      }
      }

      }

JdbcTemplate

  • Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
  • 步骤:
    1. 导入jar包
    2. 创建JdbcTemplate对象。依赖于数据源DataSource
    • JdbcTemplate template = new JdbcTemplate(ds);
    1. 调用JdbcTemplate的方法来完成CRUD的操作
    • update():执行DML语句。增、删、改语句
    • queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
      • 注意:这个方法查询的结果集长度只能是1
    • queryForList():查询结果将结果集封装为list集合
      • 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
    • query():查询结果,将结果封装为JavaBean对象
      • query的参数:RowMapper

        • 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
        • new BeanPropertyRowMapper<类型>(类型.class)
    • queryForObject:查询结果,将结果封装为对象
      • 一般用于聚合函数的查询

        public class SpringJdbcTemplateTest {

        private static JdbcTemplate jdbcTemplate;

         @Before
        public void init(){
        // 1. 导入jar包
        // 2. 创建JDBCTemplate对象
        jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource());
        } @Test
        public void testInsert(){
        // 创建sql
        String sql = "INSERT INTO ACCOUNT VALUES(NULL,?,?)";
        // 执行sql,返回影响的行数
        int lines = jdbcTemplate.update(sql, "王五", 5000);
        System.out.println("影响的行数为:" + lines);
        } @Test
        public void testUpdate(){
        // 创建sql
        String sql = "UPDATE ACCOUNT SET BALANCE = ? WHERE ID = ?";
        // 执行sql,返回影响的行数
        int lines = jdbcTemplate.update(sql, 3000, 3);
        System.out.println("影响的行数为:" + lines);
        } @Test
        public void testDelete(){
        // 创建sql
        String sql = "DELETE FROM ACCOUNT WHERE ID = ?";
        // 执行sql,返回影响的行数
        int lines = jdbcTemplate.update(sql, 3);
        System.out.println("影响的行数为:" + lines);
        } @Test
        public void testQueryForMap(){
        // 3. 创建sql
        String sql = "SELECT * FROM STUDENT WHERE ID = ?";
        // 4. 使用查询语句进行查询(变长参数替换占位符)
        Map<String, Object> map = jdbcTemplate.queryForMap(sql,7);
        System.out.println(map);
        } @Test
        public void testQueryForList(){
        // 创建sql语句
        String sql = "SELECT * FROM STUDENT";
        // 执行sql,返回结果
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
        // 处理结果
        for (Map<String, Object> map : list) {
        System.out.println(map);
        }
        } /**
        * queryForMap:将结果封装成Map,只能返回一条结果,
        * 列名为Key,对应的值为Value
        */
        @Test
        public void testQuery(){
        // 创建sql
        String sql = "SELECT * FROM ACCOUNT";
        // 执行sql(使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装)
        List<Account> accounts = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Account.class));
        // 处理结果
        for (Account account : accounts) {
        System.out.println(account);
        }
        } @Test
        public void testQueryForObject(){
        // 创建sql
        String sql = "SELECT COUNT(ID) FROM ACCOUNT";
        // 执行sql,一般用于查询聚合函数()
        Long count = jdbcTemplate.queryForObject(sql,Long.class);
        System.out.println();
        }

        }

Java之JDBC连接池的更多相关文章

  1. Java中JDBC连接池&JDBCTemplate

    数据库连接池 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归 ...

  2. 四大流行的jdbc连接池之C3P0篇

    C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...

  3. Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介

    日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...

  4. JDBC连接池-C池3P0连接

    JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版      c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池  三种方 ...

  5. JDBC连接池(三)DBCP连接池

    JDBC连接池(三)DBCP连接池 在前面的随笔中提到 了  1.JDBC自定义连接池  2. C3P0连接池 今天将介绍DBCP连接池 第一步要导入jar包   (注意:mysql和mysql 驱动 ...

  6. JDBC连接池-自定义连接池

    JDBC连接池 java JDBC连接中用到Connection   在每次对数据进行增删查改 都要 开启  .关闭  ,在实例开发项目中 ,浪费了很大的资源 ,以下是之前连接JDBC的案例 pack ...

  7. Jmeter(九)JDBC连接池

    JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问.因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL又可以访问SQL ...

  8. jdbc连接池&改进dbUtil成C3P0Util

    一.jdbc连接池 1.连接池的存在理由   前面介绍的dbUtils工具类虽然实现了一个对jdbc的简单封装.但它依旧采取从驱动管理获取连接 (DriverManager.getConnection ...

  9. Tomcat 的 JDBC 连接池

    JDBC 连接池 org.apache.tomcat.jdbc.pool 是 Apache Commons DBCP 连接池的一种替换或备选方案. 那究竟为何需要一个新的连接池? 原因如下: Comm ...

随机推荐

  1. HIVE函数的UDF、UDAF、UDTF

    一.词义解析 UDF(User-Defined-Function) 一进一出 UDAF(User- Defined Aggregation Funcation) 多进一出 (聚合函数,MR) UDTF ...

  2. UVA 816 Abbott's Revenge 紫书

    紫书的这道题, 作者说是很重要. 但看着题解好长, 加上那段时间有别的事, 磨了几天没有动手. 最后,这道题我打了五遍以上 ,有两次被BUG卡了,找了很久才找到. 思路紫书上有,就缺少输入和边界判断两 ...

  3. 无法连接 Plugins Market 失效的日子

    一.问题背景 不知道是什么原因,我的 Intellij 连接不上 Plugins Market,这时候我需要使用 @Data 注解来自动生成 Getter.Setter 方法.在添加了相应的依赖之后, ...

  4. ifconfig命令详情

    基础命令学习目录首页 原文链接:https://blog.csdn.net/weixin_37886382/article/details/79716879 许多windows非常熟悉ipconfig ...

  5. 虚拟机搭建Hadoop集群

    安装包准备 操作系统:ubuntu-16.04.3-desktop-amd64.iso 软件包:VirtualBox 安装包:hadoop-3.0.0.tar.gz,jdk-8u161-linux-x ...

  6. Alpha发布PSP Daily评价总结报告

    Alpha发布PSP Daily评价总结报告 优点: 1.用户人群较为明确,定位较为准确. 2.亮点:暂停任务时是无法结束当前任务的. 3.说明书写的详细.语言流畅.能实现的功能都体现出来. 4.下拉 ...

  7. Thunder——爱阅app(测评人:方铭)

    B.Thunder——爱阅app(测评人:方铭) 一.基于NABCD评论作品,及改进建议 每个小组评论其他小组Alpha发布的作品: 1.根据(不限于)NABCD评论作品的选题: 2.评论作品对选题的 ...

  8. Linux里的2>&1的理解

    转载自:https://blog.csdn.net/ggxiaobai/article/details/53507530 我们在Linux下经常会碰到nohup command>/dev/nul ...

  9. 微信小程序之Flex布局

    微信小程序页面布局方式采用的是Flex布局.Flex布局,是W3c在2009年提出的一种新的方案,可以简便,完整,响应式的实现各种页面布局.Flex布局提供了元素在容器中的对齐,方向以及顺序,甚至他们 ...

  10. OSG学习:计算纹理坐标

    在很多时候,直接指定纹理坐标是非常不方便的,如曲面纹理坐标,只有少数的曲面(如圆锥.圆柱等)可以在不产生扭曲的情况下映射到平面上,其他的曲面在映射到表面时都会产生一定程度的扭曲.一般而言,曲面表面的曲 ...