1.注意auto_increment
mysql5.0在高并发下(每天近2亿)插入单表数据出现了死锁(偶现),查了下相关文档,发现是因为采用了auto-increment的主键带来的问题,造成Table级的死锁。
原因:对于auto_increment字段,innodb会在内存里保存一个计数器用来记录auto_increment的值,当插入一个新行数据时,就会用一个表锁来锁住这个计数器,所以会
造成Table级的死锁。
在Mysql5.1服务器配置多了一个参数innodb_autoinc_lock_mode,可以设置不同的值避免这个问题。比如设为1
innodb_autoinc_lock_mode = 0
(“
traditional” lock mode)
innodb_autoinc_lock_mode = 1
(“
consecutive” lock mode)
Mysql5.1默认
innodb_autoinc_lock_mode = 2
(“
interleaved” lock mode)
2.注意数据库连接
应用中偶现性错误:
Last packet sent to the server was 8202
ms ago.; nested exception is
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link
failure
连接池中的connection无法连接到数据库,原因是池中的空闲conn连接db超时,而c3p0 pool本身不知道。
查了下Mysql5.0文档,默认的等待时间是8小时——show global variables like 'wait_timeout'
但是该服务器的时间又不太合理。
还是觉得在jdbc pool上做调整,比如在jdbc.url加入一个参数autoReconnect=true。可以解决。
3.重视jdbc连接池配置
高并发下,4个连接池,每个100个最大连接。高峰期出行can not get a connection的错误。询问过DBA,mysql数据库高峰期最大连接近300。
理论上连接池还是够的。但仍然爆掉。推测原因可能出在DBCP连接池有些连接使用后一直被占着,没有释放回连接池。
据此,修改DBCP配置,加入2个参数:
removeAbandoned=true
removeAbandonedTimeout==200
问题不再出现。
4.
字符集文件
mysql 数据库目录下面有个文件db.opt ,记录了db的字符集。如果你是通过alter databases(schema) 命令更改的数据库默认属性,那么现有的表的默认字符集和排序规则不受影响。新建的表即使不指定字符集,仍采用数据库的字符集。