2010-01-08 23 views
17

Tôi có một hệ thống lưu trữ các kết quả nhỏ/đơn giản của cuộc gọi SOAP khi khởi độngjava.util.Prefs ném BackingStoreException - Tại sao?

Tôi cần các phiên bản để có thể tải lại bộ nhớ cache khi khởi động (trong trường hợp dịch vụ SOAP bị chết) và CSONG xử lý khả năng nhiều trường hợp sử dụng tập tin bộ nhớ cache này

tôi đã chọn để sử dụng java.util.prefs nhưng được xây dựng trong chủ đề đồng bộ hóa tự động của Java được liên tục thất bại (1% thời gian sử dụng 30 JVM mặc định ủng hộ cửa hàng đồng bộ) bán phá giá sau ngoại trừ:

Jan 8, 2010 12:30:07 PM java.util.prefs.FileSystemPreferences syncWorld 
WARNING: Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock. 

Tôi nghi ngờ this bug nhưng điều này đã được sửa trong 1,5 (tiger-b40) và java 5 của chúng tôi trên hộp này là "1.5.0_16-b02".

Tôi bây giờ nghi ngờ rằng có thể là do chúng tôi có nhiều JVM chia sẻ Cửa hàng Sao lưu này, mặc dù điều này dường như không xảy ra trên các máy khác của chúng tôi.

Có ai có thể xác nhận điều này không? Những rủi ro, nếu có?

Nếu cách tiếp cận của tôi không đúng, tôi nên sử dụng phương pháp thay thế nào?

+2

cung cấp một số mã, đừng mong đợi chúng tôi đoán – Bozho

+1

Chắc chắn có vẻ như có liên quan đến việc có nhiều JVM đang cố gắng làm việc với cùng một tệp.Mọi người có xu hướng sử dụng cơ sở dữ liệu để tập trung dữ liệu được chia sẻ và sửa đổi đồng thời bởi nhiều quy trình. – BryanD

+2

API 'java.util.prefs' là gà tây. Tôi đề nghị bỏ qua nó và sử dụng một cái gì đó mà người khác thực sự sử dụng, giống như một cơ sở dữ liệu. – skaffman

Trả lời

8

"bây giờ tôi nghi ngờ rằng nó có thể là bởi vì chúng tôi có nhiều JVM chia sẻ lưu trữ sao lưu này"

này hoàn toàn có thể là trường hợp! Nếu hai JVM cố gắng khóa tệp đó giống nhau thì đây là những gì bạn sẽ thấy.

Chi tiết chính xác sẽ tùy thuộc vào loại khóa, hệ điều hành và hệ thống tệp.

Bạn có thể muốn thử gói hoạt động gây ra lỗi này trong khối try/catch, sau đó thử lại thao tác nếu không thành công.

+3

Cảm ơn bạn đã trả lời. Vấn đề không may là thread đồng bộ hóa cho Java Preferences nằm ngoài tầm kiểm soát của chúng ta, vì vậy không thể bắt ngoại lệ. Tốt phê bình ở đây: http://www.allaboutbalance.com/articles/disableprefs/ – HaveAGuess

0

Thay vì sử dụng tùy chọn, chỉ cần sử dụng bất kỳ bản đồ tuần tự hóa nào và tạo một lớp bộ đệm rất đơn giản, tuần tự hóa và deserializes nó thành tên tệp tạm thời được tạo ngẫu nhiên (tên tệp được tạo lần đầu tiên). Vì nó chỉ là một bộ nhớ đệm, bạn có thể bắt bất kỳ ngoại lệ nào và đặt lại bộ nhớ cache về trạng thái ban đầu khi ngoại lệ xảy ra, vì vậy nó sẽ tìm nạp lại từ nguồn dữ liệu gốc (dịch vụ SOAP trong trường hợp của bạn). Vì vậy, không cần phải lo lắng về serialVersionUID hoặc bất kỳ công cụ tương thích nào, nếu bạn không muốn.

+0

Vấn đề là tôi cần các trường hợp để có thể tải lại bộ nhớ cache khi khởi động (trong trường hợp dịch vụ SOAP đã chết) và CSONG xử lý khả năng nhiều các cá thể sử dụng tệp bộ nhớ cache này. Tôi sẽ thêm vào OP – HaveAGuess

0

Tôi đã gặp sự cố tương tự với cầu tàu. Tôi thấy vấn đề sau đã được khắc phục.

Thêm .systemPrefs vào thư mục JRE của bạn và cung cấp quyền truy cập cho người dùng đang chạy quy trình đang khiếu nại.

Khi đã xong, đi đến thư mục Jetty và mở start.ini tập tin

-Djava.util.prefs.userRoot={user's home directory}

-Djava.util.prefs.systemRoot={user's home directory}

Khi thêm những dòng tôi khởi động lại cầu cảng đã hoàn thành và phát hiện ra rằng các lỗi đã biến mất .

+0

Tôi đoán điều này hoạt động bằng cách thay đổi cửa hàng mà JRE cụ thể sử dụng, để tránh xung đột với JRE khác mà bạn phải đang chạy. Cám ơn vì đã chia sẻ – HaveAGuess

Các vấn đề liên quan