在路上

路上有惊慌,路上有理想

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks
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) 命令更改的数据库默认属性,那么现有的表的默认字符集和排序规则不受影响。新建的表即使不指定字符集,仍采用数据库的字符集。

 

posted on 2010-12-09 12:56 阮步兵 阅读(1636) 评论(2)  编辑  收藏 所属分类: MySQL

Feedback

# Juicy Couture 2010-12-09 16:41 Juicy Couture
嗯 有些该注意的地方 都注意了  回复  更多评论
  

# re: mysql学习笔记(2) 2010-12-10 10:05 mashiguang
收藏了,谢谢  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: