2012-01-10 79 views
0

我有一個Java Web應用程序,其中我的客戶端連接到Web服務以使用它們的數據更新MySQL數據庫(使用JDBC)。我想要做的是每次客戶端連接並使用Web服務的操作時,檢查所請求的表是否存在,而不使用MetaData。我想每次只執行INSERT,連接到Web服務的第一個客戶端將導致我會捕獲的SQLException,查看它的ErrorCode以決定它是否由不存在的表引起,如果是這種情況,它將(在catch子句)創建表,插入由於Exception而無法提前插入的數據,然後創建一個線程來處理該特定客戶端(例如,檢查它是否會每隔x秒刷新其在數據庫中的條目)。此實現是否可以完成這項工作?線程是否能夠正常運行,即使它會在Exception的catch子句中啓動?使用SQLException檢查Java程序中是否存在MySQL表格

回答

4

按照您描述的方式執行此操作會將您的應用程序綁定到MySQL,因爲返回的異常將不得不作爲MySQL特定來檢查,以確定它們是否由缺少的表導致,而不是其他問題。大多數開發人員認爲將應用程序綁定到像這樣的特定數據庫是不好的做法。另外,如果你同時得到2個同一個不存在表的請求,你很可能會得到2個線程試圖創建同一個表,並且其中一個會嘗試創建一個已經存在的表,所以你需要做一些同步。

我建議您重新檢查您的應用程序設計,以便提前存在所有表。如果他們絕對必須動態創建,我會創建一個單元對象,它使用MetaData來確定每個表的存在情況,然後將該知識緩存在對象本身中,以便您只需在Web的每個生命週期中搜索每個表的存在應用。您還可以同步此對象上的方法,以防止2個線程一次嘗試創建同一個表。

+0

謝謝你的回答!在我的方式中,它不是嘗試創建表的線程,表將在原始操作的catch子句內部創建,然後線程將以'Connection'對象作爲參數開始。 – nikos 2012-01-10 14:51:22

1

使用異常作爲流量控制的一種手段是一種反模式,您應該避免這樣做。如果您擔心查詢每個連接的元數據的性能影響,則可以緩存結果。