解決使用MySQL C-API開發應用時的連線超時問題
大概初用C-API進行MySQL應用開發的人,都會遇到這種問題,就是當應用停頓了一段時間以後,連線會自動中斷掉。
仔細試驗,會發現這主要與引數interactive_timeout有關,它預設值28800, 合計,好像是8個小時
其實,我們在應用裡邊,可以在獲取連線以後,加大這個值,使應用不會自動中斷的連線。
mysql> show variables like '%time%';
+--------------------------+-------------------+
| Variable_name | Value |
+--------------------------+-------------------+
| connect_timeout | 5 |
| datetime_format | %Y-%m-%d %H:%i:%s |
| delayed_insert_timeout | 300 |
| flush_time | 1800 |
| innodb_lock_wait_timeout | 50 |
| interactive_timeout | 28800 |
| long_query_time | 10 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| slow_launch_time | 2 |
| sync_replication_timeout | 10 |
| system_time_zone | |
| time_format | %H:%i:%s |
| time_zone | SYSTEM |
| timed_mutexes | OFF |
| wait_timeout | 28800 |
+--------------------------+-------------------+
mysql> set interactive_timeout=1073741824;
Query OK, 0 rows affected (0.06 sec)
mysql> show variables like 'intera%timeout';
+---------------------+----------+
| Variable_name | Value |
+---------------------+----------+
| interactive_timeout | 31536000 |
+---------------------+----------+
1 row in set (0.02 sec)
mysql> show variables like '%timeout%';
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| connect_timeout | 5 |
| delayed_insert_timeout | 300 |
| innodb_lock_wait_timeout | 50 |
| interactive_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| slave_net_timeout | 3600 |
| sync_replication_timeout | 10 |
| wait_timeout | 28800 |
+--------------------------+----------+
9 rows in set (0.00 sec)
如果不放心,可以將wait_timeout也改大。
至於在C應用裡怎麼執行,直接執行SQL語句:
set interactive_timeout=1073741824
即可。
其實,要想永不中斷,比較理想的方法,是自己實現一個連線池,每隔一個週期(比如10分鐘),主動查詢一次資料庫,這樣,這個連線永遠是活動的。