web-dev-qa-db-fra.com

java.util.Prefs levant BackingStoreException - Pourquoi?

J'ai un système qui met en cache les résultats minuscules/simples d'un appel au démarrage SOAP

J'ai besoin que les instances puissent recharger leur cache au démarrage (dans le cas où le service SOAP est mort) et gèrent ÉGALEMENT la possibilité que plusieurs instances utilisent ce fichier de cache.

J'ai choisi d'utiliser Java.util.prefs, mais le thread de synchronisation automatique intégré à Java échoue par intermittence (1% des cas avec la synchronisation de magasin de sauvegarde JVM 30 par défaut) en déchargeant l'exception suivante:

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.

Je soupçonnais ce bogue mais cela a été corrigé dans la version 1.5 (tiger-b40) et notre version Java 5 de cette boîte est "1.5.0_16-b02".

Je pense maintenant que cela pourrait être dû au fait que plusieurs machines virtuelles Java partagent ce magasin de support, bien que cela ne semble pas se produire sur nos autres machines.

Quelqu'un peut-il confirmer cela? Quels sont les risques, le cas échéant?

Si mon approche est défectueuse, que devrais-je utiliser comme alternative?

19
HaveAGuess

"Je pense maintenant que c'est peut-être parce que nous avons plusieurs JVM partageant ce magasin de support"

Cela pourrait être le cas! Si deux machines virtuelles Java tentent de verrouiller le fichier en même temps, voici ce que vous verrez.

Les détails exacts dépendront du type de verrou, du système d'exploitation et du système de fichiers.

Vous voudrez peut-être essayer d'encapsuler l'opération qui provoque cela dans un bloc try/catch, puis réessayer l'opération si elle échoue.

10
Kevin Wright

J'ai rencontré le même problème avec la jetée. J'ai trouvé ce qui suit résolu le problème.

Ajoutez un .systemPrefs à votre répertoire JRE et fournissez un accès à l'utilisateur qui exécute le processus qui se plaint.

Une fois que cela est fait, allez dans le répertoire Jetty et ouvrez le fichier start.ini

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

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

Une fois ces lignes ajoutées, j’ai redémarré la jetée et constaté que les erreurs avaient disparu.

1
user2981810

Au lieu d'utiliser Préférences, utilisez simplement n'importe quelle carte sérialisable et créez une classe de cache très simple qui la sérialise et la désérialise sous un nom de fichier temporaire généré de manière aléatoire (le nom de fichier étant généré lors de la première initialisation). Puisqu'il ne s'agit que d'un cache, vous pouvez capturer toutes les exceptions et réinitialiser le cache à son état initial lorsqu'une exception se produit. Il sera donc relancé à partir de la source de données d'origine (le service SOAP de votre Cas). Vous n'avez donc pas à vous soucier de serialVersionUID ou de l'un de ces problèmes de compatibilité, si vous ne le souhaitez pas.

0
Robin Green