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

时间:2015-05-09 00:55:43

标签: java hibernate ftp-client

我是使用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();
    }       

}

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

1 个答案:

答案 0 :(得分:1)

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