使用hibernate作为JTable中大型数据集的支持

时间:2011-11-15 21:53:28

标签: database hibernate swing jtable

有一个具有Jtable的应用程序,数据保存在RAM中,该表最多可以是1,000,000行乘100列,因此这只占用了太多内存。所以现在我正在从数据库支持JTable,但我认为直接从JTable到数据库并没有多大帮助,因为当jtable初始化时,数据库中的所有数据都将被加载到内存中,或者用户向下滚动表格我会选择staements来获取下一个数据,这将太慢,我将如何处理排序。

所以我认为正确的解决方案是在JTable和数据库之间使用Hibernate,但我仍然无法确定这对于一个非常大的JTable有什么帮助。

任何人都可以向我指出一个很好的例子/有使用大数据集的经验来减少内存使用量。

编辑:我已经读过其他线程上的一些注释,这些包含这么多数据的表应该有过滤器,以便只显示一部分数据。我同意这一点作为一般原则,我将提供一个过滤器但是只有用户可以决定他们想要如何过滤它,我仍然需要提供一个'ALL'选项,这就是它可能爆炸的地方。 / p>

我还记得有一些关于将一个表放在另一个表之上的信息,显示某些数据子集在向下滚动时会发生变化,但没有看到这个想法的具体示例。

2 个答案:

答案 0 :(得分:0)

Hibernate将为您购买以下产品:     - 查询agains数据库返回脱水代理列表(比如,它们只包含主键,这会消耗更少的内存)     - 透明的按需加载具有单独查询的条目。

但是,当hibernate会话打开时间太长时会变慢(它会使用阻塞的inetrnal缓存)

您可能还会考虑一些面向文档的No-SQL数据库(如mongodb或无数其他数据库),它们的行为会更好,并且可以按需提供更少的开销。

在你的情况下,thimb规则是跟踪表行是否可见,并丢弃未使用的数据。

答案 1 :(得分:0)

通常,对于以表格格式显示大量记录的函数,为了消耗更少的内存,记录将逐页显示,就像Stackoverflow reputation league

一样

Hibernate的CriteriaQuery API提供以下功能来执行分页:

在JTable中,您应该拥有用于存储每页显示的记录数(pageNum)和当前页码(pageNum)的变量。每当用户通过向前或向后导航页面来更改pageNum时,您都会获取此页面的记录:

Query q = entityManager.createQuery("from someTable tbl order by tbl.id asc");
q.setFirstResult((pageNum -1)*pagesize).setMaxResults(pagesize); 

重点:

  • 没有"顺序由"子句,获取的行的顺序是不可预测的。因此,重要的是查询必须按" order by子句排序"这样当向前和向后浏览页面时,可以保持记录的显示顺序。

您可以参考this(使用Google翻译以翻译为英语)及其Github,以获取有关使用Hibernate或JDBC进行JTable分页的示例。