【问题标题】:Java set difference, may I use java object or database?Java set 的区别,我可以使用 java 对象还是数据库?
【发布时间】:2013-12-15 08:28:05
【问题描述】:

我需要获取两组整数(记录 ID)之间的差异。第一组存储在文本文件中,第二组存储在 mysql 数据库中。 我有两个选择:

1- 从数据库中读取所有 id,将它们加载到 java 对象,从文本文件中加载所有 id 并使用

Sets.difference(dbset, fileset);

2- 仅读取文本文件 id 并使用 Hql 查询来获取差异:

public List getDiff(Set<Integer> ids){
    Query query;
    query = getSession().createQuery("from myset s where s.id not in (:ids)");
    query.setParameterList("ids", ids);
    return query.list(); 
}

我发布这个问题是因为这些集合可能很大,而且我不知道 Hibernate / Mysql 查询是否有任何限制(Hibernate 将该查询翻译为“不在 (1,2,3,... )) 否则,我可以轻松达到 jvm 内存限制。

【问题讨论】:

  • 你为什么不试试呢?您可以轻松地创建一个至少与您在循环中以编程方式期望的最大集合一样大的集合,并针对数据库测试查询。然后只需观察内存使用情况、运行时间、由于超出限制而引发的异常,...
  • 很难尝试假设该应用程序的所有用户的内存设置。我更喜欢尽力而为的方法。
  • @Toba 但是无论是隐含还是明确,您都必须为应用程序运行的环境指定最小值。或者您的意思是您要编写自适应代码,在内存很少的环境中划分问题?这意味着您将需要更多测试,以便设置在不同方法之间切换的参数。
  • 是的,但我希望 mysql 或 hibernate 能比我做更好的内存管理。但是,我肯定会在最低要求的环境下进行一些测试。

标签: java mysql hibernate set set-difference


【解决方案1】:

选项 #2 将无法正常工作,因为它只会让您不存在于文件 ID 中。如果有一些 ID 不在 DB 中但在文件中,则不会有区别。 只有选项#1 可以正常工作,而且对我来说看起来不错。唯一的问题- 记忆。但是创建一些可以完成这项工作并节省内存的算法并不容易。如果您的 ID 编号高达 100000,我不会担心内存问题。

【讨论】:

  • 您说得对,2° 选项没有区别……就我而言,这已经足够了,但我同意这不是区别。我将编辑我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2014-06-25
  • 2017-03-09
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多