web-dev-qa-db-fra.com

Erreur de base de données H2: la base de données est peut-être déjà utilisée: "Verrouillé par un autre processus"

J'essaie d'utiliser la base de données H2 à partir d'une application Java. 

J'ai créé la base de données et ses tables via la console H2, puis j'essaie de me connecter depuis Java à l'aide de 

Connection con = DriverManager.getConnection("jdbc:h2:~/dbname", "username", "password");

Cependant, je reçois le message d'erreur suivant:

Exception dans le fil "main" org.h2.jdbc.JdbcSQLException: La base de données est peut-être déjà utilisée: "Verrouillé par un autre processus". Solutions possibles: fermez toutes les autres connexions; utiliser le mode serveur [90020-161]

J'ai essayé de supprimer le fichier dbname.lock.db mais il est automatiquement recréé.

Comment puis-je déverrouiller la base de données pour l'utiliser à partir de mon programme Java?

39
Vasilis

H2 est toujours en marche (je peux le garantir). Vous devez utiliser une connexion TCP pour plusieurs utilisateurs tels que ->

<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/C:\Database\Data\production;"/>

OR

DriverManager.getConnection("jdbc:h2:tcp://localhost/server~/dbname","username","password");

Cela signifie également que vous devez démarrer le serveur en mode TCP. Honnêtement, c'est assez simple dans la documentation.

Forcez kill le processus (javaw.exe pour Windows) et assurez-vous que toute application qui aurait pu le démarrer est fermée. Vous avez un verrou actif.

42
Daniel B. Chapman

J'utilise h2db avec une application test T24 tafj. J'avais le même problème, mais j'ai réussi à le résoudre en identifiant l'application qui exécute h2 (lancée lorsque j'ai tenté de configurer une connexion à une base de données).

ps aux|grep Java

donnera la sortie comme: 

sysadmin 22755  3.2  0.1 5189724 64008 pts/3   Sl   08:28   0:00 /usr/Java/default/bin/Java -server -Xmx2048M -XX:MaxPermSize=256M -cp h2-1.3.175.jar:/r14tafj/TAFJ/dbscripts/h2/TAFJFunctions.jar org.h2.tools.Server -tcp -tcpAllowOthers -baseDir /r14tafj/t24/data

maintenant tuer ceci avec son identifiant de processus:

kill -9 22755

et supprimez enfin le fichier de verrouillage:

rm -f dbname.lock.db
11
Cal Vin

Vous pouvez également visiter l'onglet "Préférences" de la console H2 et arrêter toutes les sessions actives en appuyant sur le bouton d'arrêt.

6
Filip

J'ai eu le même problème . Dans Intellj, quand je veux utiliser h2 base de données lorsque mon programme était en cours d'exécution j'ai la même erreur .

spring.datasource.url=jdbc:h2:file:~/ipinbarbot

à:

spring.datasource.url=jdbc:h2:~/ipinbarbot;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

Et puis mon problème est parti. Maintenant, je peux me connecter à la base de données "ipinbarbot" quand mon programme est . Si vous utilisez Hibernate, n'oubliez pas:

spring.jpa.hibernate.ddl-auto = update

bonne chance

4
Saman Salehi

Étape simple: accédez au gestionnaire de tâches et supprimez le processus Java.

alors commencez votre application

3
Sivakrishna

Saman Salehi, ci-dessus, m'a donné des indices sur . Mon dossier utilisateur: Préparation de l'application REST pour l'équilibrage de la charge côté client (exécution de deux instances JVM de REST). Ici, mon application MVC appellera cette application REST dotée du serveur ActiveMQ pour DATA . J'ai eu le problème lorsque j’ai exécuté deux instances de l’application REST dans Eclipse et que je tentais d’exécuter les deux instances de la même manière. temps avec la configuration suivante

spring.datasource.url=jdbc:h2:file:./Database;
spring.jpa.properties.hibernate.hbm2ddl.auto=update

Après avoir ajouté DB_CLOSE_ON_EXIT = FALSE; AUTO_SERVER = TRUE

spring.datasource.url=jdbc:h2:file:./Database;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE

Les deux instances sont en cours d'exécution et apparaissent dans Eureka Dasboard.

Ne fermez pas la base de données lorsque VM se ferme: jdbc: h2:; DB_CLOSE_ON_EXIT = FALSE

Plusieurs processus peuvent accéder à la même base de données sans avoir à démarrer le serveur manuellement; AUTO_SERVER = TRUE 

Lectures supplémentaires: http://www.h2database.com/html/features.html

3
vimal krishna

Vous pouvez également supprimer le fichier de la base de données de fichiers h2 et le problème disparaîtra.

jdbc: h2: ~/dbname signifie que la base de données h2 avec le nom db name sera créée dans le répertoire de base de l'utilisateur (~/signifie le répertoire de base de l'utilisateur, j'espère que vous travaillerez sous Linux). 

Dans ma machine locale, il se trouve dans: /home/jack/dbname.mv.db. Je ne sais pas pourquoi le fichier porte le nom nom_base.mv.db, mais plutôt nom_base. Peut-être ses paramètres par défaut h2. Je supprime ce fichier: 

rm ~/dbname.mv.db 

OU: 

cd ~/ 
rm dbname.mv.db 

La base de données nom_base sera supprimée avec toutes les données. Après une nouvelle base de données, tout ira bien.

2
Jackkobec

Dans un problème similaire, la solution pour moi consistait à exécuter fuser -k 'filename.db' sur le fichier contenant un verrou.

J'espère que cela t'aides!

1
DerfOh

J'ai rencontré des problèmes similaires avec ORMLite à partir d'une application Web. Au début, je suis resté bloqué sur la syntaxe pour utiliser le mode serveur dans l'URL. Les réponses ci-dessus ont aidé avec ça. Ensuite, j'ai eu la même erreur d'utilisateur/mot de passe qui était plus facile à comprendre. Je n'ai rien eu à fermer ni à effacer aucun fichier. Le code suivant a fonctionné: 

protected ConnectionSource getConnectionSource() throws SQLException {
    String databaseUrl = "jdbc:h2:tcp://localhost/~/test";
    return new JdbcConnectionSource(databaseUrl,"sa","sa");
}

Pour utiliser H2 en mode serveur sur wildfly, j'ai modifié l’URL de connexion en standalone.xml.

<datasource jndi-name="Java:jboss/datasources/ExampleDS" pool- name="ExampleDS" enabled="true" use-Java-context="true">
     <connection-url>jdbc:h2:tcp://localhost/~/test</connection-url>
               …
</datasource>
1
user6627139