我是使用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();
}
}
提高速度和效率的最佳方法是什么? 我应该先将找到的文件存储到一个数组中,然后在最后完全提交它们吗?
答案 0 :(得分:1)
数据库插入的速度很慢(可能是,但似乎不太可能),FTP连接更可能是高延迟连接。加快这一速度的最佳方法是创建consumer/producer pattern,并指定一些消费者同时拥有ftp连接。