我正在设计一个多层数据库驱动的Web应用程序 - SQL关系数据库,用于中间服务层的Java,用于UI的Web。语言并不重要。如何处理来自数据库的巨大结果集
中间服务层执行数据库的实际查询。用户界面仅仅需要特定的数据,并没有任何概念支持数据库。
问题是如何处理大型数据集? UI需要数据,但结果可能很大,可能太大而不适合内存。例如,一个路牌应用程序可能有一个服务层:
StreetSign getStreetSign(int identifier)
Collection<StreetSign> getStreetSigns(Street street)
Collection<StreetSign> getStreetSigns(LatLonBox box)
的UI层要求让所有路牌满足某些条件。根据标准,结果集可能很大。 UI层可能会将结果分成单独的页面(对于浏览器)或将它们全部呈现(服务于Goolge Earth)。潜在的巨大结果集可能是性能和资源问题(内存不足)。
一个解决方案是不返回完全加载的对象(StreetSign对象)。而是返回某种结果集或迭代器,它会延迟加载每个单独的对象。
另一种解决方案是改变服务API返回所请求的数据的一个子集:
Collection<StreetSign> getStreetSigns(LatLonBox box, int pageNumber, int resultsPerPage)
当然的UI仍然可以要求一个巨大的结果集:
getStreetSigns(box, 1, 1000000000)
我好奇这种情况下的标准工业设计模式是什么?
`Collection getStreetSigns(Street street)`那是你的问题。尽管应用程序可能不知道它是由数据库支持的,但它应该能够控制它所处理的集合的大小。因此,如果该siz没有固有限制,则应该允许应用程序指定一个:`Collection getStreetSigns(Street street,int maxResults,int firstResult)`。 –
2015-12-20 14:15:03