数据库阿里连接池 druid配置详解

数据库阿里连接池 druid 配置详解

什么是 druid

Druid 是阿里巴巴开源的一个数据库连接池、监控组件。 druid中维护了一个数据库连接池,并提供了一些监控统计和扩展功能。

Druid提供的功能:

  • 数据库连接池
  • 监控统计
  • 扩展JDBC
  • SQL注入检查:wall filter
  • 大数据量低延时:PSCache
  • 干扰SQL执行: stat filter
  • 统计SQL性能

如何配置druid连接池

在maven中引入以下依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.6</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

application.properties中添加以下配置:

# 数据库主从配置
spring.datasource.url = jdbc:mysql://ip:port/dbName?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true
spring.datasource.username = username
spring.datasource.password = password

# druid连接池配置
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.filters = stat, wall, logback
spring.datasource.max-active = 20
spring.datasource.initial-size = 1
spring.datasource.min-idle = 3
spring.datasource.max-wait = 60000
spring.datasource.validation-query = SELECT 1
spring.datasource.test-while-idle = true
spring.datasource.test-on-borrow = false
spring.datasource.test-on-return = false
spring.datasource.time-between-eviction-runs-millis = 60000
spring.datasource.min-evictable-idle-time-millis = 300000
spring.datasource.log-abandoned = true
spring.datasource.remove-abandoned = true
spring.datasource.remove-abandoned-timeout-millis = 1800000
spring.datasource.pool-prepared-statements = true
spring.datasource.max-pool-prepared-statement-per-connection-size = 20

参数解释

  • spring.datasource.url: 数据库连接url
  • spring.datasource.username: 数据库连接用户名
  • spring.datasource.password: 数据库连接密码
  • spring.datasource.type: 连接池类型为druid
  • spring.datasource.driver-class-name: 数据库驱动类名
  • spring.datasource.filters: 连接池所用多种过滤器
  • spring.datasource.max-active: 连接池最大连接数
  • spring.datasource.initial-size: 连接池初始连接数
  • spring.datasource.min-idle: 连接池最小闲置连接数
  • spring.datasource.max-wait: 连接池最大等待时长
  • spring.datasource.validation-query: 连接验证的sql语句
  • spring.datasource.test-while-idle: 是否开启空闲检查
  • spring.datasource.test-on-borrow: 是否开启连接获取时检查
  • spring.datasource.test-on-return: 是否开启连接返回时检查
  • spring.datasource.time-between-eviction-runs-millis: 空闲检测周期
  • spring.datasource.min-evictable-idle-time-millis: 最小空闲时间
  • spring.datasource.log-abandoned: 是否打印连接泄露日志
  • spring.datasource.remove-abandoned: 是否自动回收超过最大闲置时间的连接
  • spring.datasource.remove-abandoned-timeout-millis: 超时时间由检测自动回收功能
  • spring.datasource.pool-prepared-statements: 是否缓存prepared statements
  • spring.datasource.max-pool-prepared-statement-per-connection-size: 单个连接最大缓存prepare statement数量

示例

第一条示例

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private DataSource dataSource;

    private static final Logger logger = LoggerFactory.getLogger(UserService.class);

    /**
     * 添加用户
     */
    public void addUser(String name, Integer age) {
        userDao.addUser(name, age);
    }

    /**
     * JdbcTemplate操作数据库
     */
    public void addUserByJdbcTemplate(String name, Integer age) {
        String sql = "INSERT INTO user(name, age) VALUES(?,?)";
        try {
            jdbcTemplate.update(sql, name, age);
        } catch (DataAccessException e) {
            logger.error("addUserByJdbcTemplate异常:", e);
        }
    }

    /**
     * DruidDataSource获取连接
     */
    public void addUserByDataSource(String name, Integer age) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            connection = dataSource.getConnection();
            String sql = "INSERT INTO user(name, age) VALUES(?,?)";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, name);
            preparedStatement.setInt(2, age);
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            logger.error("addUserByDataSource异常:", e);
        } finally {
            try {
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                logger.error("addUserByDataSource关闭连接异常:", e);
            }
        }

    }
}

上述代码中使用了三种方式操作数据库,分别是:

  1. 使用UserDao中封装好的增加用户的方法
  2. 使用JdbcTemplate对象操作数据库
  3. 使用DataSource对象获取连接,再通过PrepareStatement执行增加操作

第二条示例

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * 数据库配置例子
 * <p>
 * Created by jim on 2017/6/24.
 */
public class ApplicationTest {

    private static final String DB_URL = "jdbc:mysql://localhost/test";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123456";

    @Autowired
    private DataSource dataSource;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void test() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(DB_URL);
        druidDataSource.setUsername(USERNAME);
        druidDataSource.setPassword(PASSWORD);
        druidDataSource.setMaxActive(20);
        druidDataSource.setInitialSize(1);
        druidDataSource.setMinIdle(3);
        druidDataSource.setMaxWait(60000);
        druidDataSource.setPoolPreparedStatements(true);
        druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
        dataSource = druidDataSource;

        String sql = "INSERT INTO user(name,age) VALUES (?,?)";
        jdbcTemplate.update(sql, "name", 18);
    }

}

上述代码中,构建了一个DruidDataSource对象,设置连接url、用户名、密码等连接池参数,之后通过set方法注入到dataSource属性。

通过注入的JdbcTemplate对象即可完成数据库增加操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:数据库阿里连接池 druid配置详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • JDBC连接的六步实例代码(与mysql连接)

    下面是详细讲解连接mysql数据库的JDBC六步实例代码: 1. 加载JDBC驱动 在使用JDBC连接MySQL数据库之前,首先需要加载MySQL的JDBC驱动程序。JDBC提供了一个标准的接口,供不同的数据库厂商实现自己的JDBC驱动程序。使用MySQL数据库,我们需要先添加mysql-connector-java.jar包到项目中,然后使用Class.f…

    database 2023年5月21日
    00
  • 基于Mongodb分布式锁解决定时任务并发执行问题

    基于Mongodb分布式锁解决定时任务并发执行问题 分布式系统中,多台应用服务器可能同时执行同一个定时任务,导致重复执行或者并发执行的问题。为了解决此类问题,我们可以考虑使用分布式锁机制来协调不同服务器之间的定时任务执行。 Mongodb是一个分布式文档数据库,它支持分布式锁机制,可以很方便地用于解决上述问题。 具体操作步骤如下: 连接 Mongodb 数据…

    database 2023年5月22日
    00
  • Spring 环境下实现策略模式的示例

    针对“Spring 环境下实现策略模式”的问题,我这里为您提供以下完整攻略: 策略模式简介 首先,我们来简单介绍一下策略模式。策略模式是一种行为型设计模式,它定义了一族算法类,将每个算法分别封装起来,让它们之间可以相互替换。策略模式使得算法的变化独立于使用算法的客户端。 策略模式的优点 策略模式实现了代码重用的原则; 策略模式提供了一种可插拔的方式,方便变化…

    database 2023年5月22日
    00
  • PHP 5.6.11中CURL模块问题的解决方法

    下面是“PHP 5.6.11中CURL模块问题的解决方法”的完整攻略,具体内容如下: 问题描述 在PHP 5.6.11的环境中,使用CURL模块时会出现一些问题,例如无法正常发送HTTP请求、出现SSL证书验证失败等问题,这些问题都会影响到应用的正常运行。 解决方法 解决这个问题的方法是升级CURL模块。具体的步骤如下: 步骤一:备份原有的CURL模块 在进…

    database 2023年5月22日
    00
  • DBMS 中的传递依赖

    DBMS 中的传递依赖指的是在一个关系模式中,如果存在一个函数依赖 A -> B,同时存在另一个函数依赖 B -> C,则我们可以推出一个传递依赖 A -> C。通过这种传递依赖,我们可以更加方便地对关系中数据的查询和操作。 详细的过程如下: 确定存在两个函数依赖 A->B 和 B->C,其中 A、B、C 是关系模式中的属性。 …

    database 2023年3月27日
    00
  • MySQL存储过程中实现执行动态SQL语句的方法

    MySQL 存储过程中实现执行动态 SQL 语句有以下三种方法: 方法一:使用 PREPARE 和 EXECUTE语句 使用PREPARE语句,将 SQL 语句存储在一个变量中; 使用EXECUTE语句,执行该变量中的SQL语句,可以动态拼接 SQL 语句。 下面是一个示例,演示了如何动态拼接 SQL。 CREATE PROCEDURE my_proc(IN…

    database 2023年5月22日
    00
  • centos7搭建redis主从复制,并模拟故障切换。

     Cntos7搭建redis主从复制,并模拟故障主从切换 主从复制搭建 主机:192.168.161.179 从机:192.168.161.180 1、        安装主redis 自己本地环境,关闭防火墙。  #sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config #se…

    Redis 2023年4月12日
    00
  • MySQL中NULL对索引的影响深入讲解

    MySQL中的NULL对索引有着深入的影响,常常会导致查询性能下降。为了更好地理解和应对这个问题,我们有必要从以下几个方面来深入探讨: 什么是NULL? NULL是MySQL中的一个特殊值,表示该列的值未知或不可用。 具体来说,NULL有以下特点: 它不等于任何值,包括它自己。 它的数据类型在运行时才确定。 它与空字符串、0、以及FALSE等不同,这些值都表…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部