spite数据库锁定后scp到学校帐户

时间:2013-07-29 00:48:20

标签: java sql sqlite

我正在研究一个学校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机器相同的问题。这可能与平台依赖有关吗?

1 个答案:

答案 0 :(得分:0)

我再玩了几个小时,并将我的sql命令从create table TABLENAME...更改为create table if not exists TABLENAME。我不知道它是否与db事务有关,但它不喜欢普通的create table。似乎工作,但我们真的看到我什么时候放弃了项目。我仍然不知道为什么我的mac没有抱怨,但linux确实如此。