我有一个从文件中读取值的方法(读取方法)并从数据访问对象(DAO)类中调用另一个方法,该类将这些值存储到数据库中(存储方法)。我的问题是:我是否应该将读取方法中读取的所有值作为列表传递给存储方法(这会保存数百个方法调用,但是需要在存储中的列表上的读取方法迭代中创建列表?方法),或者我应该对每个值的存储方法进行单独调用(这意味着数百个方法调用,但不需要列表创建和迭代)。从性能和良好实践的角度来看,哪种方法更有效?
6 回答
数据库资源有限,应尽量减少数据库命中以获得更好的性能。
如果您比较数据库命中和对列表进行操作的成本,则可以忽略不计。
因此,创建一个 List 并尝试进行批处理操作,而不是对每条记录进行一次操作。
较少的数据库交互始终是一种很好的做法,也是高性能的选择。
要回答关于良好实践的问题,您必须考虑在您的应用程序中使用 DAO 方法。如果您看到它被多次调用,来自单个原点的多个值,那么我认为您应该将 List 传递给该方法。但是,如果您有更多情况下只有一个值调用该方法,那么您应该以该粒度定义它。
其他人关于数据库访问的说法仍然有效。如果您的情况可能,请尝试批量访问多个数据库。
您应该一次阅读所有这些,List
并使用 JDBC Batch Update 之类的东西一次或分批存储它们。
但是,一个一个地完成它们绝对是一个禁忌。它会做太多的网络/IO操作。
唯一可以确定的方法是对各种选项进行计时。但是,由于您在此过程中要访问数据库,因此这很可能占主导地位。减少数据库访问的变体可能是最快的。如果两种变体对数据库的影响相同,那么我希望它们花费相似的时间。调用方法和创建对象比与数据库通信要快几个数量级。
您有多个值,因此必须有人迭代这些值。唯一的问题是:谁?
一般而言:一旦您谈论数据库访问(读取和写入)分配列表的开销,迭代它并执行一些方法调用对于一个数据库调用的开销来说是可以忽略不计的(我们谈论的是数百次调用,而不是数十亿次, 正确的?)。在大多数情况下,数据库调用类似于远程过程调用,写入数据库将写入磁盘 - 另一个很棒的性能吸盘。
因此,在大多数情况下,如果您最大限度地减少对数据库的调用,您将获得性能。如果您的数据库访问层知道完整的工作,这可以更容易地完成。所以如果你给 DAO 一个列表,它可以做一些事情,比如准备好的语句、批量更新等等。只考虑零碎的东西,就不可能有好的表现。
访问硬盘是这里最大的开销。如果可以,请从硬盘读取一次。如果没有,请读入缓冲区并在完成后重新填充它。这个操作适合Threading,试试看。