1. 程式人生 > 其它 >CTFhub htaccess檔案【不用連webshell工具檢視flag】

CTFhub htaccess檔案【不用連webshell工具檢視flag】

線下Tomcat出現故障,檢視日誌報錯:

HikariPool-1 - Connection is not available, request timed out after 30000ms

最後調查的問題是:

某個Service中有個方法使用 httpclient 呼叫了一個外部介面,而當時這個外部介面服務出現故障,導致httpclient呼叫卡死了,一直沒有響應,因為在Service方法中,也就是在資料庫事務中,httpclient呼叫卡死導致 資料庫連線一直無法釋放,卡死的httpclient呼叫不斷的增大,資料庫連線不斷的被佔用並且無法釋放,最終達到了最大值:

<!-- 連線池中允許的最大連線數。預設值:10;推薦的公式:((core_count * 2) + effective_spindle_count) -->
<property name="maximumPoolSize" value="15" />

其他功能需要訪問資料庫時,就報錯:HikariPool-1 - Connection is not available, request timed out after 30000ms

這裡問題的關鍵在於 不能在事務中呼叫外部介面,不能在事務中有耗時的操作等存在。這樣會導致事務變成大事務,長時間佔用資料庫連線、有可能還導致事務長時間持有相關鎖從而導致死鎖。

最佳的解決辦法,自然是把 httpclient 外部呼叫移到事務外面。實時證明,移到事務外面就恢復正常了。

另外,httpclient 呼叫應該加上超時現在,比如超過2秒沒有返回,就斷開:

 URL url = new URL(urlAddress);
 URLConnection conn = url.openConnection();
 conn.setConnectTimeout(2000); 	// 2秒沒有連上,則超時
 conn.setReadTimeout(2000); 	// 2秒沒有響應,則超時

這樣也可以緩解問題。但是最好的方法還是把外部呼叫移到事務外面!

這裡有個原理需要弄清楚:

service方法裡面就是一個 httpclient 呼叫,沒有查詢資料庫,為什麼還是 會佔用資料庫連線呢????

原因是 資料庫事務肯定是需要基於資料庫連線的!就行我們在mysql客戶端裡面執行:begin transaction 命令一樣,先得連上mysql 。沒有連上mysql,無法開啟事務。

這也是為什麼在 service方法裡面沒有查詢mysql,但是還是會佔用一個數據庫連線的原因所在。