首先看一下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 |