2011-05-11 111 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代码中使用最小的最大字符值作为常量。这处理它必须是同步或数据库相关,无论如何它或多或少是任意的。用户不关心最大尺寸是多少,他们只需要知道最大尺寸是什么,或者不会自动产生错误。