Python: HSQL DB 关闭后仍然打开? (jaydebeapi)
Python: HSQL DB remains open after closing? (jaydebeapi)
任务
我正在编写一个 Python 脚本,该脚本在 HSQL-DB 中进行一些更改,然后通过命令行重新执行 java-programm,该程序与 DB 中的数据一起使用。我正在使用 jaydebeapi 来更改 Python.
中的数据
问题
java 程序失败,因为它无法获得数据库锁。尽管我已经按照 documentation.
中所述关闭了游标和连接
java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@2b59e8f5[file =H:\Benutzer\Markus\Dokumente\Uni\IG_Ue\JAG3D_projects\project1\jag3d_project.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2021-01-13 21:03:33 heartbeat - read: -8526 ms.
最小工作示例
import jaydebeapi
import os
JAG3DAppCMD_path = r"custom_jag3d\JAG3DAppCMD.jar"
db_cmd_path = r"JAG3D_projects\project1\jag3d_project"
# Execute java program BEFORE DB was connected - WORKS
os.system(r'java -jar ' + JAG3DAppCMD_path + ' ' + db_cmd_path + ' TRUE')
# establish DB connection
UserName = "SA"
Password = ""
Java_Class = "org.hsqldb.jdbcDriver"
HSQL_Driver_Path = r"hsqldb-2.5.1\hsqldb\lib\hsqldb.jar"
Database = r"jdbc:hsqldb:file:JAG3D_projects\project1\jag3d_project"
conn = jaydebeapi.connect(Java_Class, Database, [UserName, Password], jars=HSQL_Driver_Path)
curs = conn.cursor()
# close DB
curs.close()
conn.close()
# Execute java program AFTER DB was connected - DOES NOT WORK
os.system(r'java -jar ' + JAG3DAppCMD_path + ' ' + db_cmd_path + ' TRUE')
附加信息
建立数据库连接后,将创建一个 .log 和 .lck 文件以及一个 .tmp 文件夹。在我关闭连接后,这些项目仍然存在。当我关闭 python 控制台时,它们将被删除。我试图在我的 python 脚本中手动删除 .lck 文件,但我不能,因为它仍在被不同的进程使用:
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'JAG3D_projects\project1\jag3d_project.lck'
感谢任何帮助!
您的观察表明,在通过 Python 的第一个连接关闭后,数据库仍然打开。
数据库是一种资源,一旦建立第一个连接就会保持打开状态,并且不会自动关闭(默认情况下)。 .lck 文件阻止任何其他进程访问数据库。
您只需在第一组更改结束时执行 SQL 语句,SHUTDOWN
。这将以干净的方式关闭数据库。
任务 我正在编写一个 Python 脚本,该脚本在 HSQL-DB 中进行一些更改,然后通过命令行重新执行 java-programm,该程序与 DB 中的数据一起使用。我正在使用 jaydebeapi 来更改 Python.
中的数据问题 java 程序失败,因为它无法获得数据库锁。尽管我已经按照 documentation.
中所述关闭了游标和连接java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@2b59e8f5[file =H:\Benutzer\Markus\Dokumente\Uni\IG_Ue\JAG3D_projects\project1\jag3d_project.lck, exists=true, locked=false, valid=false, ] method: checkHeartbeat read: 2021-01-13 21:03:33 heartbeat - read: -8526 ms.
最小工作示例
import jaydebeapi
import os
JAG3DAppCMD_path = r"custom_jag3d\JAG3DAppCMD.jar"
db_cmd_path = r"JAG3D_projects\project1\jag3d_project"
# Execute java program BEFORE DB was connected - WORKS
os.system(r'java -jar ' + JAG3DAppCMD_path + ' ' + db_cmd_path + ' TRUE')
# establish DB connection
UserName = "SA"
Password = ""
Java_Class = "org.hsqldb.jdbcDriver"
HSQL_Driver_Path = r"hsqldb-2.5.1\hsqldb\lib\hsqldb.jar"
Database = r"jdbc:hsqldb:file:JAG3D_projects\project1\jag3d_project"
conn = jaydebeapi.connect(Java_Class, Database, [UserName, Password], jars=HSQL_Driver_Path)
curs = conn.cursor()
# close DB
curs.close()
conn.close()
# Execute java program AFTER DB was connected - DOES NOT WORK
os.system(r'java -jar ' + JAG3DAppCMD_path + ' ' + db_cmd_path + ' TRUE')
附加信息 建立数据库连接后,将创建一个 .log 和 .lck 文件以及一个 .tmp 文件夹。在我关闭连接后,这些项目仍然存在。当我关闭 python 控制台时,它们将被删除。我试图在我的 python 脚本中手动删除 .lck 文件,但我不能,因为它仍在被不同的进程使用:
PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'JAG3D_projects\project1\jag3d_project.lck'
感谢任何帮助!
您的观察表明,在通过 Python 的第一个连接关闭后,数据库仍然打开。
数据库是一种资源,一旦建立第一个连接就会保持打开状态,并且不会自动关闭(默认情况下)。 .lck 文件阻止任何其他进程访问数据库。
您只需在第一组更改结束时执行 SQL 语句,SHUTDOWN
。这将以干净的方式关闭数据库。