Java之JDBC连接池

数据库连接池

连接池的概述

  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();
         }

        }

原文地址:https://www.cnblogs.com/wadmwz/p/9450914.html

时间: 2025-01-14 08:40:59

Java之JDBC连接池的相关文章

号称性能最好的JDBC连接池:HikariCP

HikariCP号称是现在性能最好的JDBC连接池组件,具体的性能到底如何,我也没有仔细的测试过,不过从它现在的发展来看,其可能确实如它宣传的那样其性能高过目前所有的连接池组件.之前对连接池的记忆一直都是C3P0.DBCP.BoneCP,这三者中BoneCP的性能是最好的,C3P0的性能在现在来说确实是非常差的了,好像C3P0很久都没有更新了,所以我们应该杜绝在项目中使用C3P0,至于是否要使用HikariCP,我觉得可以尝试.HikariCP毕竟是才出来不久,其性能到底如何,也需要实践的检验,

JDBC连接池的简单实现

先说明一下,我本身是做android开发的,java web是我的弱项,只是近来京东云免费,于是去折腾了几下,有了些许经验,特作分享.如果文章中内容有误,还请各高手指正. 我在web端,需要连接数据库进行查询插入等操作,但是每次进行操作都先获取连接用完后就断开的话,未免效率太低.以前知道tomcat中可以配置,但是京东云引擎的tomcat并不能由自己配置.因为我折腾的东西较小,所以也不考虑使用框架,于是就想自己写一个. 我写的连接池很简单,在初始化时创建5个连接,并放在一个列表当中.如果要获取连

JDBC连接池C3P0

连接池 1)传统方式找DriverManager要连接,数目是有限的. 2)传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行 3)项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式. 4)DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口 5)DBCP连接池需要dbcp.properties文件,同时需加入3个对应的j

数据层优化-jdbc连接池简述、druid简介

终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化去写,本篇是一个开始.本文会介绍连接池技术并对比目前比较流行的java连接池技术,之后,会把druid整合到项目中来,将技术方案落地,实际整合到项目中,让技术能为我所用. 使用连接池的原因 jdbc的demo //第一步,注册驱动程序 //com.MySQL.jdbc.Driver Class.fo

JDBC连接池概述

Reference Source:https://www.progress.com/tutorials/jdbc/jdbc-jdbc-connection-pooling 介绍 本文档提供的信息旨在帮助开发人员为必须处理连接池的应用程序提供连接池策略. 首先, 本文档提供 jdbc 3.0 规范指定的 jdbc 连接池概述. 接下来, 它提供了一些示例, 说明如何使用 DataDirect 连接池管理器 (它随 DataDirect Connect?用于jdbc 和 DataDirect Seq

Spring boot (11) tomcat jdbc连接池

默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多,spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了spring boot的jdbc组件,就会自动引入tomcat jdbc连接池. 默认参数 以下是org.apache.tomcat.jdbc.pool.PoolProperties源码,这是tomcat jdbc连接池的默认初始参数.这个类实现了一个接口PoolConfiguration,查看这个

(详细)JAVA使用JDBC连接MySQL数据库(1)- 软件

欢迎任何形式的转载,但请务必注明出处. 1.jdk 点击查看安装和环境配置教程 2.Eclipse 点击进入官网下载 注意下载完成打开.exe后,出现下图界面,有很多版本供选择 本人目前在学JSP所以安装的是Java EE版本,初学者可以选择第一个Java Developers版本 3.Mysql 点击进入官网下载 点击进入推荐安装教程+环境配置 下载页面注意事项 (虽然选项只有32位的,但下载完成后32位和64位都会安装) (上面的是在线安装,下面的是离线安装,建议选择离线安装) 系列文章 (

JAVA使用JDBC连接MySQL数据库 二(2)

本文是对 <JAVA使用JDBC连接MySQL数据库 二>的改进. 上节使用的是PreparedStatement来执行数据库语句,但是preparedStatement需要传递一个sql语句参数,才能创建.然而,DBHelper类只是起到打开和关闭数据库的作用,所以sql语句是要放到应用层部分的,而不是放到DBHelper类中. 而statment不需要传递一个sql语句参数,就能创建. 修改部分如下: public class DBHelper { String driver = &quo

Java通过jdbc连接sql server2012详细过程

在连接数据库之前必须保证SQL Server 2012是采用SQL Server身份验证方式而不是windows身份验证方式.如果在安装时选用了后者,则重新设置如下: 设置SQL Server 2012的身份验证方式: 1.在连接的服务器上右击,选择属性 2.点击左侧上的安全性,在栏目中选择SQL Server和Windows身份验证 3.设置sa的密码和sa登录名 在根目录下,点击安全性->登录名->选择sa登录名右击选择属性 点击左侧上的常规,在右侧设置登录名sa和密码 4.设置完账号密码