Próbuję zsynchronizować wypłatę pliku na twardym dysku z bazy danych.Próbuję zsynchronizować system zapisu plików w java
Co robię w celu sprawdzenia, czy plik istnieje, a jeśli nie, to pobrać plik z bazy danych i wdrożyć go. Nie chciałbym pisać tego pliku wiele razy z powodu stanu Race.
Oto kod zrobiłem:
importent: Ten kod jest wewnątrz Bean ze wszystkimi jego znaczeń
@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; }
Dzięki takiemu rozwiązaniu w przypadku nie znajdę plik, który naprawdę nie będę zapisywał pliku 2 razy, jak również jakikolwiek inny plik, ponieważ synchronizuję cały blok dla wszystkich wątków próbujących go osiągnąć, nawet jeśli mam napisać inny plik.
Wszelkie sugestie?
Dzięki.
Jaką wersję Java? – erickson