当前位置: 首页 > 科技观察

文章把配置数据源的参数解释的很清楚

时间:2023-03-20 20:54:40 科技观察

鉴于在开发环境中,我们已经使用了yml配置文件,我们在yml配置文件中加入了连接数据库的配置,即,配置我们的连接池,但是针对不同的数据库,连接数据库的Jar包也不一样,相应的配置也不同。今天阿芬就说说这个SpringBoot项目中配置数据库连接和不同数据库的各种参数,应该如何配置。我们先看看MySQL的配置,然后再看看每一个配置是什么意思。spring:datasource:name:testurl:jdbc:mysql://localhost:3306/test用户名:root密码:xxx#使用druid数据源类型:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:com.mysql.jdbc.Driverfilters:statmaxActive:20initialSize:1maxWait:60000minIdle:1timeBetweenEvictionRunsMillis:60000minEvictableIdleTimeMillis:300000validationQuery:select'x'testWhileIdle:truetestOnBorrow:falsetestOnReturn:falsepoolPreparedStatements:true上面最简单的名称url、用户名、密码、类型我就不多说了。我要说的是剩下的参数代表什么。这里配置过滤器为插件,常用的插件有:监控统计:filter:stat日志监控:filter:log4jorslf4j防御SQL注入:filter:wallmaxActive连接池initialSize时支持多少活跃会话启动程序,在连接池中maxWait中初始化了多少个连接当程序向连接池请求连接时,超过maxWait的值后,认为请求失败,即没有可用的连接在连接池中,单位是毫秒。当设置为-1时,表示无限等待minIdle回收空闲连接。它将确保至少有minIdle连接。timeBetweenEvictionRunsMillis检查空闲连接的频率,以毫秒为单位。如果是非正整数,则表示不进行校验。回收连接,应该小于防火墙超时设置net.netfilter.nf_conntrack_tcp_timeout_established设置validationQuerySQL语句检查池中的连接是否仍然可用,drui会连接数据库执行SQL,如果正常返回,表示连接可用,否则表示连接不可用testWhileIdle当程序请求连接时,连接池是否在分配连接时首先检查连接是否有效。(高效)testOnBorrow程序在申请连接时,检查连接的有效性(效率低,影响性能)。通常,设置为false。testOnReturn程序返回连接时,检查连接的有效性(效率低,影响性能)。falsepoolPreparedStatements有以下两种方法发起的缓存SQL:publicPreparedStatementprepareStatement(Stringsql)publicPreparedStatementprepareStatement(Stringsql,intresultSetType,intresultSetConcurrency)建议设置为true。其实有一些配置我们是非常熟悉的。你为什么这么说?因为经常会出现连接关闭的错误,而这个错误可能是参数配置不当造成的。配置可能引起的一些问题其实我们需要多注意参数validationQuery。validationQuery是用于验证数据库连接的查询语句。该查询语句必须是至少返回一条数据的SELECT语句。每个数据库都有自己的validation语句,阿芬也收集了几个常用数据库的validationQuery。hsqldbselect1fromINFORMATION_SCHEMA.SYSTEM_USERSOracleselect1fromdualDB2select1fromsysibm.sysdummy1MySqlselect1MicrosoftSqlServerselect1postgresqlselectversion()ingresselect1derbyvalues1H2select1还有这个参数,一般要看是否执行为真后生效,validationQuery参数必须设置为非空字符串。如果同样将testOnReturn设置为true才能生效,则validationQuery参数必须设置为非空字符串。但是如果我们将testOnBorrow设置为false,就会出现一些问题。如果连接池中的连接被数据库关闭,应用程序可能会通过连接池getConnection获取这些不可用的连接,如果这些连接没有被其他线程回收的话;它们不会被连接池废除,也不会重新建立,占用连接池的配额。如果项目是服务端,数据库连接关闭,客户端调用服务端超时会出现大量调用,客户端设置超时时间,会主动断开连接,服务端会出现close_wait。这就是为什么有时候在查看日志的时候,会出现一些close_wait的错误。虽然知道不影响业务,但是看着日志还是不爽。那么为什么要设置为false呢?因为testOnBorrow可以保证我们每次都能拿到可用的连接,但是如果设置为true,每次拿到连接都得去数据库验证连接的有效性,会造成性能下降高并发时。将testOnBorrow设置为false并将testWhileIdle设置为true以获得更好的性能。这也会执行我们上面提到的validationQuery参数中的SQL来验证连接的有效性。这样每次连接失败后,都会使用validationQuery来验证是否失效。