我目前正在使用原始 JDBC 查询 MySql 数据库中的记录;随后的 Resultset 中的每条记录最终都被提取出来,放置在特定领域的模型中,并存储到一个列表实例中。
我的问题是:在需要进一步过滤数据的情况下(顺便说一下,基于 SAME 表中存在的列)通常认为以下哪种方法是最佳实践:
1.发出进一步的WHERE子句调用数据库。这将有效地将过滤过程卸载到数据库,但显然会导致一个或多个连续应用多个过滤器的查询。
2.在应用层显式过滤前面提到的预处理列表,从而无需在每次过滤记录时都必须对数据库进行额外调用。
3. 上述两种方法的一些混合组合,可能所有过滤操作最初都由数据库服务器执行,但随后预处理为特定于应用程序的模型,并在有限时间内隐式缓存到集合中。在此间隔内接收到的更多过滤器查询随后将从存储在缓存中的数据中得到服务。
需要注意的是,这个场景中的数据库服务器实际上位于 一台外部机器,因此在我们最终选择采用的方法中也必须考虑通过本地网络发送查询流量的开销和延迟。
我清楚地知道古老的口头禅规定:“数据库服务器应该被用来做它擅长的事情。”然而,在这种情况下,对数据库进行多次调用以过滤我已经在应用程序级别拥有的数据似乎是一个不够充分的解决方案。
非常感谢您的想法和见解。
最佳答案
我已经在许多应用程序中使用了混合方法,并取得了不错的效果。
数据库过滤尤其适用于索引的列。这减少了网络开销,因为发送到应用程序的行更少。
根据结果中行的数量和索引的缺乏,数据库过滤对于某些列可能非常慢。与数据库查询时间相比,网络开销可以忽略不计,因此在这种情况下,应用程序过滤可能会更快。
我还发现 Java 中的应用程序过滤比复杂的 SQL 更容易编写和理解。
我通常通过纯 SQL 手动试验以在合理的时间内获得最少的行。然后编写 Java 以细化到所需的行。
关于java - 数据库数据过滤最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24165920/