Druid连接池和Apache的DBUtils

这篇具有很好参考价值的文章主要介绍了Druid连接池和Apache的DBUtils。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

jdbc连接数据库存在着大批量用户进行短时间的SQL连接操作的 需求,而普通用户连接后直接断开与数据库的连接,下次连接需要重新建立桥梁,再频繁访问时。这是很消耗性能的一个操作,因此诞生了数据库连接池技术。提前创建 一些连接,避免频繁的创建连接,并且可以管理程序和数据库之间的连接,动态分配桥梁给申请连接的应用程序。

Druid连接池

  • Druid(德鲁伊)连接池是阿里开发的,据说是集DBCP、C3P0、Proxool优点于一身的数据库连接池。

一、如何使用Druid连接池

  1. 引入德鲁伊连接池jar包和jdbc驱动jar包(网上搜索一下,很容易找到下载,注意是.jar文件)
  2. 代码步骤:
    • 第一步:建立一个数据库连接池对象
    • 第二步:设置连接池的参数
    • 第三步:从连接池中获取连接对象来使用
  3. 代码示例
@Test
    public void test1() throws SQLException {
        DruidDataSource ds = new DruidDataSource();

        //设置基本参数
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/atguigu");
        ds.setUsername("root");
        ds.setPassword("123456");

        //设置其他连接参数
        ds.setInitialSize(10);//初始化连接数
        ds.setMaxActive(11);//最大活动连接数
        ds.setMaxWait(1000);//最大等待时间
        ds.setMinIdle(5);//最小连接数

        for (int i = 0; i < 30; i++) {
            DruidPooledConnection conn = ds.getConnection();
            System.out.println("conn = " + conn);
            conn.close();//释放连接到连接池中
        }
    }

二、封装Druid连接池

1.配置文件参数批量导入

Druid连接池提供了一个createDataSource(Properties prop)的方法来统一设置连接池的参数,由于底层是采用硬编码编写的,所以配置文件的变量名称必须与代码一致,否则无法将配置读取到项目中。

具体步骤:

  1. 读取配置文件的参数信息
  2. 使用工厂设计模式批量给参数赋值
  3. 创建线程池ds
  4. 调用线程的getConnection方法来获取一个连接
public class JdbcTool2 {

    private static DataSource ds;

    static {
        //1.注册驱动
        Properties prop = new Properties();
        try {
            //加载配置文件中的数据到Properties中
            //配置文件要放到src目录下
            prop.load(JdbcTools.class.getClassLoader().getResourceAsStream("jdbc.properties"));
            //批量设置参数的大小
            ds = DruidDataSourceFactory.createDataSource(prop);
            //Class.forName(className);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() throws SQLException {
        //获取连接
        return ds.getConnection();
    }
}

2.绑定连接对象

在MVC分层模型中,如果我们在DAO层中使用jdbc技术建立连接修改了账号表的数据,而在业务层中为了模拟转账的需求又再次获取了一个Connection对象来实现该事务。该写法会导致我们重复创建了不同的连接,并且当代码出现异常执行事务回滚时会发现不能恢复到原有的状态。这是由于两层代码中的连接对象并不是同一个。

解决方案如下:

  1. 在jdbc工具类中定义一个ThreadLocal对象
  2. 在静态代码块中将其实例化
  3. 获取连接时使用类似单例模式的写法来将连接与线程绑定在一起
public class JdbcTool3 {

    private static DataSource ds;
    private static ThreadLocal<Connection> threadLocal;


    static {
        //1.注册驱动
        Properties prop = new Properties();
        try {
            //加载配置文件中的数据到Properties中
            prop.load(JdbcTools.class.getClassLoader().getResourceAsStream("jdbc.properties"));//配置文件要放到src目录下
            //批量设置参数的大小
            ds = DruidDataSourceFactory.createDataSource(prop);
            //Class.forName(className);

            //3.创建线程
            threadLocal = new ThreadLocal<>();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() throws SQLException {
        //获取连接
        Connection conn = threadLocal.get();
        if(conn==null){
            conn = ds.getConnection();
            threadLocal.set(conn);
        }
        return conn;
    }

    public static void closeAll(ResultSet rs, Statement st, Connection conn){
        try {
            if(rs!=null){
                rs.close();
            }
            if(st!=null){
                st.close();
            }
            if(conn!=null){
                conn.close();//将连接还给连接池
                threadLocal.remove();//把连接对象从当前线程移除
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public static DataSource getDs(){
        return ds;
    }
}

示例代码

三、Apche的DBUtils

一个已经封装好了的工具类,可以简化我们在编写DAO层代码的复杂度。主要分两个方面来介绍一下该工具类,分别是增删改和查询操作。

1.update操作

简化之前的代码:

//添加用户
    public int addUser(User user) throws SQLException {
        Connection conn = JdbcTool3.getConnection();
        PreparedStatement pst = conn.prepareStatement("insert into users(username, password) values(?,?)");
        pst.setObject(1,user.getUsername());
        pst.setObject(2,user.getPassword());
        int i = pst.executeUpdate();
        JdbcTool3.closeAll(null,pst,conn);
        return i;
    }

使用DBUtils后的代码:

//添加用户
    public int addUser(User user) throws SQLException {
        String sql = "insert into users(username, password) values(?,?)";
        int update = qr.update(sql, user.getUsername(), user.getPassword());
        return update;
    }

2. query操作

简化之前的代码:

//根据id查询用户
    public User getUserById(int id) throws SQLException {
        Connection conn = JdbcTool3.getConnection();
        PreparedStatement pst = conn.prepareStatement("select id, username, password from users where id = ?");
        pst.setObject(1,id);
        ResultSet rs = pst.executeQuery();
        User user = null;
        if(rs.next()){
            int ID = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            System.out.print("ID = " + ID);
            System.out.print(",username = " + username);
            System.out.println(",password = " + password);
            user = new User(ID, username, password);
        }
        JdbcTool3.closeAll(null,pst,conn);
        return user;
    }

使用DBUtils后的代码:

public User getUserById2(int id) throws SQLException {
        String sql = "select id, username, password from users where id = ?";
        return qr.query(sql,new BeanHandler<>(User.class),id);
    }

其中query方法中的BeanHandler对象底层是通过反射的方式来动态的将对象创建出来,可以选择相应容器来包装,如果是单个字段的话,可以使用相应的Handle对象来处理。文章来源地址https://www.toymoban.com/news/detail-673586.html

到了这里,关于Druid连接池和Apache的DBUtils的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apache Druid中Kafka配置远程代码执行漏洞(MPS-2023-6623)

    Apache Druid 是一个高性能的数据分析引擎。 Kafka Connect模块曾出现JNDI注入漏洞(CVE-2023-25194),近期安全研究人员发现Apache Druid由于支持从 Kafka 加载数据的实现满足其利用条件,攻击者可通过修改 Kafka 连接配置属性进行 JNDI 注入攻击,进而在服务端执行任意恶意代码。 Apache Dru

    2024年02月07日
    浏览(82)
  • 16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及Apache Hive示例(6)

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月11日
    浏览(52)
  • 16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及Apache Kafka示例(3)

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月10日
    浏览(55)
  • Druid连接池工具公式化SQL附踩坑记录

    使用Druid连接池工具格式化sql用于回显时候美观展示 之前我使用的是druid为1.2.4版本,在解析pg库sql时候,发现执行结果如下: 可以发现,转换函数::在解析时候异常了 切换高版本1.2.6及以上,可以正常解析。 druid的1.2.6以下版本对于包含数值使用::转换为varchar的场景不支持,会

    2024年01月19日
    浏览(39)
  • PHP连接Apache不成功的解决方法

    PHP是一种在Web开发中非常常用的编程语言,但在使用PHP时,有时会遇到连接Apache不成功的问题。这个问题主要是因为服务器的配置问题所导致的。在本文中,我们将探讨如何解决PHP连接Apache不成功的问题。 检查配置文件 首先,我们需要检查PHP和Apache的配置文件是否正确。在

    2023年04月11日
    浏览(36)
  • CVE-2020-9483 apache skywalking SQL注入漏洞

    漏洞概述 当使用H2 / MySQL / TiDB作为Apache SkyWalking存储时,通过GraphQL协议查询元数据时,存在SQL注入漏洞,该漏洞允许访问未指定的数据。 Apache SkyWalking 6.0.0到6.6.0、7.0.0 H2 / MySQL / TiDB存储实现不使用适当的方法来设置SQL参数。 环境搭建 拉取vulhub 搭建镜像 访问8080端口 漏洞复现

    2024年02月07日
    浏览(46)
  • Apache Doris 系列: 基础篇-Flink SQL写入Doris

    本文介绍 Flink SQL如何流式写入 Apache Doris,分为一下几个部分: Flink Doris connector Doris FE 节点配置 Flink SQL 写 Doris Flink Doris connector 本质是通过Stream Load来时实现数据的查询和写入功能。 支持二阶段提交,可实现Exatly Once的写入。 1)需在 apache-doris/fe/fe.conf 配置文件添加如下配置

    2023年04月08日
    浏览(46)
  • apache commons-dbcp Apache Commons DBCP 软件实现数据库连接池 commons-dbcp2

    许多Apache项目支持与关系型数据库进行交互。为每个用户创建一个新连接可能很耗时(通常需要多秒钟的时钟时间),以执行可能需要毫秒级时间的数据库事务。对于一个公开托管在互联网上的应用程序,在同时在线用户数量可能非常大的情况下,为每个用户打开一个连接可

    2024年03月17日
    浏览(57)
  • SpringBoot之RestTemplate使用Apache的HttpClient连接池

    SpringBoot自带的RestTemplate是没有使用连接池的,只是SimpleClientHttpRequestFactory实现了ClientHttpRequestFactory、AsyncClientHttpRequestFactory 2个工厂接口,因此每次调用接口都会创建连接和销毁连接,如果是高并发场景下会大大降低性能。因此,我们可以使用Apache的HttpClient连接池。

    2024年02月11日
    浏览(43)
  • 04-Apache Directory Studio下载安装(LDAP连接工具)

    官网下载Apache Directory Studio 注意Apache Directory Studio依赖于jdk,对jdk有环境要求 请下载适配本机的jdk版本的Apache Directory Studio,下图为最新版下载地址 要想下载其他版本,请选择Older Versions 双击exe文件根据提示安装Apache Directory Studio 安装后启动 连接成功

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包