2016-06-26 5 views
1

私はファイルでHSQLBDを使用しています。HSQLDBモードをオンザフライで読み取り専用に変更することはできますか?

(HSQLDBの私の使用は私のother questionに示されている)

私はdatabase.scriptファイルへの複数のアクセスを受信する必要があります。 デフォルトでは、データベースはここで読み取り専用= falseをは、公式ドキュメントからいくつかの情報であるオプションで実行されている:

読み取り専用データベース

ファイル:カタログは読み取り専用永続的に行うことができ、またはそれを開くことができます を読み取り専用です。データベースを読み取り専用にするには、プロパティー値のペア readonly = trueをデータベースの.propertiesファイルに追加できます。 を変更する前に、SHUTDOWNコマンドを使用してデータベースを閉じる必要があります。

通常のデータベースを読み取り専用で開くこともできます。このため、 のプロパティは、 データベースへの最初の接続のURLに含めることができます。

読み取り専用データベースでは、 の行をTEMPテーブルに挿入して削除することはできます。

しかし、私はまだ本当に理解されていませんが、サーバーのシャットダウンや再起動なしでこのオプションをオンザフライで変更することは可能ですか?可能であれば、小さなコード例を挙げてください。

もしそうでなければ、.scriptファイルのロックを解除し、サーバーのシャットダウンなしに別のスレッドにアクセスする方法がありますか?

答えて

0

お客様の要件は、HSQL内部クラスにアクセスする必要があります。サンプルコードはv2.3.3用に書かれていますが、他のバージョンでは動作しない可能性があります。

//import org.hsqldb.*; 
//start server 
Server.main(new String[]{"-database.0","file:s:/folder/dbname","-dbname.0","dbname","-no_system_exit","true"}); 

//set DB readonly 
Database db = DatabaseManager.lookupDatabaseObject("file:", "s:/folder/dbname"); 
db.setReadOnly(); 
//alter connection to readonly 
Session[] oa = db.sessionManager.getAllSessions(); 
for (int i = 0; i < oa.length; i++) { 
    if (oa[i].getDatabase() == db) { 
     try { 
      oa[i].setReadOnly(true); 
      oa[i].setReadOnlyDefault(true); 
     } catch (Exception e) { 
      //the connection is during transaction... 
     } 
    } 
} 
//the implementation of Database cannot turn to writable, 
//close it... 
db.close(Database.CLOSEMODE_COMPACT); 
関連する問題