Database 使用hibernate作为JTable中大型数据集的备份

Database 使用hibernate作为JTable中大型数据集的备份,database,hibernate,swing,jtable,Database,Hibernate,Swing,Jtable,如果一个应用程序有一个Jtable,数据保存在RAM中,那么这个表最多可以是1000000行乘100列,所以这只会占用太多内存。所以现在我开始从数据库支持JTable,但我认为直接从JTable到数据库不会有多大帮助,因为当JTable初始化时,数据库中的所有数据都将加载到内存中,或者当用户向下滚动选项卡时,我会选择Statements来获取下一个数据,这太慢了,我该如何处理排序 因此,我认为正确的解决方案是将Hibernate保持在JTable和数据库之间,但我仍然不太明白这对一个非常大的JT

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

因此,我认为正确的解决方案是将Hibernate保持在JTable和数据库之间,但我仍然不太明白这对一个非常大的JTable有什么帮助

有谁能给我举一个好的例子/有在大型数据集上使用这个来降低内存使用率的经验吗

编辑:我读过一些关于其他线程的评论,一个有这么多数据的表应该有过滤器,以便只显示数据的一个子集。我同意这是一个一般原则,我将提供一个过滤器,但只有用户可以决定如何过滤它,我仍然需要提供一个“全部”选项,这就是它可能爆炸的地方


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

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

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

您还可以考虑一些面向文档的SQL数据库(如MunGDB或其他数不清的数据库),这些数据库将表现得更好,并且按需提供较少的开销)


在您的案例中,thimb的规则是跟踪表行是否可见,并丢弃未使用的数据

通常情况下,对于以表格格式显示大量记录的函数,为了消耗更少的内存,记录将像

Hibernate的
标准
查询
API提供了以下函数来进行分页:

  • 限制要检索的行数的步骤
  • 设置要检索的第一行编号(即0表示第一行)
在JTable中,您应该具有用于存储每页显示的记录数(
pageNum
)和当前页码(
pageNum
)的变量。每当用户通过向前或向后导航页面来更改
pageNum
时,您都会获取此页面的记录:

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

  • 如果没有“orderby”子句,获取的行的顺序是不可预测的。因此,必须按照“ORDERBY子句”对查询进行排序,以便在向前和向后浏览页面时保持记录的显示顺序,这一点很重要

有关使用Hibernate或JDBC进行JTable分页的示例,请参阅(使用Google translate翻译为英语)及其。该层可以使分页更容易。我从来没有想过在JTable上分页,是的,我认为这可能会工作,而且听起来比表更容易,作为一个更大的表的视图,这个链接对我很有用,谢谢。谢谢,很好的观点。我不认为基于文档的数据库对我有什么好处,因为这样我就必须加载代表一行的整个文档,而不仅仅是可见的数据。mongodb允许加载文档的子集,但无论如何使用nosql数据库必须是合理的,与关系数据库相比,它的理论和知识更少