私が取り組んでいる学校の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 マシンと同じ問題が発生しています。これは、プラットフォームへの依存と関係があるのでしょうか?