mysql连接池DruidDataSource的使用、配置「建议收藏」

mysql连接池DruidDataSource的使用、配置「建议收藏」记录一下使用DruidDataSource的常用配置。1.pom.xml中引入:<!–https://mvnrepository.com/artifact/com.alibaba/druid–><dependency><groupId>com.alibaba</groupId&g…

大家好,又见面了,我是你们的朋友全栈君。

记录一下mysql连接池DruidDataSource的常用配置。

1.pom.xml中引入:

        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.11</version>
        </dependency>

2.代码中配置:

import javax.sql.DataSource;

@Configuration
public class MysqlConfig {
    @Value("${mysql.username}")
    private String username;
    @Value("${mysql.password}")
    private String password;
    @Value("${mysql.url}")
    private String url;

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        //dataSource.setDriverClassName(driverClassName);//如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setValidationQuery("SELECT 1");//用来检测连接是否有效
        dataSource.setTestOnBorrow(false);//借用连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        dataSource.setTestOnReturn(false);//归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
        //连接空闲时检测,如果连接空闲时间大于timeBetweenEvictionRunsMillis指定的毫秒,执行validationQuery指定的SQL来检测连接是否有效
        dataSource.setTestWhileIdle(true);//如果检测失败,则连接将被从池中去除
        dataSource.setTimeBetweenEvictionRunsMillis(60000);//1分钟
        dataSource.setMaxActive(20);
        dataSource.setInitialSize(5);
        return dataSource;
    }

}

3.直接使用(没有引入spring的环境下):

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
DruidPooledConnection connection = null;
PreparedStatement statement = null;
try {
    connection = dataSource.getConnection();
    statement = connection.prepareStatement(sql);
    statement.execute(sql);
} catch (SQLException e) {
    log.error("mysql新增数据异常!sql={}", sql, e);
    throw new SQLException("mysql新增数据异常");
} finally {
    if (statement != null) {
        statement.close();
    }
    // 这里一定要close()。底层是 dataSource.recycle(this) 将连接重新放回了连接池,回收利用
    // 不clone(),每次 getConnection() 都会新建Connection
    // dataSource.recycle(this) -> this.putLast(holder, currentTimeMillis) -> this.connections[this.poolingCount] = e;
    // private volatile DruidConnectionHolder[] connections;
    if (connection != null) {
        connection.close();
    }
}

配置属性详解:

配置 缺省值 说明
name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。
如果没有配置,将会生成一个名字,格式是:”DataSource-” + System.identityHashCode(this). 
另外配置此属性至少在1.0.5版本中是不起作用的,强行设置name会出错
详情-点此处
url 连接数据库的url,不同数据库不一样。例如:
mysql : jdbc:mysql://10.20.153.104:3306/druid2 
oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
username 连接数据库的用户名
password 连接数据库的密码。如果你不希望密码直接写在配置文件中,可以使用ConfigFilter。详细看这里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
driverClassName 根据url自动识别 这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
maxActive 8 最大连接池数量
maxIdle 8 已经不再使用,配置了也没效果
minIdle 最小连接池数量
maxWait 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
poolPreparedStatements false 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
maxOpenPreparedStatements -1 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
validationQuery 用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
validationQueryTimeout 单位:秒,检测连接是否有效的超时时间。底层调用jdbc Statement对象的void setQueryTimeout(int seconds)方法
testOnBorrow false 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn false 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testWhileIdle false 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
timeBetweenEvictionRunsMillis 1分钟(1.0.14) 有两个含义:
1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
numTestsPerEvictionRun 不再使用,一个DruidDataSource只支持一个EvictionRun
minEvictableIdleTimeMillis 30分钟(1.0.14) 连接保持空闲而不被驱逐的最长时间
connectionInitSqls 物理连接初始化的时候执行的sql
exceptionSorter 根据dbType自动识别 当数据库抛出一些不可恢复的异常时,抛弃连接
filters 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall
proxyFilters 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系

validationQuery的值配置:

数据库 validationQuery
Oracle select 1 from dual
MySQL select 1
Microsoft SQL Server select 1
DB2 select 1 from sysibm.sysdummy1
SQLite select 1
HSQLDB select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
postgresql select version()
ingres select 1
Apache Derby select 1
H2 select 1
Informix select count(*) from systables

源码可参考:http://www.heartthinkdo.com/?p=2264#6 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163553.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 淘宝抢购Python脚本

    淘宝抢购Python脚本想买mate40,但总是抢不到,所以想试着能不能写个脚本代码。第一步:把想要抢购的商品加进购物车,注意:脚本是对购物车内全部商品进行下单操作,所以不够买的商品最好先从购物车内删除。第二步:写好Python脚本,在抢购之前运行,并设置好抢购时间。Python脚本实现安装Python。我安装的是anaconda安装webdriver扩展。它是Selenium模块的一部分。Selenium是一个用于Web应用程序测试的工具,用于测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。Selen

    2022年4月29日
    47
  • 手把手教你用idea搭建ssm项目并实现简单demo(超详细)

    手把手教你用idea搭建ssm项目并实现简单demo(超详细)闲暇之余,想搭建一个ssm项目玩玩,结果发现,不百度根本打不出来,搭建出来也有一堆问题,所以在此一步一步记录一下。使用idea搭建ssm项目,首先就是将整个框架整起来如果已经在项目中了,点击左上角file->new->project(刚打开idea是新建->project)[image1]左侧栏目选择maven并勾选createfromarchetype,然后在下面找到org.apache.maven.archetype:maven-archetype-weba

    2022年6月16日
    43
  • ArcGIS二次开发及应用学习的最佳网站

    ArcGIS二次开发及应用学习的最佳网站http://i.youku.com/gisxiaotian里面有大量的ArcGIS二次开发及应用的视频教程,作者会定期的上传ArcGIS教程,看了绝对受益匪浅!

    2022年7月23日
    10
  • 相机标定——张正友棋盘格标定法

    相机标定——张正友棋盘格标定法目录为什么需要相机标定?相机标定可以做什么?相机标定后可以得到什么?什么情况下需要借助相机标定的方法?相机标定的原理实现相机标定的方法 为什么需要相机标定? 一个是由于每个镜头的在生产和组装过程中的畸变程度各不相同,通过相机标定可以校正这种镜头畸变,生成矫正后的图像——矫正透镜畸变; 另一个是根据标定后的到的相机参数建立相机成像几何模型,由获得的图像重构…

    2022年5月8日
    315
  • LARGE_INTEGER类型和LONGLONG类型以及QueryPerformanceFrequency函数

    LARGE_INTEGER类型和LONGLONG类型以及QueryPerformanceFrequency函数LARGE_INTEGERLARGE_INTEGER是union,表示64位有符号整数值。其定义如下:    typedefunion_LARGE_INTEGER{     struct{                 DWORDLowPart;                 LONGHighPart;               };

    2022年7月16日
    24
  • spring拦截器「建议收藏」

    spring拦截器「建议收藏」spring拦截器实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类都可以实现,主要有三个方法,preHandle在调用具体的controller之前执行,postHandle在调用controller之后,但是页面渲染之前执行,afterCompletion在页面渲染之后执行,拦截器的功能类似与filter的功能,个人认为spring为什么搞…

    2022年6月16日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号