MySQL数据库使用注意事项

时间:2022-02-16 15:04:20

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

 

配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分开来。
如果没有配置,将会生成一个名字,格式是:"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

true

申请连接时执行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,是组合关系,并非替换关系

  

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