【发布时间】:2009-07-20 12:52:53
【问题描述】:
假设您正在为一家零售连锁店编写应用程序。因此,您将设计您的对象模型,以便将“Store”定义为核心业务对象和许多支持对象。假设“商店”如下所示:
class Store implements Validatable{
int storeNo;
int storeName;
... etc....
}
因此,您的客户告诉您,您必须将商店时间表从 Excel 表导入应用程序,并且您必须对它们运行一系列验证。例如,'StoreIsInSameCountry';'StoreIsValid'...等。因此,您将设计一个规则接口来检查所有业务条件。像这样的:
interface Rule T extends Validatable> {
public Error check(T value) throws Exception;
}
现在,问题来了。我正在从这个 excel 表中上传 2000 家商店。因此,我最终会多次运行为商店定义的每个规则。如果我有 4 条规则 = 8000 次数据库查询,即 16000 次访问连接池。对于一个简单的检查,我只需要检查商店是否存在,查询将是:
SELECT STORE_ATTRIB1, STORE_ATTRIB2... from STORE where STORE_ID = ?
这样我就可以获得我的“商店”对象。当我没有从数据库中得到任何东西时,那个商店就不存在了。因此,对于这样一个简单的检查,我必须为 2000 家商店访问数据库 2000 次。
或者,我可以这样做:
SELECT STORE_ATTRIB1, STORE_ATTRIB2... from STORE where STORE_ID in (1,2,3..... )
这个查询实际上会比执行上面的查询 2000 次快得多。 但是,规则只能针对单个商店运行的设计并不适合。
我知道使用 IN 不是推荐的方法。所以,你觉得我应该怎么做?我应该继续在这里使用 IN,因为它在这种情况下提供了更好的性能吗?或者我应该改变我的设计?
如果你处于我的位置,你会怎么做?最佳做法是什么?
【问题讨论】:
标签: java database performance jdbc