我在应用服务api-app上运行Azure上的Spring Boot REST应用程序。 我需要在azure" D:\ home \ site \ wwwroot \ database>"上读取此路径中的访问数据库文件。
当我从该位置读取文件时,我需要删除它们。
这是我从azure读取和删除文件的代码,但是当我转到 KUDU 调试控制台时,文件未被删除。
public List<AccessFeedDTO> download(Long fileId) throws URISyntaxException, StorageException, IOException, SQLException{
if(fileId!=null){
File file = null;
try {
ImportFileFeedDTO importFileFeedDTO= importFileFeedService.getFeedFile(fileId);
storageAccount = CloudStorageAccount.parse(storageConnectionString);
CloudFileClient fileClient = storageAccount.createCloudFileClient();
CloudFileShare share = fileClient.getShareReference("spartanv3files");
CloudFileDirectory rootDir = share.getRootDirectoryReference();
CloudFile cloudFile = rootDir.getFileReference(importFileFeedDTO.getFile_uuid());
System.out.println(cloudFile.getName());
System.out.println(cloudFile.downloadText());
file = new File ("D:/home/database/"+importFileFeedDTO.getFile_uuid());
FileOutputStream fileOutputStream = new FileOutputStream(file);
cloudFile.download(fileOutputStream);
fileOutputStream.close();
System.gc();
List<AccessFeedDTO> accessFeedsDTOlist= accessFeedMapper.accessFeedEntitytolistofAccessFeedDTO(accessFeedRepository.getAllAccessFeeds(importFileFeedDTO.getFile_uuid()));
file.delete();
return accessFeedsDTOlist;
} catch (InvalidKeyException invalidKey) {
throw new RuntimeException(invalidKey.getMessage());
}finally{
file.delete();
}
}else{
throw new RuntimeException();
}
}
这就是我在azure上建立与该文件(访问数据库)的连接的方式。我使用UCanAccess连接到临时Access文件来读取数据。
public Connection getAccessFeedConnection(String fileName){
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
connection = DriverManager.getConnection("jdbc:ucanaccess://D:/home/database/"+fileName+";immediatelyReleaseResources=true");
return connection;
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
return connection;
}
}
以下是我如何使用连接来访问来自访问数据库的参数
public List<AccessFeedEntity> getAllAccessFeeds(String dataBaseName) throws SQLException{
Connection connection = accessConfig.getAccessFeedConnection(dataBaseName);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM TBLFEEDS");
try {
List<AccessFeedEntity> listofaccessFeedEntity = new ArrayList<AccessFeedEntity>();
while(resultSet.next()){
AccessFeedEntity accessFeedEntity = new AccessFeedEntity();
accessFeedEntity.setFeedid(resultSet.getLong("ID"));
accessFeedEntity.setFeedname(resultSet.getString("NAME"));
listofaccessFeedEntity.add(accessFeedEntity);
}
connection.close();
statement.close();
resultSet.close();
return listofaccessFeedEntity;
} catch (SQLException e) {
connection.close();
statement.close();
resultSet.close();
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}finally{
try {
connection.close();
statement.close();
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
当我尝试在 Kudu 调试控制台上删除该文件时,我收到以下消息&#34; 该进程无法访问该文件,因为它正由另一个进程使用。 &#34;
当我尝试在localhost文件上删除时。但是在Azure上没有用。
我哪里出错了,哪里没有关闭流?
或者有人可以帮助我以其他方式删除此文件吗?
答案 0 :(得分:0)
尝试停止应用并在应用关闭时将其从Kudu中删除。