使用 FTPClient 和 Hibernate 的递归方法,速度优化

Recursive method with FTPClient and Hibernate, Speed Optimization

我是使用 FTPClient (org.apache.commons.net.ftp) 和 Hibernate 4 的新手,我有优化应用程序速度的基本问题。

我想要实现的是:

(1) 连接到 FTP 服务器并浏览所有目录并查找所有文件。为了浏览每个文件夹,我使用递归方法检查文件 (FTPFile) 是文件还是目录。

(2) 每次找到一个文件(不是文件夹),它都会创建一个实体,并通过使用 Hibernate 将它插入到数据库中。

问题是检查所有文件并插入数据库需要很长时间。大约有 7000 个文件(每个文件位于唯一目录下),平均需要大约 1 小时,我认为这很慢。另外,只是检查FTP服务器是否有更新,平均需要58分钟左右...

下面是完成上述两个任务的递归方法:

public void recursiveMethod(String directory){
    Transaction tx = null;
    FTPFile[] files = null;

    try {

        ftpObj.changeWorkingDirectory(directory);

        files = ftpObj.listFiles();
        assertNotNull(files);

        for(FTPFile file: files){
            String tempFileName = file.getName();

            if(file.isFile() && !file.isDirectory() && !tempFileName.matches(Constants.regexNotMatchFile) && tempFileName.matches(Constants.regexMatchFile)){
                 System.out.println("called: " + tempFileName);

                 //check if the entity exists in DB based on the ID, where ID is the filename
                 if(session.get(Package.class, tempFileName) != null){
                     //if exists, continue looping
                     continue;
                 }

                 try{
                    tx = session.beginTransaction();
                    assertNotNull(tx);

                    //POJO
                    Package p = new Package();
                    p.setName(tempFileName);
                    p.setDate(file.getTimestamp().getTime());
                    p.setDirectory(directory.replace(baseDir, ""));
                    p.setSize((long)(file.getSize());

                    session.save(p);
                    tx.commit();

                }catch(Exception e){
                    if(tx != null){
                        //rollback db to previous state
                        tx.rollback();
                    }
                    System.err.println("transaction creation error: "+ e);
                }

                System.out.println("File Name: " + tempFileName + " Timestamp: "+file.getTimestamp().getTime());

             }else{

                if(file.isDirectory() && !tempFileName.matches(Constants.regexNotMatchFile) && !tempFileName.matches(currentKeyValue)){
                    String newDir = directory + "/" +tempFileName;

                    try {
                        ftpObj.changeWorkingDirectory(newDir);
                        System.out.println("called into dir: " + newDir);
                        dbTransaction(newDir);

                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();

                    }

                }

             }
        }

    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }       

}

提高速度和效率的最佳方法是什么? 我应该先将找到的文件存储到一个数组中,然后在最后将它们一起提交吗?

数据库插入不太可能那么慢(可能是,但似乎不太可能),更可能的是 FTP 连接是高延迟连接。加快速度的最佳方法是创建 consumer/producer pattern,并指定多个消费者同时进行 ftp 连接。