標籤:mysql執行大量的操作時 報無法串連資料庫的錯誤
問題:mysql執行大量的插敘操作時,報無法串連資料庫的錯誤,錯誤詳情如下:
Fatal error: Uncaught exception ‘PDOException‘ with message ‘SQLSTATE[HY000] [2003] Can‘t connect to MySQL server on ‘127.0.0.1‘ (99)‘ in /mnt/Change/www/html/data/conn.php:5 Stack trace: #0 /mnt/Change/www/html/data/conn.php(5): PDO->__construct(‘mysql:host=127....‘, ‘aaa‘, ‘aaa‘) #1 /mnt/Change/www/html/data/conn.php(12): conn() #2 /mnt/Change/www/html/test/ZB/addHDG.php(22): Sql_Query(‘select LoopData...‘) #3 {main} thrown in /mnt/Change/www/html/data/conn.php on line 5
運行環境:linux+Apache+php+mysql
原因:對MySQL執行操作時,需要串連資料庫,串連是需要佔用連接埠的,大量的查詢把連接埠用完了,資料庫也就無法串連了
查看原因:
執行大量的mysql串連時,在linux中執行
netstat -nt
就會看到大量的串連時TIME_OUT狀態
解決辦法
第一步:最佳化mysql,在拿到資料之後,立刻關閉mysql串連
(1)pdo只需要把串連置成null即可
$pdo=new PDO("mysql:host=127.0.0.1;dbname=aaa","aaa","aaa");//在拿到資料之後執行下面語句即可$pdo=null;
第二步:最佳化linux系統
(1)在/etc/sysctl.cnf中寫入下面語句
net.ipv4.tcp_fin_timeout = 2net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1
解釋:
net.ipv4.tcp_tw_recycle=1就是開啟快速 TIME-WAIT sockets 回收,即快速回收處於TIME-WAIT的串連,預設值是0,即關閉狀態
net.ipv4.tcp_fin_timeout :設定連線逾時時間,單位是秒,預設值是60秒
net.ipv4.tcp_tw_reuse =1:允許重新應用處於TIME-WAIT狀態的socket用於新的TCP串連,預設值是0,即關閉狀態
(2)在linux中執行
sysctl -p
使上面的配置生效
本文出自 “技術” 部落格,請務必保留此出處http://heyu1.blog.51cto.com/13158032/1956343
mysql執行大量的操作時,報無法串連資料庫的錯誤