jtable显示ResultSet记录集速度问题

know_no 2009-07-21 04:41:41
我查到的ResultSet一个在多于千条记录,如果记录少时,那显示延迟不是很明显,但如果记录集的记录数在多些,那就很显示。如何才能以最快速度显示完所有记录呢?
以下为我的原代码:
CallableStatement proc = null;
ResultSet rs = null;
try {
proc = mf.args.dcc.prepareCall("调用存储过程");
\\设置参数,就不写出来
rs = proc.executeQuery();
String[] st = new String[] {"",""};\\标题数组
String str = "";
while(rs.next()) {
for(int t=0;t<st.length;t++) {
str = str + rs.getString(t+1).trim() + "\r";
}
str = str + "\n";
}
String[] arr = str.split("\n");
String[][] data = new String[arr.length][st.length];
for(int t=0;t<data.length;t++) {
data[t] = arr[t].split("\r");
}
strOutArry = data;
DefaultTableModel dtm = new DefaultTableModel(data,st) {
public boolean isCellEditable(int row, int column) {
return false;
}
};
jtbResult = new JTable(dtm);
jsp.getViewport().add(jtbResult);
...全文
236 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
know_no 2009-08-01
  • 打赏
  • 举报
回复
谢谢11楼!

这几天比较忙,先收了,稍晚再去试试.
冰思雨 2009-07-26
  • 打赏
  • 举报
回复
楼主,我写了一个ResultSetTableModel类,你把DefaultTableModel替换成我给你的类试试。
应该能够达要求。
文章在http://blog.csdn.net/preferme/archive/2009/07/26/4381632.aspx
diggywang 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 know_no 的回复:]
先谢谢各位!

TO3、4楼:你俩的建议我会抽时间去查看。
4楼所讲的,在JDK的附带的实例中的那个SwingSet2是类似SwingWorker吧?
在网上搜索了一下,这个SwingWorker是JDK1.6新功能。有没有详细一点的资料可提供呢!

我现在显示时间缩短了,同时也使用了分页。不过不同的事,我的使用存储过程,不能每显示一页就重新执行一次,因此只能先把执行后的ResultSet记录集全部保存到Vector中,再进行分页。
由于数据量太多,涉及到的表也不是一个,所以执行存储过程需要2分钟左右时间(在查询分析器里执行存储过程完成后所得),在加上把记录集赋给Vector,在给JTable,这样时间也是挺长的。如果系统资源不太好,那执行的速度就更加慢了。

唉!对于在大数据量里搜索得到想要的报表,那真是一件好麻烦的事情啊~~~头痛啊!

继续努力学习~~~~
[/Quote]

那就改存储过程!!执行两分钟的存储过程,得到的数据是几千条,那肯定绝对必定的有问题!
know_no 2009-07-24
  • 打赏
  • 举报
回复
先谢谢各位!

TO3、4楼:你俩的建议我会抽时间去查看。
4楼所讲的,在JDK的附带的实例中的那个SwingSet2是类似SwingWorker吧?
在网上搜索了一下,这个SwingWorker是JDK1.6新功能。有没有详细一点的资料可提供呢!

我现在显示时间缩短了,同时也使用了分页。不过不同的事,我的使用存储过程,不能每显示一页就重新执行一次,因此只能先把执行后的ResultSet记录集全部保存到Vector中,再进行分页。
由于数据量太多,涉及到的表也不是一个,所以执行存储过程需要2分钟左右时间(在查询分析器里执行存储过程完成后所得),在加上把记录集赋给Vector,在给JTable,这样时间也是挺长的。如果系统资源不太好,那执行的速度就更加慢了。

唉!对于在大数据量里搜索得到想要的报表,那真是一件好麻烦的事情啊~~~头痛啊!

继续努力学习~~~~
know_no 2009-07-24
  • 打赏
  • 举报
回复
TO8楼:谢谢你的提醒。我会再去校对数据的。在我的存储过程里,我先得到我的数据表,之后再判断得到的数据表是否正确(即回算这些数据的初始值是否为0),之后再把不为0的数据重新搜索相关信息(这里就不提了,因为涉及到数据库里的好多表。这个是一个ERP数据库)。
思路上我是清析的,稍晚把程序做完了,再去重新检测存储过程。

再次谢谢diggywang。
liuxing045 2009-07-24
  • 打赏
  • 举报
回复
学习
xiaozejun 2009-07-23
  • 打赏
  • 举报
回复
用分页显示 每次只查询一定的数据量 你就算全部查出来 客户也不可能一下子看几千条数据吧
老张-AI 2009-07-23
  • 打赏
  • 举报
回复
学习
diggywang 2009-07-23
  • 打赏
  • 举报
回复
分页 + SwingWorker。
分页是必须的,否则你的程序查询的时候很慢。
SwingWorker也是必须的,否则你的程序在大量数据查询的时候会很卡。SwingWorker可以在你查询的过程中将结果直接一条一条动态地在Jtable中显示出来。
冰思雨 2009-07-23
  • 打赏
  • 举报
回复
显示缓慢的原因,并不是数据多,处理不过来,而是,从数据库传输过来,需要太多的时间。
我看楼主貌似使用DefaultTableModel对象,只为了显示查询的内容,而没有更改删除之类的功能。
这样的话,可以自己实现那个AbstractTalbeModel,当数据库支持ResultSet滑动读取数据时,这个Model对象,会提供更好的性能与用户体验。
同时,如果数据库不支持ResultSet的滑动读取,可以通过缓存行集的形式,达到上述的效果。
楼主不妨试一下。
如果不会,核心Java第二卷,应该有相关的思路和代码。
know_no 2009-07-21
  • 打赏
  • 举报
回复
那请问应该如何修改呢?在CSDN里搜索到以下两篇文章
http://blog.csdn.net/feiyang21687/archive/2007/09/05/1773068.aspx
http://blog.csdn.net/featheast/archive/2008/11/05/3229141.aspx
内容基本上是一样的。
但问题在于,这个分页显示是使用SQL语句执行,但我使用的是存储过程。

谢谢2楼!
老紫竹 2009-07-21
  • 打赏
  • 举报
回复
数据量太大,并且要全部显示,这本身就是个错误的需求,你应该使用分页

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧