gpt4 book ai didi

java - Spring如何处理文件保存

转载 作者:太空宇宙 更新时间:2023-11-04 13:42:52 26 4
gpt4 key购买 nike

在应用程序中,我当前正在将文件保存到文件系统,然后更新数据库。我的问题是:我应该在交易中还是交易前进行?

目前我正在这样做 - 在事务之前,如果出现保存文件失败,它不会更新数据库:

@POST
@Path("passport")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response saveDocument(@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail,
@FormDataParam("documentTypeId") int documentTypeId,
@FormDataParam("id") int id) {

String fileName = fileDetail.getFileName();
String result = "";
String[] split = fileName.split("\\.");
if (split.length == 1) {
//No extension
result = split[0] + new Date().getTime();
} else {
for (int i = 0; i < split.length - 1; i++) {
result += split[i];
}
result += new Date().getTime() + "." + split[split.length - 1];
}
try {
fileService.saveFile(result, uploadedInputStream);
persistenceService.saveDocument(fileName, id, documentTypeId);
} catch (IOException e) {
LOGGER.log(Level.SEVERE, "File saving failed", e);
//TODO Throw exception
}

return Response.ok().build();
}

如果我这样保存,我无法确保如果事务期间发生异常,文件不会被保存。逻辑方法是在事务中更新数据库后进行保存,这样如果发生异常,事务就会回滚。但我不确定在事务中执行 I/O 操作是否是一个好的做法。

最佳答案

这并不简单!原因是,在“库”级别上执行完整的回滚系统非常困难,该系统足够通用以跨所有文件系统工作。您可能认为这很容易,但事实并非如此,并且需要操作系统和文件系统支持。

以下例,如果您要写入一个新文件,回滚只是删除该文件。如果您要删除一个文件,回滚就是取消删除它(需要操作系统支持)。最后,如果您要修改文件,则需要返回到事务之前的状态(需要访问某些文件系统上的日志记录)。

现在,为了实现绝对原子性,Java 库需要直接与新闻系统合作,这样即使 JVM 在事务中崩溃,JFS 也会回滚文件更改。

考虑使用文件系统层,甚至某种 NoSQL 数据库,而不是保存到文件?

关于java - Spring如何处理文件保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31101426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com