【问题标题】:With a created by timestamp, is it better to have the DB manage it, or the application?使用由时间戳创建的,是让数据库管理它还是应用程序更好?
【发布时间】:2011-01-09 00:12:57
【问题描述】:

我们正在开发您的沼泽标准 Java 应用程序,并且我们正在创建的许多记录(MySQL 中的 Hibernate 实体)上都有“创建”和“修改”时间戳。

现在,我和其中一位开发人员不同意 - 我认为这两个字段都应该具有 MySQL 默认值 CURRENT_TIMESTAMP,然后可以通过应用程序更改修改的内容。他希望两者都由应用程序管理。

这两个决定是否有令人信服的理由?我不明白您为什么要在代码中添加更明确的步骤,除非出于某种原因您担心您的服务器(数据库、应用程序)的时间戳不一致。

【问题讨论】:

    标签: java mysql hibernate orm


    【解决方案1】:
    • 如果可以牺牲可移植性,请使用 DB 时间戳。此外,如果非常小差异对应用程序很重要,并且您将拥有多个应用程序服务器/一个集群,则同步节点可能会出现问题。
    • 使用应用程序生成时间戳,以防不确定所选数据库是否会保留,或者如果您使用多个数据库 - 例如用于生产的 MySQL、用于单元测试的 HSQLDB。

    如果这些论点都不适用,请使用对您来说更容易的一个(或更多开发人员投票支持的那个)

    如果您进行应用程序处理,请使用 @PreUpdate 接受 Pascal Thivent 的建议,或者将您的字段设置为默认值,例如:

    private Calendar date = Calendar.getInstance();
    

    【讨论】:

    • 我仍然没有得到集群的东西。不管有没有二级缓存,为什么你会在不同的节点上看到不同的东西。如果您有特定的内容,请澄清,因为这对我来说似乎并不正确:集群您的应用程序不会强制您以任何方式使用 db 时间戳。
    • 好吧,您可以在任何地方将其设置为完全相同,但这是开销 + DST 和时区选项 + 需要在每个新节点上再次设置它。老实说,我只对这种情况有过非常具体的经验,不适用于常见情况,而且我们使用的是时间戳服务器。
    • 哦,你的意思是节点之间可能存在时钟同步问题,现在我明白了。请注意,这对我来说从来都不是问题(您可以使用 NTP 同步服务器,而且我从未在纳秒差异如此重要的环境中工作过)。但是,如果纳秒很关键,那么实际上,在数据库级别执行它可能会更好。感谢您的澄清。
    【解决方案2】:

    我会从代码中处理这个问题并使用 Hibernate/JPA 的 @PrePersist@PreUpdate 回调:

    @PreUpdate
    @PrePersist
    public void setTimeStamps() {
        modified = new Date();
        if (created==null) {
          created = new Date();
        }
    }
    

    主要原因:可移植性(即这将与另一个数据库一起使用,例如在测试环境中,没有任何数据库魔法,没有DEFAULT,没有触发器,什么都没有)。

    【讨论】:

      【解决方案3】:

      将所有时间戳分配在同一层中以保持一致性是有意义的。

      answer 的相关问题提供了一个很好的示例,说明如何在 Hibernate 中进行操作。

      【讨论】:

        【解决方案4】:

        我会使用触发器和存储过程来维护这些字段。所以把逻辑放在数据库里。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-19
          • 2011-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-25
          • 2011-11-09
          • 2011-08-26
          相关资源
          最近更新 更多