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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 拆解量化交易模型

    拆解量化交易模型量化交易看起来似乎就是用机器炒股,没什么大惊小怪的。但是我们拆解开量化交易的模型,您就知道其中的奥秘了。首先是输入环节:假如你是量化交易建模师。你把各种你觉得会影响股价波动的重要因素的相关数据输入到程序中。我们把常用的一种多因子选股的模型展示给大家。各种因子,您就可以理解为是炒股要看的内容。比如普通人要看公司、行业、估值、成交量、业绩等。这些都可以作为因素,将其内含数据包输入到程序里,当做因子之一。估值类因子1、预测最近年度每股股利2、未来12个月预测净利润3、每股收益

    2022年6月26日
    25
  • CSDN积分获取(csdn怎么查看积分)

    下载积分攻略:个人设置里进行手机绑定CSDN账户奖励50分(右上角设置-账户安全-手机绑定)完成任务送若干分积分http://task.csdn.net/上传有效资源获取积分(上传非法,广告资源用户,将被扣除一定积分,严重者封号)。·上传自己设分资源被下载,下载量×资源分,100分封顶。·上传0分资源被下载,下载量×系统奖励1分,100封顶评论资源获取积分(所下载资源只可以…

    2022年4月12日
    68
  • Python statsmodel包训练LR模型

    Python statsmodel包训练LR模型Python中训练LR模型一般使用sklearn包,输出模型报告和其他机器学习方法一样。但从统计背景出发,想看更详细的报告,statsmodel包可以帮助实现。1.训练模型importstatsmodels.apiassmfromstatsmodels.stats.outliers_influenceimportvariance_inflation_factor#tr…

    2022年10月13日
    0
  • eplanwin10激活码获取_在线激活

    (eplanwin10激活码获取)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWN…

    2022年3月27日
    306
  • Python学习【第五篇】循环语句「建议收藏」

    Python学习【第五篇】循环语句「建议收藏」Python循环语句接下来将介绍Python的循环语句,程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构,允许更复杂的执行路径。循环语句允许我们执行一个语句或语句组多次。Python

    2022年7月5日
    15
  • java视频教程不同阶段看哪些[通俗易懂]

    java视频教程不同阶段看哪些[通俗易懂]第一个阶段(基础阶段)1、你要掌握HTML语言,认为常用的HTML一些标签。我推荐大家学习孙鑫老师视频的《HTML语言速成》2、掌握JAVA基础,也就是J2SE,我推荐大家学习马士兵老师的J2SE视频。当时我学习J2SE主要学习的张孝祥和孙鑫老师的视频(当时还不知道马士兵老师呢!呵呵)不过我认为孙鑫老师前面几讲还是值得初学者看的,…

    2022年5月16日
    34

发表回复

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

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