我正在尝试从数据库同步硬盘上的文件兑现。
我正在检查文件是否存在,如果不存在,我从数据库中获取文件并部署它。由于竞争条件,我不想多次写入文件。
这是我制作的代码:
重要提示:这段代码在一个 Bean 里面,它的所有含义
@Override public String getThumbnailPictureUrl(Design design) { String relativePath = String.format(THUMBNAIL_URL, design.getId(), design.getThumbnailPicture().getFileName()); String realPath = servletContext.getRealPath("/"+relativePath); logger.info("Request Thumbnail picture for design: " + design.getId()); logger.info("Thumbnail picture relative path: " + relativePath); logger.info("Thumbnail picture real path: " + realPath); File file = new File(realPath); if(!file.exists()) { synchronized (thumbnailLock) { if(!file.exists()) { logger.warn("Could not fild file in path: " + realPath); FileAttachment pictureAttachment = design.getThumbnailPicture(); Hibernate.initialize(pictureAttachment.getAttachment()); Data data = (Data) pictureAttachment.getAttachment(); file = toolBox.convertBlobToFile(data.getBlob(), file); logger.warn("file created in path: " + realPath); } } } return relativePath; }
有了这个解决方案,如果我找不到文件,我真的不会像任何其他文件一样写入文件 2 次,因为我正在为所有试图访问它的线程同步整个块,即使是写入不同的文件。
有什么建议么?
谢谢。