我有一个带嵌入式数据库的小应用程序。有时在尝试插入超出相应数据库列的最大大小的varchars时会出现截断错误。
我希望在插入/更新之前检测到这一点并向用户显示正确的消息。
现在我认为实现这一目标有两种可能性。
通过DatabaseMetaData
对象获取感兴趣列的最大长度。您可以通过使用Singletons或类似结构来降低性能缺失。
在Java代码中保留最大长度(例如:在ResourceBundle
或Properties
文件中)并检查这些值。下行当然是Java代码和数据库必须同步。这很容易出错。
最好的方法是什么?
答案 0 :(得分:1)
唯一不需要维护的答案是在数据库连接时获取感兴趣列的最大长度。
如果使用Integer.valueOf(...),则可以将其存储在一个对象中,较低的值(根据当前的JVM规范)无论如何都会返回到单个池。这将卸载大量内存性能问题,因为所有列最终都会引用您在数据库中可能具有的少数唯一值。
另外,在DatabaseMetaData中挖掘,我会寻找任何标志,指示在大于数据插入时将截断列。它可以提供切换以了解您的代码是否需要。
通过将值放在属性文件中,可以轻松检测问题,但代价是可能导致它们不同步。这些技术实际上是快速实施,前期成本很低,但它们会产生潜在的问题。问题是否会被提出将是未知的,但如果有足够的时间,甚至会遇到远程可能性。
答案 1 :(得分:0)
两种方法的结合。在应用程序构建期间,您使用DatabaseMetaData动态创建资源包。
答案 2 :(得分:0)
一种解决方案是使用CLOB。我不知道你对这个领域有什么其他要求。
此外,使用您在java代码中作为常量的最小最大字符值。这处理它必须同步或依赖数据库,无论如何它或多或少是任意的。用户不关心最大尺寸是什么,他们只需要知道最大尺寸是什么,或者防止自动产生错误。