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?
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.
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
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.
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
Étape simple: accédez au gestionnaire de tâches et supprimez le processus Java.
alors commencez votre application
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
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.
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!
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>