-1

私が取り組んでいる学校のJavaプロジェクトがあります。これには、sqlite データベースが含まれます。私のマシン (Mac OS X) で ant ビルド スクリプトを実行して、いくつかのデータを sqlite ファイルにインポートします。私のマシンでは問題なく動作します。次に、プロジェクト フォルダーを zip ファイルに圧縮し、その zip を大学の学生 CS アカウントに scp します。大学のサーバーはラウンド ロビンのようなもので、私の ssh セッション (scp) を研究室の空きマシン (linux) の 1 つにドロップします。次に、自分のアカウントに 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 トランザクションと関係があるかどうかはわかりませんが、単純な古いcreate table. うまくいくように見えましたが、私がプロジェクトを引き継いだときに本当にわかります. なぜ私の Mac は文句を言わなかったのに、Linux は文句を言ったのか、私にはまだわかりません。

于 2013-07-29T21:03:42.657 に答える