web-dev-qa-db-fra.com

Quelle est la bonne façon de fermer H2?

Ceci est lié à cela POST .
Je pense avoir un problème avec H2 Signification qu'il ne se ferme pas correctement.
[.____] Je soupçonne que cela puisque je vois myDB.lock.db Lorsque je fermetu à Tomcat et que le processus ne s'arrête pas.
[.____] J'utilise la mise en commun de la connexion de Tomcat et l'URL à la base de données est:
[.____] url="jdbc:h2:file:/opt/myOrg/Tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"

Du doc ​​ Fermer H2 :

Habituellement, une base de données est fermée lorsque la dernière connexion à celle-ci est fermée ... Par défaut, une base de données est fermée lorsque la dernière connexion est fermée. Toutefois, si ce n'est jamais fermé, la base de données est fermée lorsque la machine virtuelle sort normalement, à l'aide d'un crochet d'arrêt

Je ne peux pas comprendre si je fais quelque chose de mal.
[.____] Devrais-je forcer la base de données à fermer via une commande? Est-ce le sens du crochet d'arrêt?
[.____] Qu'est-ce que je fais mal ici?

Remarque:
Je ne peux pas trouver dans Google un exemple de la façon de fermer H2 correctement (en plus de l'affirmation qu'elle ferme automatiquement sur la dernière fermeture de la connexion). Devrais-je appeler SHUTDOWN moi-même? Est-ce la bonne approche?
[.____] J'ai déjà vu des votes pour fermer la question, mais il n'ya pas eu de raison ou de lien sur un exemple de ce que je recherche

Mise à jour:
[.____] après Joonas Pulakka répond à des informations supplémentaires:

À partir de javacore j'ai utilisé un kill -3 Je vois les threads:

"H2 Log Writer MyApplication" J9VMThread: 0x08DC6F00, J9THread_T: 0x08C9B790, Java/Lang/Fil: 0xE7206CC8, Etat: CW, PRIO = 5 3XMTHeadInfo1 (Native Thread ID: 0xA32, Priorité native: 0x5, Politique natif: Inconnu) 3XMTHeadInfo2
[.____] (Gamme d'adresses de pile native de 0XE5E26000, à: 0XE5E67000, Taille: 0x41000) 3xmthreadInfo3 Java CallStack:
[.____] 4xestacktrace à Java/Lang/Object.Wait (méthode natif)
[.____] 4xestacktrace à Java/Lang/Object.wait (Object.java:196 (Code compilé)) 4xestacktrace à Org/H2/Store/WriterThread.Run (WriterThread.java:102)
[.____] 4xestacktrace à Java/Lang/thread.Run (thread.java:736)

3xmthreadinfo "piscine-8-fil-1" J9VMThread: 0x087C0200, J9Thread_T: 0x0840566C, Java/Lang/Fil: 0xE79BFC80, Etat: P, Prio = 5
[.____] 3XMTHeadInfo1 (ID de thread natif: 0xE1a, priorité native: 0x5, Politique natale: Inconnu) 3XMThreadInfo2
[.____] (Gamme d'adresses de pile natif de: 0xE5f69000, à: 0xe5faa000, Taille: 0x41000) 3xmthreadinfo3 Java CallStack:
4xestacktrace au Sun/misc/non sécurisé.park (méthode natif)
[... (Code compilé)) 4xestacktrace à Java/Util/Concurrent/LinkedblockingQueue.take (LinkedBlockingQueue.java:413 (Code compilé)) 4xestacktrace à Java/Util/Concurrent/ThreadpoolEcutor.GetTask (ThreadpoolEcutor.java:958 (Code compilé)) 4xestacktrace À Java/Util/Concurrent/ThreadPoolExecutor $ travailleur.Run (threadpoolexecutive.java:918) 4xestacktrace à Java/Lang/thread.Run (thread.java:736)

3xMTHeadInfo "H2 Lock Lock Watchdog Opt/Myorg/Tomcat/Tomcat/MyApplication/DB/myDatabase.lock.db" J9VMThread: 0x08DC6900, J9THread_T: 0x08C9BA24, JA
[.____] VA/LANG/FIL: 0XE71E9018, Etat: CW, PRIO = 9 3XMTHeadInfo1
[.____] (ID de thread natif: 0xa30, priorité native: 0x9, politique autochtone: inconnu)
[.____] 3xMTHeadInfo2 (portée de l'adresse de pile natif de: 0xE5DBA000, TO: 0XE5DFB000, Taille: 0x41000) 3xMTHeadInfo3 Java CallStack: 4xestacktrace à Java/Lang/thread.sleep (méthode natif) 4xestacktrace
[.____] à java/lang/thread.sleep (thread.java:851 (code compilé))
[.____] 4xestacktrace à Org/H2/Store/Filelock.Run (Filelock.java:490) 4xestacktrace
à java/lang/thread.run (fil.java:736)

3xmthreadinfo "FileWatchDog" J9VMThread: 0x087C0800, J9THread_T: 0x08C9B4FC, Java/Lang/Fil: 0xE715D878, State: CW, PRIO = 5
[.____] 3XMTHeadInfo1 (ID de thread natif: 0xa2C, priorité native: 0x5, Politique natale: Inconnu) 3xmthreadInfo2
[.____] (Gamme d'adresses de pile maternelle de: 0xE5E67000, à: 0xE5ea8000, Taille: 0x41000) 3xmthreadInfo3 Java CallStack:
[... Run (FileWatchDog.java:104)

24
Jim

La documentation indique que la connexion H2 DB est fermée lorsque la machine virtuelle sort normalement. Et c'est ce que ça fait. Le crochet d'arrêt est déjà là par défaut, vous n'avez rien à faire. Le crochet d'arrêt est un moyen de fermeture parfaitement valide que la fermeture ne doit être fermée que lors de la fin.

Si tu as .lock.db Fichiers restants après l'arrêt, puis la machine virtuelle n'a pas quitté normalement. Vous avez écrit que le processus ne s'arrête pas. Vous devez trouver la raison de cela, car c'est probablement ce qui empêche également le crochet d'arrêt H2 d'exécuter.

Avec de grandes bases de données, la fermeture pourrait prendre un certain temps. Voir avec le débogueur (par exemple Visualvm) Quels discussions restent actives après l'arrêt de votre invocation (Tomcat).

Il y a plus de possibilités: les autorisations de fichier sont définies de sorte que H2 peut Créer les fichiers de verrouillage, mais ne peuvent pas supprimer eux. Si le système d'exploitation empêche H2 de supprimer ses fichiers de verrouillage, il n'y a pas beaucoup de H2 pourrait faire à ce sujet.

9
Joonas Pulakka

En regardant le code DbStarter.contextDestroyed() code de (grâce à allan5 'S - Réponse ), voici le code qui sera travail:

connection.createStatement().execute("SHUTDOWN");

SO AARON DIGULLA 'S Réponse était correct (même s'il n'est pas complètement "copier/pastable").

De plus, si vous avez démarré un H2 TCP Server à l'aide de server = Server.createTcpServer("-tcpAllowOthers"), vous pouvez l'arrêter simplement d'utiliser server.stop().

4
Anthony O.

Vous pouvez exécuter l'instruction SHUTDOWN puis fermer la connexion.

La commande SHUTDOWN rendra H2 gratuit toutes les ressources liées à la connexion immédiatement. Cela vous permettra, par exemple, vous permet de vous débarrasser d'une base de données H2 intégrée lorsque vous redéployez une application Web.

4
Aaron Digulla

Vous ne savez pas si cela est pertinent pour votre situation, mais avez-vous essayé d'ajouter un auditeur dbstarter?

http://www.h2database.com/html/tutorial.html , voir "Utilisation d'un auditeur de servlet pour démarrer et arrêter la base de données".

Le lien suggère d'ajouter ce qui suit à web.xml:

<listener>
    <listener-class>org.h2.server.web.DbStarter</listener-class>
</listener>

S'il vous plaît voir la discussion ici (certes à partir de 2008, donc peut être obsolète) - Apparemment, le correctif s'applique aux instances intégrées et non intégrées: http://groups.google.com/group/h2-database/browse_thread/thread/eb609d58c96f4317

Alternativement comment utilisez-vous les connexions? Êtes-vous sûr que vous nettoyez correctement les connexions?

J'avais des problèmes auparavant, dans mon cas, j'utilisais la connexion avec une JPA EntityManager et j'ai oublié de fermer l'instance d'entitémanager après utilisation, ce qui a entraîné des problèmes:

@PersistenceUnit(unitName="myEm")
private EntityManagerFactory emf;

public void doStuff() {
    EntityManager em = emf.createEntityManager();
    ...
    em.close(); // forgot this line
}
2
Allan5

Non, un crochet d'arrêt est simplement un fil qui fonctionne lorsque la JVM se termine, peu importe si en revenant du système principal (), appelant System.exit (int) ou jetant une exception. Seul un crash JVM l'éviterait. Voir runtime.addshuTowneHook (fil).