1. 程式人生 > >解決使用MySQL C-API開發應用時的連線超時問題

解決使用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分鐘),主動查詢一次資料庫,這樣,這個連線永遠是活動的。