1

这是一个非常简单的问题,适用于使用 java 编程 Web 界面。说,我没有使用 ORM(即使我正在使用),假设我的应用程序中有这个 Car (id,name, color, type, blah, blah) 实体,我有一个 CAR 表在数据库中表示该实体。所以,假设我只需要更新一堆汽车上的一部分字段,我知道典型的流程是:

  1. DAO 类 (CarDAO) - getCarsForUpdate()
  2. 遍历所有 Car 对象,仅更新颜色以显示绿色或其他内容。
  3. 另一个对 updateCars(Cars cars) 的 DAO 调用。

现在,对于一个简单的选择和更新查询来说,这不是在拐弯抹角吗?在上面的第一步中,我将从数据库中检索整个对象数据:“ select id,name,color,type,blah,blah.. where ..from CAR ”而不是“ select id,color from CAR where 。 …… ”。那么为什么我在发布 DAO 调用时要检索那些额外的字段,我永远不会使用“颜色”以外的任何东西?这同样适用于最后一步 3。或者,假设我只查询 id 和颜色(选择 id、color)并创建一个仅填充 id 和颜色的汽车对象 - 这完全可以,不是吗?Car 对象还是贫血?

这一切(面向对象)看起来是不是有点假?

4

3 回答 3

4

一方面,如果 RDBMS 可以处理您的查询,我希望它可以处理。原因是您不希望 JVM 完成所有工作,尤其是在运行企业应用程序时(并且您有许多需要相同资源的并发连接)。

如果您特别想更新数据库中的对象(例如将汽车颜色设置为绿色),我建议使用类似 SQL

UPDATE CAR SET COLOR = 'GREEN';

(注意我没有使用WHERE子句)。这会更新所有 CAR表,我不需要提取所有Car对象、调用setColor("Green")并进行更新。

事后看来,我想说的是应用工程知识。您的 DAO 应该简单地进行快速选择、更新等,并让所有 SQL“工作”由 RDBMS 处理。

于 2012-06-04T09:28:28.200 回答
2

根据我的经验,我可以说的是:只要您不进行连接操作,即仅从同一个表中查询列,您获取的列数几乎不会对性能产生任何影响。真正影响性能的是获得的行数和 where 子句。获取 2 或 20 列的变化非常小,您不会看到任何差异。更新也是一样

于 2012-06-04T09:30:26.017 回答
1

我认为在某些情况下,请求对象字段的子集很有用如果您有大量的列,或者如果有一些大的BLOB列在水合时会影响性能,这可能会带来性能上的提升。尽管数据库通常会在匹配时读取整行信息,但通常会将BLOB其他大型字段存储在不同的位置,并具有非平凡的 IO 需求。

如果您正在遍历一个大表并进行某种处理,这也可能是有意义的。尽管在单行上节省的成本可能微不足道,但在一张大表中可能是可以衡量的。

此外,如果您只使用索引中的字段,我相信该行本身永远不会被读取,它将使用索引本身的字段。但是,不确定在您的示例中是否color会被索引。

综上所述,如果您只是在没有其他大型数据库字段的情况下仅保留相对简单的对象,BLOB那么这可能会变成过早的优化,因为查询处理、行 IO、JDBC 开销和对象创建很可能会花费更多时间与水合行中字段的子集相比。将数据库对象转换为最终的 Java 类通常只是每个查询负载的一小部分。

于 2012-06-05T20:49:47.053 回答