2011-05-11 112 views
2

我有一個嵌入式數據庫的小應用程序。有時在嘗試插入超過相應數據庫列最大大小的變量時會發生截斷錯誤。捕捉截斷錯誤

我希望在插入/更新之前檢測到這一點,並向用戶顯示正確的消息。

現在我認爲有兩種可能性來實現這一點。

  1. 通過DatabaseMetaData對象獲取感興趣列的最大長度。你可以通過使用Singletons或類似的構造來降低性能。

  2. 保留Java代碼中的最大長度(例如:在ResourceBundleProperties文件中)並檢查這些值。 Java代碼和數據庫必須保持同步,這是不利的。這是容易出錯的。

什麼是最好的方法?

+0

關於「性能缺乏」的擔憂:*不要過早優化*沒有人應該更新具有列長度的系統表,並且數據庫應該緩存這些東西(畢竟,數據庫使用此信息來驗證)。如果你真的擔心,在你決定編寫代碼解決它之前,創建一個測試並測量問題的嚴重程度。 – 2011-05-11 14:40:46

+0

聽起來像你已經暗示自己,選項#2是容易出錯的。如果你需要某人告訴你你是對的,那麼......你是對的!我會避免選項#2,因爲它爲同一條數據提供了兩個權威來源,這絕不是勝利的情況。 – 2011-05-11 20:15:24

回答

0

兩種方法的組合。在應用程序構建期間,您使用DatabaseMetaData來動態創建資源包。

1

唯一不需要維護的答案是在數據庫連接時獲取感興趣列的最大長度。

如果您使用Integer.valueOf(...),則可以將其存儲在一個對象中,該對象的較低值(根據當前的JVM規範)無論如何都支持到單例池。這將卸載很多內存性能問題,因爲所有列最終都會引用數據庫中可能包含的少數幾個唯一值。

此外,挖掘DatabaseMetaData中,我會尋找任何標誌,指示列將大於數據插入時被截斷。它可能會提供開關以瞭解您的代碼是否需要。

通過將屬性文件中的值放入屬性文件中,您可以輕鬆檢測問題,但代價可能是導致它們不同步。這種技術實際上可以快速實施,而且預付成本很少,但它們造成了潛在的問題。這個問題是否會被提出將是未知的,但是如果有足夠的時間,甚至會遇到遠程可能性。

0

一個解決方案是使用CLOB。我不知道你對這個領域有什麼其他的要求。

另外,在java代碼中使用最小的最大字符值作爲常量。這處理它必須是同步或數據庫相關,無論如何它或多或少是任意的。用戶不關心最大尺寸是多少,他們只需要知道最大尺寸是什麼,或者不會自動產生錯誤。