我需要读取两个文件进行比对,并把比对的结果输入到jsp页面,但文件太大,jboss总是超时,希望那位高手能给个多线程的例子,帮忙解决一下,很急!!!!!

解决方案 »

  1.   

    设置下jvm的内存大小看行吗!
      

  2.   

    我可能没有说清楚。我需要解决的问题是:我要进行数据的比对。我要先读取数据库内的数据,然后写入两个文件,然后读取这两个文件进行比对,最后把比对的结果返回给页面显示出来。但文件记录太多,比对后的结果无法返回给页面,jboss总是超时。希望哪位高手帮忙解决一下!
      

  3.   

    1) 用两个读数据库线程读数据,一个线程比较数据
    2) 读的数据不要放到文件中,而是直接喂给比较线程。如果比较线程发现数据不同,数据库读线程终止读数据,比较线程将结果返回给用户。
    如果数据量太大,就算用线程也解决不了你的问题。你需要重新设计你的程序。public class DataReadThread extends Thread {
    private volatile stop_ = false;
    private String fileName_;
    private LinkedBlockingQueue< byte[] > blocks_ = new LinkedBlockingQueue< byte[] >();
    private ...;

    public DataReadThread( ... ) { //your arguments
    }

    public void stop() {
    stop_ = stop;
    }

    public LinkedBlockingQueue< byte[] > getBlocks() {
    return blocks_;
    }

    public void run() {
    try {

    connectToDatabase();

    while( !stop_ ) {
    byte[] buf = readDataFromDatabase();
    if( buf == null ) {
    blocks_.put( new byte[0] );
    break;
    }
    blocks_.put( buf );
    }
    closeConnection();
    }catch( Exception ex ) {
    }
    }

    private void connectToDatabase() {
    //connect to the database
    }

    private byte[] readDataFromDatabase() {
    //read data from the database
    }
    private void closeConnection() {
    //close the connection
    }
    }public class CompareThread extends Thread {

    private DataReadThread dataReadThread1_;
    private DataReadThread dataReadThread2_;

    public CompareThread( DataReadThread dataReadThread1, DataReadThread dataReadThread2 ) {
    blockSize_ = blockSize;
    dataReadThread1_ = dataReadThread1;
    dataReadThread2_ = dataReadThread2;
    }

    public void run() {
    try {
    LinkedBlockingQueue< byte[] > blocks1 = dataReadThread1_.getBlocks();
    LinkedBlockingQueue< byte[] > blocks2 = dataReadThread2_.getBlocks();
    boolean equal = true;

    while( equal ) {
    byte[] block_1 = blocks1.take();
    byte[] block_2 = blocks2.take();

    if( !Arrays.equals( block_1, block_2 ) ) {
    equal = false;
    break;
    }
    if( block_1.length == 0 ) {
    break;
    }
    }
    dataReadThread1_.stop();
    dataReadThread2_.stop();
    }catch( Exception ex ) {
    }
    }
    }public class Main {
    public static void main(String[] args ) {
    DataReadThread dataReadThread1 = new DataReadThread(...);
    DataReadThread dataReadThread2 = new DataReadThread(...);

    CompareThread compThread = new CompareThread( dataReadThread1, dataReadThread2 );

    fileReadThread1.start();
    fileReadThread2.start();
    compThread.start();
    }
    }
      

  4.   

    联想到分页技术。
    你可以在SQL中进行ORDER BY,然后用rownum之类的关键字,一次只读1000条或者更少的记录。
    每比较完一次记录以后,将结果flush到浏览器。然后进行下一轮比较。