我正在研究一个学校java项目。它涉及一个sqlite数据库。我在我的机器(Mac OS X)上运行一个ant构建脚本,将一些数据导入sqlite文件。它在我的机器上工作正常。然后我将我的项目文件夹压缩为一个zip文件,然后将zip压缩到我大学的学生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命令不是什么特别的......只需几个drop table然后创建tables命令。
我怀疑在学校管理我的“主文件夹”的服务器正在尝试将我的网络主文件夹与我目前正在使用的linux机器同步。那就是在我试图运行它的同时复制sqlite文件?这听起来像是一种可能吗?
修改 我在我的mac上安装了virtualbox和linux,复制了文件,并且遇到了与学校的linux机器相同的问题。这可能与平台依赖有关吗?
答案 0 :(得分:0)
我再玩了几个小时,并将我的sql命令从create table TABLENAME...
更改为create table if not exists TABLENAME
。我不知道它是否与db事务有关,但它不喜欢普通的create table
。似乎工作,但我们真的看到我什么时候放弃了项目。我仍然不知道为什么我的mac没有抱怨,但linux确实如此。