免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
SQL查詢超時(shí)的設(shè)置方法
分類: 數(shù)據(jù)庫技術(shù) 2013-04-16 10:48 1601人閱讀 評(píng)論(0) 收藏 舉報(bào)

為了優(yōu)化OceanBase的query timeout設(shè)置方式,特調(diào)研MySQL關(guān)于timeout的處理,記錄如下。


  1. mysql> show variables like '%time%';  
  2. +----------------------------+-------------------+  
  3. | Variable_name              | Value             |  
  4. +----------------------------+-------------------+  
  5. | connect_timeout            | 10                |  
  6. | datetime_format            | %Y-%m-%d %H:%i:%s |  
  7. | delayed_insert_timeout     | 300               |  
  8. | flush_time                 | 1800              |  
  9. | innodb_lock_wait_timeout   | 50                |  
  10. | innodb_old_blocks_time     | 0                 |  
  11. | innodb_rollback_on_timeout | OFF               |  
  12. | interactive_timeout        | 28800             |  
  13. | lc_time_names              | en_US             |  
  14. | lock_wait_timeout          | 31536000          |  
  15. | long_query_time            | 10.000000         |  
  16. | net_read_timeout           | 30                |  
  17. | net_write_timeout          | 60                |  
  18. | slave_net_timeout          | 3600              |  
  19. | slow_launch_time           | 2                 |  
  20. | system_time_zone           |                   |  
  21. | time_format                | %H:%i:%s          |  
  22. | time_zone                  | SYSTEM            |  
  23. | timed_mutexes              | OFF               |  
  24. | timestamp                  | 1366027807        |  
  25. | wait_timeout               | 28800             |  
  26. +----------------------------+-------------------+  
  27. 21 rows in set, 1 warning (0.00 sec)  


重點(diǎn)解釋其中幾個(gè)參數(shù):

connect_timeout: 

The number of seconds that the mysqld server waits for a connect packet before respondingwith Bad handshake. The default value is 10 seconds as of MySQL 5.1.23 and 5 seconds before that.  Increasing the connect_timeout value might help if clients frequently encounter errors of the form Lost connection to MySQL server at ‘XXX’, system error: errno.
解釋:在獲取鏈接時(shí),等待握手的超時(shí)時(shí)間,只在登錄時(shí)有效,登錄成功這個(gè)參數(shù)就不管事了。主要是為了防止網(wǎng)絡(luò)不佳時(shí)應(yīng)用重連導(dǎo)致連接數(shù)漲太快,一般默認(rèn)即可。


interactive_timeout:

The number of seconds the server waits for activity on an interactive connection before closing it. An interactive client is defined as a client that uses the CLIENT_INTERACTIVE option to mysql_real_connect(). See alsowait_timeout.

解釋:一個(gè)持續(xù)SLEEP狀態(tài)的線程多久被關(guān)閉。線程每次被使用都會(huì)被喚醒為acrivity狀態(tài),執(zhí)行完Query后成為interactive狀態(tài),重新開始計(jì)時(shí)。wait_timeout不同在于只作用于TCP/IP和Socket鏈接的線程,意義是一樣的。

MySQL可以配置連接的超時(shí)時(shí)間,這個(gè)時(shí)間如果做得太長(zhǎng),甚至到了10min,那么很可能發(fā)生這種情況,3000個(gè)鏈接都被占滿而且sleep在哪,新鏈接進(jìn)不來,導(dǎo)致無法正常服務(wù)。因此這個(gè)配置盡量配置一個(gè)符合邏輯的值,60s或者120s等等。

說人話:

命令行下面敲一個(gè)命令后,直至下一個(gè)命令到來之前的時(shí)間間隔為interactive_time,如果這個(gè)時(shí)間間隔超過了interactive_timeout,則連接會(huì)被自動(dòng)斷開,下一個(gè)命令失敗。不過一般的mysql客戶端都有自動(dòng)重連機(jī)制,下一個(gè)命令會(huì)在重連后執(zhí)行。

  1. mysql> set interactive_timeout = 1;  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4.   
  5. mysql> show session variables like '%timeout%';  
  6. +----------------------------+----------+  
  7. | Variable_name              | Value    |  
  8. +----------------------------+----------+  
  9. | connect_timeout            | 10       |  
  10. | interactive_timeout        | 1        |  
  11. | wait_timeout               | 28800    |  
  12. +----------------------------+----------+  
  13. 10 rows in set (0.00 sec)  

=====

  1. mysql> set wait_timeout = 1;  
  2. Query OK, 0 rows affected (0.00 sec)  
  3. 【去泡杯茶,等會(huì)兒】  
  4.   
  5. mysql> show session variables like '%timeout%';  
  6. ERROR 2006 (HY000): MySQL server has gone away  
  7. No connection. Trying to reconnect...  
  8. Connection id:    7  
  9. Current database: *** NONE ***  
  10.   
  11.   
  12. +----------------------------+----------+  
  13. | Variable_name              | Value    |  
  14. +----------------------------+----------+  
  15. | connect_timeout            | 10       |  
  16. | interactive_timeout        | 28800    |  
  17. | wait_timeout               | 28800    |  
  18. +----------------------------+----------+  
  19. 10 rows in set (0.01 sec)  



wait_timeout:
The number of seconds the server waits for activity on a noninteractive connection (連接上沒有活動(dòng)命令,可能是客戶端喝咖啡去了。)before closing it. Before MySQL 5.1.41, this timeout applies only to TCP/IP connections, not to connections made through Unix socket files, named pipes, or shared memory.
On thread startup, the session wait_timeout value is initialized from the global wait_timeout value or from the global interactive_timeout value, depending on the type of client

這里順帶解釋一下什么是non-interactive connection

> Non-Interactive Commands
Just do a quick look up on a table without logging into the client, running the query then logging back out again.
You can instead just type one line using the ' -e ' flag.

  1. c:\mysql\bin\mysql -u admin -p myDatabase -e 'SELECT * FROM employee'  


net_read_timeout / net_write_timeout
The number of seconds to wait for more data from a connection before aborting the read. Before MySQL 5.1.41, this timeout applies only to TCP/IP connections, not to connections made through Unix socket files, named pipes, or shared memory. When the server is reading from the client, net_read_timeout is the timeout value controlling when to abort. When the server is writing to the client, net_write_timeout is the timeout value controlling when to abort. See also slave_net_timeout.
On Linux, the NO_ALARM build flag affects timeout behavior as indicated in the description of the net_retry_count system variable.
解釋:這個(gè)參數(shù)只對(duì)TCP/IP鏈接有效,分別是數(shù)據(jù)庫等待接收客戶端發(fā)送網(wǎng)絡(luò)包和發(fā)送網(wǎng)絡(luò)包給客戶端的超時(shí)時(shí)間,這是在Activity狀態(tài)下的線程才有效的參數(shù)
 


JDBC setQueryTimeout函數(shù):

為了避免查詢出現(xiàn)死循環(huán),或時(shí)間過長(zhǎng)等現(xiàn)象,而導(dǎo)致線程阻塞,在獲得Statement的實(shí)例后,stmt.setQueryTimeout(10); 避免因?yàn)椴樵儗?dǎo)致程序出現(xiàn)線程阻塞。

但昨天發(fā)現(xiàn)程序出現(xiàn)了,“ORA-01013: 用戶請(qǐng)求取消當(dāng)前的操作”的異常。手工執(zhí)行出錯(cuò)SQL語句發(fā)現(xiàn),這個(gè)語句耗時(shí)20多秒。因?yàn)閟etQueryTimeout(10),所以還沒有執(zhí)行完查詢語句就拋出異常了。使用setQueryTimeout(10)時(shí)一定要把時(shí)間設(shè)置的長(zhǎng)一些,如60秒以上。只要不導(dǎo)致線程長(zhǎng)期阻塞,就可以。太短了容易拋出,“ORA-01013: 用戶請(qǐng)求取消當(dāng)前的操作”的異常

JDBC實(shí)現(xiàn)setQueryTimeout的原理:

  1. class IfxCancelQueryImpl extends TimerTask  
  2.   implements IfmxCancelQuery  
  3. {  
  4.   IfxStatement stmt;  
  5.   Timer t = null;  
  6.   
  7.   public void startCancel(IfxStatement paramIfxStatement, int paramInt)  
  8.     throws Exception  
  9.   {  
  10.     this.stmt = paramIfxStatement;  
  11.     this.t = new Timer(true);  
  12.     this.t.schedule(this, paramInt * 1000);  
  13.   }  
  14.   
  15.   public void run()  
  16.   {  
  17.     try  
  18.     {  
  19.       this.stmt.cancel();  
  20.       this.t.cancel();  
  21.     }  
  22.     catch (SQLException localSQLException)  
  23.     {  
  24.       this.t.cancel();  
  25.       throw new Error(localSQLException.getErrorCode() + ":" + localSQLException.getMessage());  
  26.     }  
  27.   }  
  28. }  

可見,query timeout是通過客戶端解決方案來做的,服務(wù)器端無需知曉。通過一個(gè)timer線程來監(jiān)控執(zhí)行時(shí)間,如果執(zhí)行時(shí)間超時(shí),則會(huì)schedule run()函數(shù)。


Reference:   

http://wangwei.cao.blog.163.com/blog/static/10236252620111119115540534/

http://sls8204.blog.163.com/blog/static/62979632200741683453114/


OceanBase可以通過server端支持query timeout,可以設(shè)置query timeout并且不中斷當(dāng)前session。這一點(diǎn)比MySQL先進(jìn)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
解決mysql 長(zhǎng)時(shí)間sleep問題
MySQL中 timeout相關(guān)參數(shù)解析
MySQL性能優(yōu)化之參數(shù)配置
MySQL的timeout那點(diǎn)事
MySQL數(shù)據(jù)庫-sleep線程過長(zhǎng)如何解決?
MySQL數(shù)據(jù)庫連接超時(shí)(wait_timeout)問題的處理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服