Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时';在';什么时候不去?_Java_Database_Performance_Jdbc - Fatal编程技术网

Java 何时';在';什么时候不去?

Java 何时';在';什么时候不去?,java,database,performance,jdbc,Java,Database,Performance,Jdbc,假设您正在为零售连锁店编写应用程序。因此,您将设计对象模型,以便将“存储”定义为核心业务对象和许多支持对象。假设“商店”如下所示: class Store implements Validatable{ int storeNo; int storeName; ... etc.... } 因此,您的客户告诉您必须将存储计划从excel表导入到应用程序中,并且必须对其运行一系列验证。例如,“StoreIsInSameCountry”StoreIsValid'。。。因此,您将设计一个用于检查所有业

假设您正在为零售连锁店编写应用程序。因此,您将设计对象模型,以便将“存储”定义为核心业务对象和许多支持对象。假设“商店”如下所示:

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不是一种建议的方法。那么,你认为我应该做什么?我是否应该继续在这里使用,因为它在这个场景中提供了更好的性能?或者我应该改变我的设计


如果你处在我的位置,你会怎么做?最佳做法是什么?

我认为这更像是一个商业问题,客户多久运行一次导入,你需要多长时间来实现这两种解决方案,以及你每小时的时间有多贵

如果它是偶尔运行一次的,我认为性能稍差是可以接受的,特别是如果您可以使用干净的代码快速完成任务

SELECT store_id FROM store WHERE store_active = 1
甚至

SELECT store_id FROM store
将在单个查询中告诉您所有活动存储。现在,您可以对已知存在的商店执行其他测试,并已将自己保存到数据库中

如果您拥有相对无争议的数据库访问权限,并且对整个过程所需的时间没有时间限制,那么您就不必担心一次又一次地访问连接池。毕竟,这就是它的设计目的

这样我就可以从数据库中获取我的“存储”对象。如果我没有从数据库中获取任何信息,那么该存储就不存在。因此,对于这样一个简单的检查,我必须为2000家商店点击数据库2000次

这是你不应该做的

创建一个临时表,用您的值填充该表,然后加入该表,如下所示:

SELECT  STORE_ATTRIB1, STORE_ATTRIB2...
FROM    temptable tt
JOIN    STORE s
ON      s.STORE_ID = t.id
或者这个:

SELECT  STORE_ATTRIB1, STORE_ATTRIB2...
FROM    STORE s
WHERE   s.STORE_ID IN
        (
        SELECT  id
        FROM    temptable tt
        )
我知道使用IN不是一种建议的方法。那么,你认为我应该做什么?我是否应该继续在这里使用,因为它在这个场景中提供了更好的性能?或者我应该改变我的设计

输入
过滤器将重复输出

如果要为列表中的每个重复值选择每个符合条件的行,请使用
JOIN

中的
绝不是“不建议的方法学”

事实上,曾经有一段时间,一些数据库在
查询中不能有效地支持
,这就是为什么民间智慧仍然建议不要使用它

但是,如果您的
存储id
索引正确(如果它看起来是
主键,则很可能是这样),那么所有现代版本的主要数据库(即
Oracle
SQL Server
MySQL
PostgreSQL
)都将使用有效的计划来执行此查询

有关SQL Server的性能详细信息,请参见我博客中的这篇文章:

请注意,在正确设计的数据库中,验证规则也是基于设置的

即。您可以将验证规则实现为对
attreable
的查询

然而,为了支持遗留规则,您可以通过修改行来从可诱惑行中选择值,应用规则,并删除未通过验证的值

…只能为单个存储运行规则

管理业务规则和性能是一项棘手的任务,因此有一个库()可以做到这一点。定义规则,然后执行大量命令,然后库在单个查询中从DB获取规则所需的任何内容(使用临时表而不是“in”),然后将其传递给规则。
中有一个验证器的示例。

对于您所说的操作,如果我将结果集缓存到某个地方,那么这样做是有意义的。我必须一次验证一个存储,即使使用上述方法,并且不缓存结果集,我不知道如何将自己保存到数据库中。运行查询并将结果存储在列表中。这是你的第一次测试;列表的大小是否与预期的门店数量匹配。然后,您可以使用每个整数作为任何JDBC查询的存储id来迭代在存储上运行其他测试的列表。根本不使用缓存。