manager - Error de adquisición de bloqueo de base de datos y hsqldb
hsqldb tutorial (7)
Acabo de cerrar NetBeans, borré database.lck y ejecuté la aplicación nuevamente. Todo funcionó bien.
Estaba tratando de conectarme a una base de datos hsql. Creé una ejecutando desde C: / myhsql:
java -cp .;C:/hsql/lib/hsqldb.jar org.hsqldb.Server -database.0 file:db/mydb -dbname.0 MYDB
Esto creó mydb
en un directorio llamado db
. Esta carpeta ahora tiene un archivo .lck, tmp, script, propiedades con el nombre mydb y archivos similares con el nombre MYDB en la carpeta actual.
En código java lo intenté
Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:file:db/sjdb", "SA", "");
Cuando ejecuto el programa, recibo este error:
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.
...
Aquí está el 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)
¿Alguien puede decirme que estoy haciendo mal? Puedo conectarme a la base de datos utilizando SwingDBManager y puedo insert
, delete
y select
registros en la base de datos. No estaba ejecutando DBManager cuando probé el código Java. Aún así el problema de bloqueo pasa.
El primer comando inicia un servidor. Este servidor bloquea los archivos de la base de datos para que "otros" no puedan modificarlos. Debería usar "-dbname.0 mydb" en lugar de "MYDB", ya que debería estar en minúsculas.
Su URL de conexión de Java para conectarse a la base de datos es incorrecta. Debe usar "jdbc: hsqldb: hsql: // localhost / mydb" como la cadena de conexión. Mientras que los archivos de la base de datos están bloqueados por el servidor, puede acceder al servidor de la base de datos pero no puede acceder a la base de datos "en proceso" con un archivo: URL.
Lo que sea que hayas intentado es correcto.
No tiene que iniciar el servidor HSQLDB utilizando el comando java separado, no se requiere la línea inferior, ya que bloqueará la base de datos. Evitar que otro proceso inicie y bloquee db.
java -cp .;C:/hsql/lib/hsqldb.jar org.hsqldb.Server -database.0 file:db/mydb -dbname.0 MYDB
solo ejecuta el programa jdbc
java -cp hsqldb.jar HSQLAccess
debajo de la linea
jdbc:hsqldb:file:db/sjdb
Se iniciará la base de datos y dará resultado.
De esta manera, no tiene que iniciar el servidor por separado, solo tiene que ejecutar el programa, que iniciará y detendrá HSQLDB por usted.
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();
}
}
}
}
Me enfrento a este error porque quería ver una base de datos abierta actualmente en otro cliente como la IntelliJ database
mientras el servidor usa la misma db
así que para que hsql db pueda conectarse a múltiples clientes, use
hsqldb.lock_file=false
entonces la url de conexión será como
jdbc:hsqldb:file:./db/myDbInFile;hsqldb.lock_file=false
Si tiene algún otro cliente en ejecución que se conecte a su base de datos, debe cerrarlo.
en mi Mac, el puerto para Connector en HTTP cambió de 8080 a 8443 en server.xml. y eso es lo que me estaba dando este error: tanto el esquema HTTP como el HTTPS estaban usando el mismo puerto
intente usar la siguiente url de conexión en windows connection = DriverManager.getConnection ("jdbc: hsqldb: file: /// c: / hsqldb / mydb", "SA", "");