mysql實戰問題的處理
記錄工作中使用mysql的疑難雜症及解決。
www.2cto.com
1 pipe broken or connection broken
使用pol的mysql client端的連接莫名斷開,一般都是由server端主動斷開連接引發,需要查一下連接池中的maxIdle與mysql的wait_timeout,前者一定要小,否則connection會被server主動斷開。
2 域名下的slave機的負載均衡
目前免費的連接池如c3p0、dbcp的線程池使用方式都是lifo,如果你恰好用域名來管理多個ip下的mysql slave實例,你可能會發現各個slave的連接、負載很不均衡。
解決:1)小心調整idleTime、min/max poolsize;2)增加一層proxy,來代理對這些線程池的connection管理。不過這樣需要知道每個connection的ip,driver沒有,有一個辦法通過sql來獲取:select @@hostname 查到server的host,這樣配合lookup server,ip也拿到手了;另外也可以直接根據host來管理,不用ip,就是不太直觀;3)自己寫一個driver,不過需要時間和驗證的過程~~~
3 對於唯一鍵刪除+insert的復合操作(unbind + bind)
常見於:業務綁定時,如果已經bind了另外一個唯一鍵,需要先unbind,然後再bind。這是replace into的一展身手的地方。
有幾點要注意:1)如果有多個唯一鍵(包括primary key),如果新插入的row中與多個唯一鍵相同,mysql會先刪除多條,然後插入這一條;2)replace into不能獲取之前那行的原始值,比如replace into xxx on duplicate key update set a=a+1 相當於: set a=default(a)+1;3)table中必須要有unique key,否則相當於insert;
mysql的處理算法:1)try insert;2)if false,del with uniqu/primary key;3)try insert again