我的應用程序服務器有一個到MySQL數據庫的連接。這個連接全天候開放。當互聯網連接丟失時,MySQL連接會發生什麼?
比方說我的互聯網是崩潰,或者我是來阻止端口3306
威爾JDBC拋出一個錯誤?如果不是,我該如何處理這類問題?
我問這個問題的原因是因爲我在MySQL連接隨機停止工作之前就有過病例,但沒有關閉,導致客戶端超時。
我的應用程序服務器有一個到MySQL數據庫的連接。這個連接全天候開放。當互聯網連接丟失時,MySQL連接會發生什麼?
比方說我的互聯網是崩潰,或者我是來阻止端口3306
威爾JDBC拋出一個錯誤?如果不是,我該如何處理這類問題?
我問這個問題的原因是因爲我在MySQL連接隨機停止工作之前就有過病例,但沒有關閉,導致客戶端超時。
您將得到一個MySQLNonTransientConnectionException
或CommunicationsException
。通常情況下,程序的安全,你要麼需要:
打開/關閉連接必要
重新打開時
我推薦前者親自連接被關閉,特別是當該數據庫是用戶指定的(某些mysql設置有連接超時)。
編輯:
我似乎忘了提連接池,每@ThorbjørnRavnAndersen,但是這也是一個可行的解決方案。我個人不這樣做,每個線程操作使用一個可實例化的SQL連接。
就我個人而言,我將任何數據庫調用放入try/catch塊中,因爲總會有潛在的問題出現。您需要在catch塊中設置一些默認值,並且如果它出於某種原因着陸在這些默認值上,請向最終用戶顯示某種(理想情況下相當漂亮的)錯誤消息。
運行SQL查詢並不總是保證能夠撤回任何類型的結果......任何數量的東西都可能出錯 - 服務器可能關閉,連接可能會如此飽和以至於無法拉動結果是及時的,它可能會坐落在各種備份的死亡中心......這些東西都必須經常考慮,這就是爲什麼我建議按照上述方式進行操作。
最後,爲了回答你的問題,是的,在任何這些情況下,JDBC實際上都會拋出一個錯誤。
您可以只需拔下插頭,看看會發生什麼... :-) – thebjorn
http://stackoverflow.com/questions/2983248/com-mysql-jdbc-exceptions-jdbc4-communicationsexception-communications-link-fai – kosa
最容易找到的方法:建立連接並拉出電纜。最糟糕的情況是,你已經發現,你的連接超時。數據庫系統將中止交易,並且 - 如果它在一邊 - 可能會回滾。 –