結(jié)論:
數(shù)據(jù)庫連接數(shù)突增是數(shù)據(jù)庫連接資源沒有及時釋放。
連接數(shù)據(jù)庫超時是因為數(shù)據(jù)庫連接資源釋放的過早褪迟。
現(xiàn)象1:每次上線項目DB的連接數(shù)會突增冗恨。
?
原因:是項目關(guān)閉的時候沒有釋放連接資源導(dǎo)致。
DB的connection資源沒有正常釋放味赃,導(dǎo)致項目啟動的時候再次創(chuàng)建數(shù)據(jù)庫連接資源掀抹,就出現(xiàn)了連接數(shù)突增的現(xiàn)象。一段時間后mysql根據(jù)wait_time的配置心俗,自動回收conncetion傲武,所以連接數(shù)又回落回來。
如果是是DB的connection資源沒有正常釋放城榛,最可能的是在項目關(guān)閉的時候沒有釋放掉DB的連接資源揪利。
經(jīng)過在查看線上jekins的上線腳本后,發(fā)現(xiàn)線上停止項目使用的kill進(jìn)程的方式來停止項目狠持。那么就證明假設(shè)都成立了疟位。接下來解決問題環(huán)節(jié)(程序員們喜聞樂見的百度和谷歌環(huán)節(jié)了)。
解決方案
1.主動釋放
項目關(guān)閉使用正確的stop命令喘垂,保證項目能正確的釋放掉各種資源献汗。
執(zhí)行命令:xxxx_tomcat.stop
2.被動釋放
現(xiàn)象2:連接數(shù)據(jù)庫超時。
com.mysql.jdbc.CommunicationsException: The last packet successfully received from the server was58129 seconds ago.The last packet sent successfully to the server was58129seconds ago, which is longer than the server configured value of'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured valuesforclient timeouts, or using the Connector/J connection property'autoReconnect=true'to avoidthisproblem. mysql
問題原因 :連接池里的connection資源mysql主動提前釋放導(dǎo)致王污。
原因是在datasource連接池中配置的最大空閑時間到達(dá)之前(比如maxIdleTime罢吃,不通數(shù)據(jù)源配置名不一樣),已經(jīng)到達(dá)mysql的wait_timeout(最大空閑時間)昭齐,是mysql主動把connection資源回收尿招。但是項目中的連接池還持有connection,所以當(dāng)項目中使用connection的時候會報CommunicationsException錯誤阱驾。
解決方案
1.修改mysql的wait_time,interactive_timeout把值調(diào)大(不建議如果太大就谜,可能導(dǎo)致連接數(shù)較多,引起性能下降)
2.配置JDBC的重連機(jī)制autoReconnect(不建議里覆,只有4.x版本丧荐,起作用)
jdbc:mysql://localhost:3306/test?user=root&password=&autoReconnect=true
3.減少連接池內(nèi)的存活時間+JDBC探活(建議,搭配使用效果好)
最大閑置資源時間的配置
兩個現(xiàn)象的解決方案都指向了同一個配置就是connection的最大閑置資源時間喧枷。
?
有兩個地方可以配置最大閑置資源時間:
1.在項目的連接池中配置虹统,比如maxIdleTime弓坞。
2.在mysql中也可以配置,interactive_timeout和wait_timeout车荔。
三渡冻、MySql中的connection超時配置
mysql的配置中有interactive_timeout和wait_timeout兩個參數(shù),這兩個參數(shù)有時候還存在覆蓋的關(guān)系忧便,所以還是給大伙說清楚一點兩個的區(qū)別和聯(lián)系方便大家理解族吻。
建議interactive_timeout和wait_timeout參數(shù)值配置成一樣的。
1.interactive_timeout和wait_timeout概念
mysql的連接超時時間配置
wait_timeout非交互式連接超時通過jdbc連接數(shù)據(jù)庫是非交互式連接珠增,最大閑置時間用于規(guī)定一個connection最大的空閑時間超歌,默認(rèn)是28800秒,超時MySQL會自動回收該connection蒂教。
interactive_timeout交互式連接超時通過mysql客戶端連接數(shù)據(jù)庫是交互式連接握础,最大閑置時間用于規(guī)定一個connection最大的空閑時間,默認(rèn)是28800秒悴品,超時MySQL會自動回收該connection禀综。
2.修改配置參數(shù)的方式
1.修改配置文件my.ini
2.執(zhí)行mysql命令
#修改global級別的配置
set global interactive_timeout = 10;
set global wait_timeout = 10;
#修改session級別的配置
set session ?interactive_timeout=20;
set session ?wait_timeout=20;
3.查看參數(shù)配置
mysql> show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name? ? ? ? ? ? ? | Value? ? |
+-----------------------------+----------+
| connect_timeout? ? ? ? ? ? | 10? ? ? |
| delayed_insert_timeout? ? ? | 300? ? ? |
| have_statement_timeout? ? ? | YES? ? ? |
| innodb_flush_log_at_timeout | 1? ? ? ? |
| innodb_lock_wait_timeout? ? | 50? ? ? |
| innodb_rollback_on_timeout? | OFF? ? ? |
| interactive_timeout? ? ? ? | 28800? ? |
| lock_wait_timeout? ? ? ? ? | 31536000 |
| net_read_timeout? ? ? ? ? ? | 30? ? ? |
| net_write_timeout? ? ? ? ? | 60? ? ? |
| rpl_stop_slave_timeout? ? ? | 31536000 |
| slave_net_timeout? ? ? ? ? | 60? ? ? |
| wait_timeout? ? ? ? ? ? ? ? | 28800? ? |
+-----------------------------+----------+
13 rows in set (0.00 sec)
3.參數(shù)不同的繼承關(guān)系
1.interactive_timeout和wait_timeout配置最終生效都是作用在session交互的時候生效。
2.控制最大空閑時間的參數(shù)是wait_timeout在起作用苔严。不管是非交互式還是交互式連接定枷,都是wait_timeout起作用
3.交互式連接下的wait_timeout和interactive_timeout配置都會繼承自全局的interactive_timeout參數(shù)。
1.wait_timeout決定連接超時時間的演示
因為我們是用mysql客戶端連接届氢,應(yīng)該是交互式連接欠窒,連接超時起作用的應(yīng)該是interactive_timeout參數(shù),但是真是的這樣嗎退子。
確認(rèn)設(shè)置連接空閑超時時間是WAIT_TIMEOUT
============= wait_timeout ================
mysql> set session WAIT_TIMEOUT=2;
Query OK, 0 rows affected (0.00 sec)
等待2秒再次查詢岖妄,連接已經(jīng)丟失,說明配置生效寂祥。
mysql> select 1;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:? ? 50
Current database: *** NONE ***
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
============= interactive_timeout ================
mysql> set session? interactive_timeout=2;
Query OK, 0 rows affected (0.00 sec)
等待2秒再次查詢荐虐,連接也沒有丟失,說明配置未生效丸凭。
mysql> select 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
2.interactive_timeout不同的繼承演示
設(shè)置interactive_timeout的配置
mysql> set global interactive_timeout=10;
Query OK, 0 rows affected (0.00 sec)
mysql> select variable_name,variable_value from information_schema.global_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name? ? ? | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 10? ? ? ? ? ? |
| WAIT_TIMEOUT? ? ? ? | 28800? ? ? ? ? |
+---------------------+----------------+
2 rows in set, 1 warning (0.00 sec)
新開一個窗口(交互式連接)查看福扬,wait_timeout?和?interactive_timeout 都繼承自global的interactive_timeout
交互式連接下可以看到interactive_timeout和wait_timeout都繼承自全局INTERACTIVE_TIMEOUT
mysql> select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout');
+---------------------+----------------+
| variable_name? ? ? | variable_value |
+---------------------+----------------+
| INTERACTIVE_TIMEOUT | 10? ? ? ? ? ? |
| WAIT_TIMEOUT? ? ? ? | 10? ? ? ? ? ? |
+---------------------+----------------+
2 rows in set, 1 warning (0.00 sec)
使用JDBC查詢(非交互式)查看,wait_timeout繼承自全局wait_timeout惜犀,interactive_timeout繼承自全局interactive_timeout
Class.forName("com.mysql.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/deeluma_01","root","root");Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("select variable_name,variable_value from information_schema.session_variables where variable_name in ('interactive_timeout','wait_timeout')");while(resultSet.next()){String variable_name = resultSet.getString("variable_name");intvariable_value = resultSet.getInt("variable_value");System.out.println(variable_name+":"+variable_value);}//非交互式下查看铛碑,wait_timeout繼承自全局wait_timeout,interactive_timeout繼承自全局interactive_timeout//===============//INTERACTIVE_TIMEOUT:10WAIT_TIMEOUT:28800