-1

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

4

1 回答 1

0

我又玩了几个小时,并将我的 sql 命令从 更改create table TABLENAME...create table if not exists TABLENAME. 我不知道它是否与 db 事务有关,但它不喜欢普通的 old create table。似乎可行,但我们会真正看到我何时通过该项目。我仍然不知道为什么我的 mac 没有抱怨,但 linux 做到了。

于 2013-07-29T21:03:42.657 回答