使用 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 连接。
我是使用 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 连接。