Java 捕获截断错误

Java 捕获截断错误,java,database,Java,Database,我有一个带有嵌入式数据库的小应用程序。有时,在尝试插入超出相应数据库列最大大小的varchar时,会出现截断错误 我希望在插入/更新之前检测到这一点,并向用户显示正确的消息 现在我认为有两种可能实现这一点 通过DatabaseMetaData对象获取感兴趣列的最大长度。您可以通过使用单例或类似结构来减少性能不足 保留Java代码中的最大长度(例如:在ResourceBundle或Properties文件中),并对照这些值进行检查。缺点是Java代码和数据库必须同步。这很容易出错 最好的方法是什么

我有一个带有嵌入式数据库的小应用程序。有时,在尝试插入超出相应数据库列最大大小的varchar时,会出现截断错误

我希望在插入/更新之前检测到这一点,并向用户显示正确的消息

现在我认为有两种可能实现这一点

  • 通过
    DatabaseMetaData
    对象获取感兴趣列的最大长度。您可以通过使用单例或类似结构来减少性能不足

  • 保留Java代码中的最大长度(例如:在
    ResourceBundle
    Properties
    文件中),并对照这些值进行检查。缺点是Java代码和数据库必须同步。这很容易出错


  • 最好的方法是什么?

    这两种方法的组合。在应用程序构建期间,可以使用DatabaseMetaData动态创建资源包。

    唯一不需要维护的答案是在数据库连接时获取感兴趣列的最大长度

    如果使用Integer.valueOf(…),可以将其存储在一个对象中,较低的值(根据当前的JVM规范)会返回到一个单例池。这将卸载大量内存性能问题,因为所有列最终都会引用数据库中可能存在的少数唯一值

    此外,在DatabaseMetaData中挖掘,我将查找任何指示列在大于数据插入时将被截断的标志。它可能会提供一个开关,以了解是否需要您的代码


    通过将值放在属性文件中,可以简化问题的检测,但代价可能是使它们不同步。这些技术是有效的快速实现,前期成本很低,但会产生潜在问题。这个问题是否会被提出还不得而知,但如果有足够的时间,甚至会遇到遥远的可能性。

    一个解决方案是使用CLOB。我不知道你对这个领域还有什么其他要求


    另外,在java代码中使用最小的最大字符值作为常量。这处理它必须是同步的或依赖于数据库的,而且它或多或少是任意的。用户不关心最大大小是多少,他们只需要知道最大大小是多少,或者避免自动出错。

    关于“性能不足”问题:不要过早优化。任何人都不应该更新具有列长度的系统表,数据库应该缓存这些内容(毕竟,数据库使用这些信息进行验证)。如果你真的很担心,那么在你决定编写代码来解决问题之前,先创建一个测试并衡量问题的严重程度。听起来你已经暗示过选项2很容易出错。如果你需要有人告诉你你是对的,那么。。。你说得对!我会避免选择#2,因为它为同一段数据提供了两个权威来源,这永远都不是一个胜利的局面。