【问题标题】:DAO pattern - where should I put static variables?DAO 模式——我应该把静态变量放在哪里?
【发布时间】:2017-10-05 20:15:39
【问题描述】:

我有一个使用 JSP 模型 2 架构的网络应用程序。

我也使用 DAO 模式;特别是,不同的方法需要像 productID 这样的值,我希望它是唯一的。

/**
 * Updates the productID that is unique per JVM run.
 * @return the updated value of <i>productID</i>
 * @throws ClassNotFoundException if an error occurs with the connection to the database
 */
public static synchronized int createProductID() throws ClassNotFoundException{
    int maxID = QueriesDAO.maxIDInDatabase("product");
    while(productID <= maxID) {
        productID++;
    }
    return productID++;
}

该方法查询数据库并返回一个新 ID,该 ID 存储在 private static int productID = 0; 中(0 是分配的第一个值)。

我想问的是:我应该把那个查询和那个变量放在哪里?

目前,我有一个名为 DAO 的包,其中包含所有查询,例如查询 UserDAO.java 上的用户或查询 ProductDAO.java 上的产品等等。 createProductID() 方法和链接的变量存储在 Main 类中,但在我看来这不是正确的位置。我怎样才能改变我的模式?

使用接口可以解决问题吗?但是有了这个接口,我就不能拥有可以托管productID 变量的私有字段..

【问题讨论】:

  • 答案是“不要那样做”。例如,如果您在多台服务器上运行副本怎么办?相反,请使用数据库序列或让您的持久性提供程序为您执行此操作。

标签: java design-patterns dao


【解决方案1】:

为什么需要查询最大id?

您是数据库或持久性提供者应该能够提供一个自动递增的顺序值,该值将在将产品插入数据库时​​自动分配给您的产品,这意味着您在插入之前无需知道 id 是什么。

MySQL auto increment

如果有充分的理由在插入之前需要 id:

考虑使用 GUID。这些不是顺序生成的 ID(在大多数情况下),因此无需担心首先从数据库中查询您的最大 ID。

关于您应该将其存储在哪里 - 您不需要。 Java 的UUID 类是util 包的一部分,可以在任何地方静态调用,并且是线程安全的。

查看文档here [JavaDoc]

还有一篇关于使用 UUID 的好文章可以在 here [Coding Horrors] 找到

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 2020-09-30
    • 2016-08-25
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2017-11-30
    相关资源
    最近更新 更多