web-dev-qa-db-fra.com

Echec de l'acquisition du verrou de la base de données et hsqldb

J'essayais de me connecter à une base de données hsql. J'ai créé un en exécutant à partir de C:\myhsql:

Java -cp .;C:\hsql\lib\hsqldb.jar org.hsqldb.Server -database.0 file:db\mydb -dbname.0 MYDB

Ceci a créé mydb dans un répertoire appelé db. Ce dossier a maintenant un .lck, tmp, un script, des fichiers de propriétés avec le nom mydb et des fichiers similaires avec le nom MYDB dans le dossier en cours.

En code Java j'ai essayé

Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:file:db/sjdb", "SA", "");

Lorsque j'exécute le programme, j'obtiens cette erreur:

Java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@f3811c1a[file =C:\myhsql\db\mydb.lc
k, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2010-10-19 12:46:09 heartbeat - read: -6750 ms.
...

Voici le stacktrace:

Java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@f3811c1a[file =C:\myhsql\db\sjdb.lc
k, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2010-10-19 12:46:09 heartbeat - read: -6750 ms.
        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
        at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
        at org.hsqldb.jdbc.JDBCConnection.<init>(Unknown Source)
        at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source)
        at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source)
        at Java.sql.DriverManager.getConnection(Unknown Source)
        at Java.sql.DriverManager.getConnection(Unknown Source)
        at ConnectHSQLDB.main(ConnectHSQLDB.Java:20)
Caused by: org.hsqldb.HsqlException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@f3811c1a[file =C:\myhsql\db\sjdb.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2010-10-19 12:46:09 heartbeat - read: -6750 ms.
        at org.hsqldb.error.Error.error(Unknown Source)
        at org.hsqldb.persist.LockFile.newLockFileLock(Unknown Source)
        at org.hsqldb.persist.Logger.acquireLock(Unknown Source)
        at org.hsqldb.persist.Logger.openPersistence(Unknown Source)
        at org.hsqldb.Database.reopen(Unknown Source)
        at org.hsqldb.Database.open(Unknown Source)
        at org.hsqldb.DatabaseManager.getDatabase(Unknown Source)
        at org.hsqldb.DatabaseManager.newSession(Unknown Source)
        ... 6 more
Java.lang.NullPointerException
        at ConnectHSQLDB.main(ConnectHSQLDB.Java:32)

Quelqu'un peut-il me dire ce que je fais mal? Je peux me connecter à la base de données à l'aide de SwingDBManager et enregistrer insert, delete et select dans la base. Je n'exécutais pas DBManager lorsque j'ai essayé le code Java. Le problème de verrouillage persiste.

19
markjason72

La première commande démarre un serveur. Ce serveur verrouille les fichiers de base de données afin que "les autres" ne puissent pas les modifier. Vous devez utiliser "-dbname.0 mydb" au lieu de "MYDB", comme il se doit en minuscule.

L'URL de votre connexion Java pour vous connecter à la base de données est incorrecte. Vous devez utiliser "jdbc: hsqldb: hsql: // localhost/mydb" comme chaîne de connexion. Alors que les fichiers de base de données sont verrouillés par le serveur, vous pouvez accéder au serveur de base de données mais vous ne pouvez pas accéder à la base de données "en cours de traitement" avec un fichier: URL.

18
fredt

Si vous avez un autre client en cours d’exécution qui se connecte à votre base de données, vous devez le fermer.

5
Jokasy

Je suis confronté à cette erreur car je souhaitais afficher une base de données ouverte dans un autre client tel que IntelliJ database pendant que le serveur utilise la même base de données 

afin de rendre la base de données hsql capable d’être connectée à plusieurs clients, utilisez 

hsqldb.lock_file=false

donc l'URL de connexion sera comme 

jdbc:hsqldb:file:./db/myDbInFile;hsqldb.lock_file=false
2
Basheer AL-MOMANI

Quelle que soit la façon dont vous avez essayé, c'est correct.

Il n'est pas nécessaire de démarrer le serveur HSQLDB à l'aide de la commande Java séparée. La ligne ci-dessous n'est pas obligatoire car elle verrouille la base de données. Empêchez tout autre processus de démarrer et de verrouiller la base de données.

Java -cp .;C:\hsql\lib\hsqldb.jar org.hsqldb.Server -database.0 file:db\mydb -dbname.0 MYDB

il suffit de lancer le programme jdbc 

Java -cp hsqldb.jar  HSQLAccess 

sous la ligne 

jdbc:hsqldb:file:db/sjdb

va démarrer la base de données et donnera le résultat. 

de cette façon, vous ne devez pas démarrer le serveur séparément, vous devez simplement exécuter le programme, qui démarrera et arrêtera HSQLDB pour vous.

import Java.sql.*;

public class HSQLAccess {

    public static void main(String args[]) throws Exception
    {
        Connection con = null;
        try
        {
            Class.forName("org.hsqldb.jdbcDriver");         
            con = DriverManager.getConnection("jdbc:hsqldb:file:db/sjdb", "sa","");    

            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM CMDS_WO_MASTER");
            while(rs.next())
            {
                System.out.println(rs.getString(1));
            }

            con.close();

        }
        catch(Exception ex )
        {
            ex.printStackTrace();
        }
        finally
        {
            if(con!=null)
            {
                 con.close();
            }
        }
    }
}
2
muthu vel

essayez d’utiliser l’URL de connexion suivante dans Windows connection = DriverManager.getConnection ("jdbc: hsqldb: fichier: /// c:/hsqldb/mydb", "SA", "");

0
japkpc

Je viens de fermer NetBeans, de supprimer database.lck et de réexécuter l'application. Tout a bien fonctionné.

0
Tundro

sur mon Mac, le port du connecteur sur HTTP est passé de 8080 à 8443 sur server.xml. et c'est ce qui me donnait cette erreur: les schémas HTTP et HTTPS utilisaient le même port

0
iammyr