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.
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.
Si vous avez un autre client en cours d’exécution qui se connecte à votre base de données, vous devez le fermer.
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
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();
}
}
}
}
essayez d’utiliser l’URL de connexion suivante dans Windows connection = DriverManager.getConnection ("jdbc: hsqldb: fichier: /// c:/hsqldb/mydb", "SA", "");
Je viens de fermer NetBeans, de supprimer database.lck et de réexécuter l'application. Tout a bien fonctionné.
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