数据库阿里连接池 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日

相关文章

  • linux使用gcc编译c语言共享库步骤

    下面是在Linux操作系统中使用gcc编译C语言共享库的步骤攻略: 步骤一:编写C语言共享库代码 首先,我们需要编写C语言共享库的代码。共享库可以支持多个程序同时使用,以节省内存空间。下面是一个简单的共享库示例代码: // 该共享库的源代码存储在test.c文件中 #include <stdio.h> #include <stdlib.h&…

    database 2023年5月22日
    00
  • Django中和时区相关的安全问题详解

    Django中和时区相关的安全问题详解 时区是一个非常重要的概念,它涉及到了全世界的时间计算问题。在Web开发中,时区问题尤为重要,因为我们需要在不同的地方以正确的时间显示数据。Django提供了很好的时区支持,但是如果开发者不小心使用了一些不安全的方法,就有可能导致安全问题。 Django时区支持 Django的时区支持分为两个部分:pytz和django…

    database 2023年5月22日
    00
  • MySQL六种约束的示例详解(全网最全)

    第一步,先介绍约束的概念以及常见的六种约束: 在MySQL中,约束是对表中数据的限制,可以在创建表的过程中定义或者在表创建完成之后添加。六种常见数据库约束包括: PRIMARY KEY (主键) FOREIGN KEY(外键) UNIQUE(唯一) NOT NULL(非空) CHECK(检查) DEFAULT(默认) 主键的作用是唯一标识每张表内每一行数据,…

    database 2023年5月19日
    00
  • ehcache memcache redis 区别

    之前用过redis 和 memcache ,没有ehcache 的开发经验,最近也查阅不少文档和博客,写一些总结,也有不少内容总结与诸多博客中的博主总结:  Ehcache EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider,所以被用于大型复杂分布式web application的各…

    Redis 2023年4月12日
    00
  • MySQL 4种常用的主从复制架构

    MySQL主从复制是一种常用的数据复制方式,可以实现数据的备份、读写分离等多种功能。MySQL 4种常用的主从复制架构包括基于二进制日志的复制、基于GTID的复制、基于半同步复制和基于组复制。下面将为您详细介绍这四种架构的实现方法。 基于二进制日志的复制 基于二进制日志的MySQL主从复制是最常见的一种方式,实现起来也比较简单。步骤如下: 在主服务器的my.…

    database 2023年5月21日
    00
  • 更改linux用户登录shell的操作方法

    更改Linux用户登录shell的操作方法可以通过修改/etc/passwd文件来实现。 具体步骤如下: 以root身份登录Linux系统。 打开/etc/passwd文件,查找需要更改登录shell的用户,并确保有足够的权限对文件进行修改。 vim /etc/passwd 在文件中找到用户的行,形式如下: username:x:uid:gid:commen…

    database 2023年5月22日
    00
  • mybatis自定义参数类型转换器数据库字段加密脱敏

    关于“mybatis自定义参数类型转换器数据库字段加密脱敏”的攻略,我们按照以下几个部分进行讲解: 背景介绍 加密和脱敏的概念 mybatis自定义参数类型转换器的概念和原理 实现方法和示例说明 1. 背景介绍 在实际的业务场景中,常常需要对数据库中的某些字段进行加密或脱敏处理。例如,用户注册时的密码,需要进行加密处理;用户的真实姓名,需要进行脱敏处理。而M…

    database 2023年5月21日
    00
  • MySQL Innodb表导致死锁日志情况分析与归纳

    针对这一主题,我们将提供以下完整攻略,分为以下几个部分: 死锁问题背景介绍 死锁日志分析工具介绍 死锁原因分析 死锁问题解决方案 接下来,将为您一一介绍。 (一)死锁问题背景介绍 首先,我们需要知道什么是死锁。死锁是指两个或多个进程同时持有自己的锁,并且互相等待对方的锁释放,导致程序无法执行下去,最终导致系统无法响应。对于MySQL数据库来说,死锁问题时常发…

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