我有一个正在研究的学校 Java 项目。它涉及一个 sqlite 数据库。我在我的机器(Mac OS X)上运行一个 ant 构建脚本,将一些数据导入到 sqlite 文件中。它在我的机器上运行良好。然后我将我的项目文件夹压缩为一个 zip 文件,并将 scp 压缩到我大学的学生 CS 帐户。大学的服务器就像一个循环,将我的 ssh 会话 (scp) 放到实验室的一台免费机器 (linux) 上。然后我 ssh 进入我的帐户,解压缩文件,然后尝试运行 ant 脚本。它开始正常,但是在创建表的第 5 个 sql 命令之后,它抱怨我的 sqlite 数据库文件被锁定。
我听说 NFS 文件共享与 sqlite 有点问题......但是大学的服务器是否符合该描述?我已经梳理了我的代码,并确保我适当地关闭了所有准备好的语句和数据库事务。
这听起来像是我的问题吗?大学的终结?平台依赖?我一直在这几个小时试图弄清楚...
谢谢你的帮助!
编辑:我将包含一些代码来澄清:
这在我的 Mac 上运行良好。我压缩我的项目,scp 到学生帐户,在那里解压缩,然后运行它。数据库被锁定的抛出的sql异常见下面的代码。该项目是单线程的。程序的其他部分没有使用这个数据库。
//commands to drop tables, then create them
List<String> sqls = db.getDBCreationCommands();
Statement stmt = null;
db.startTransaction(); //gets connection, sets autocommit(false)
try {
stmt = db.getConnection().createStatement();
for(String sql : sqls){
stmt.addBatch(sql);
}
stmt.executeBatch(); //gets through a couple of entries just fine, then quits
db.endTransaction(true); //commits and closes connection
stmt.close();
}
catch (SQLException e) {
db.endTransaction(false); //roll back and close connection
System.out.println("ERROR COULD NOT DROP DATABASE");
throw new ServerException(e);
}
finally{
if(stmt != null)
try {
stmt.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
这是一个例外:
[java] DROPPING DATABASE . . . . . . . . .ERROR COULD NOT DROP DATABASEException in thread "main" server.ServerException: java.sql.BatchUpdateException: batch entry 5: database is locked
[java]
[java] at server.database.MasterAccess.resetDatabase(MasterAccess.java:56)
[java] at xml.parsing.DataImporter.main(DataImporter.java:39)
[java] Caused by: java.sql.BatchUpdateException: batch entry 5: database is locked
[java] at org.sqlite.Stmt.executeBatch(Stmt.java:168)
[java] at server.database.MasterAccess.resetDatabase(MasterAccess.java:47)
[java] ... 1 more
sql 命令没有什么特别的...只是一些删除表然后创建表命令。
我怀疑在学校管理我的“主文件夹”的服务器正在尝试将我的网络主文件夹与我目前正在使用 ssh 的 linux 机器同步。那会在我尝试运行它的同时复制sqlite文件吗?这听起来像是一种可能性吗?
编辑 我在我的mac上安装了virtualbox和linux,复制了文件,并且遇到了与学校的linux机器相同的问题。这可能与平台依赖性有关吗?