首先看一下MySQL的配置,我们使用的是MySQL的变种MariaDB,基本可以认为就是MySQL。安装好,配置用户直接就可以用了。使用前可以调整一下连接端口,数据存储位置,将字符集改为utf8mb4以支持表情字符集。[mysqld > wait_timeout]属性默认值为28800s,即8小时,表示如果一个connection空闲达到这个时间,将被关闭,由于程序端不知道一个connection已经被数据库关闭,就有可能继续使用这个connection,这样会发生错误,因此我们可以将这个值改大些以减少这种情况的发生,比如7天,604800s,wait_timeout过大当然也有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能。
其配置如下:
cat/etc/my.cnf
[mysqld]
port = 3306
#datadir=/var/lib/mysql
datadir=/home/mysqldata
socket=/var/lib/mysql/mysql.sock
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#Settings user and group are ignored when systemd is used.
# If youneed to run mysqld under a different user or group,
#customize your systemd unit file for mariadb according to the
#instructions in http://fedoraproject.org/wiki/Systemd
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
wait_timeout=604800
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# includeall files from the config directory
#
!includedir/etc/my.cnf.d
除了wait_timeout属性外,还有个interactive_timeout属性,和wait_timeout的区别如下,不用搭理:
interactive_timeout:交互式连接超时时间(mysql工具、mysqldump等)。
wait_timeout:非交互式连接超时时间,默认的连接mysql api程序。
在程序端,使用Druid连接池来管理数据库连接,其配置同dbcp,c3p0等大同小异。属性表如下,从网上找了一张,部分缺省值和我使用的Druid缺省值不同,可能是Druid版本差异的原因,不深究,部分说明似乎有误,进行了修改。
构造DruidDataSource,设定数据库类型,帐号信息等,直接使用即可,如果其缺省值不合适,如initialSize 、maxActive 、minIdle、maxWait,根据实际情况调整一下。
testOnBorrow、testOnReturn、testWhileIdle、timeBetweenEvictionRunsMillis、validationQuery这几个属性强调一下,这几个属性用来检测数据库连接的有效性,testOnBorrow、testOnReturn这两个属性分别是在申请连接和归还连接时检查数据库连接,代价是增加了数据库操作,影响性能,在生产环境一般不开启。testWhileIdle是异步的,对性能影响小,建议开启,每间隔timeBetweenEvictionRunsMillis执行检测。validationQuery是用来验证数据库连接的查询语句,这个查询语句必须是至少返回一条数据的SELECT语句,每种数据库都有各自的验证语句,下面的表中收集了几种常见数据库的,如果没有配置这个属性,前面的3个test属性都没有效果。
DruidDataSource配置属性列表
配置 | 缺省值 | 说明 |
name |
| 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。 |
url |
| 连接数据库的url,不同数据库不一样。例如: |
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 | true | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
testOnReturn | false | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 |
testWhileIdle | false | 建议配置为true,不影响性能,并且保证安全性。每隔timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 |
timeBetweenEvictionRunsMillis | 1分钟(1.0.14) | 有两个含义: |
numTestsPerEvictionRun |
| 不再使用,一个DruidDataSource只支持一个EvictionRun |
minEvictableIdleTimeMillis | 30分钟(1.0.14) | 连接保持空闲而不被驱逐的最长时间 |
connectionInitSqls |
| 物理连接初始化的时候执行的sql |
exceptionSorter | 根据dbType自动识别 | 当数据库抛出一些不可恢复的异常时,抛弃连接 |
filters |
| 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: |
proxyFilters |
| 类型是List<com.alibaba.druid.filter.Filter>,如果同时配置了filters和proxyFilters,是组合关系,并非替换关系 |
DataBase | validationQuery |
hsqldb | select 1 from INFORMATION_SCHEMA.SYSTEM_USERS |
Oracle | select 1 from dual |
DB2 | select 1 from sysibm.sysdummy1 |
MySql | select 1 |
Microsoft SqlServer | select1 |
postgresql | select version() |
ingres | select 1 |
derby | values 1 |
H2 | select 1 |