我查到的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);

解决方案 »

  1.   

    那请问应该如何修改呢?在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楼!
      

  2.   

    显示缓慢的原因,并不是数据多,处理不过来,而是,从数据库传输过来,需要太多的时间。
    我看楼主貌似使用DefaultTableModel对象,只为了显示查询的内容,而没有更改删除之类的功能。
    这样的话,可以自己实现那个AbstractTalbeModel,当数据库支持ResultSet滑动读取数据时,这个Model对象,会提供更好的性能与用户体验。
    同时,如果数据库不支持ResultSet的滑动读取,可以通过缓存行集的形式,达到上述的效果。
    楼主不妨试一下。
    如果不会,核心Java第二卷,应该有相关的思路和代码。
      

  3.   

    分页 + SwingWorker。
    分页是必须的,否则你的程序查询的时候很慢。
    SwingWorker也是必须的,否则你的程序在大量数据查询的时候会很卡。SwingWorker可以在你查询的过程中将结果直接一条一条动态地在Jtable中显示出来。
      

  4.   

    先谢谢各位!TO3、4楼:你俩的建议我会抽时间去查看。
    4楼所讲的,在JDK的附带的实例中的那个SwingSet2是类似SwingWorker吧?
    在网上搜索了一下,这个SwingWorker是JDK1.6新功能。有没有详细一点的资料可提供呢!我现在显示时间缩短了,同时也使用了分页。不过不同的事,我的使用存储过程,不能每显示一页就重新执行一次,因此只能先把执行后的ResultSet记录集全部保存到Vector中,再进行分页。
    由于数据量太多,涉及到的表也不是一个,所以执行存储过程需要2分钟左右时间(在查询分析器里执行存储过程完成后所得),在加上把记录集赋给Vector,在给JTable,这样时间也是挺长的。如果系统资源不太好,那执行的速度就更加慢了。唉!对于在大数据量里搜索得到想要的报表,那真是一件好麻烦的事情啊~~~头痛啊!继续努力学习~~~~
      

  5.   

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

  6.   

    楼主,我写了一个ResultSetTableModel类,你把DefaultTableModel替换成我给你的类试试。
    应该能够达要求。
    文章在http://blog.csdn.net/preferme/archive/2009/07/26/4381632.aspx