5.7. Persistence Manager の設定

JBoss Messaging には JDBC Persistence Manager が同梱されており、JDBC を介してアクセスされるリレーショナルデータベースのメッセージデータの永続化処理を行います。Persistence Manager は Messaging サーバーにプラグが可能です。これにより、非リレーショナルのストア、ファイルストアにあるメッセージデータを永続化する追加の実装が可能になります。
永続サービス設定の詳細は <database type>-persistence-service.xml にグループ化されています。JBoss Messaging にはデフォルトで hsqldb-persistence-service.xml ファイルが同梱されています。これにより、デフォルトで JBoss Enterprise Application Server インスタンスに付属している Hypersonic データベースインスタンスを使用するように Messaging サーバーを設定します。

警告

Hypersonic は実稼働環境の使用ではサポートされていません。
JBoss Messaging には MySQL、Oracle、PostgreSQL、Sybase、Microsoft SQL Server、DB2 の Persistence Manager 設定も同梱しています。サンプルの設定ファイル (mysql-persistence-service.xmlndb-persistence-service.xml) は、リリースバンドルの jboss-as/docs/examples/jms ディレクトリにあります。
JDBC Persistence Manager は標準 SQL をその Data Manipulation Language (DML) として使用します。そのため、Persistence Manager 設定を別のデータベースの種類に書き込むことは、設定の Data Definition Language (DDL) の変更の問題です。これは通常、データベースごとに異なります。
JBoss Messaging には Null Persistence Manager 設定オプションも同梱されており、永続化が必要ない場合に使用できます。
以下のコードはデフォルトの Hypersonic 永続マネージャー設定です。
<mbean code="org.jboss.messaging.core.jmx.JDBCPersistenceManagerService"
  name="jboss.messaging:service=PersistenceManager"
  xmbean-dd="xmdesc/JDBCPersistenceManager-xmbean.xml">

  <depends>jboss.jca:service=DataSourceBinding,name=DefaultDS</depends>

  <depends optional-attribute-name="TransactionManager">
    jboss:service=TransactionManager
  </depends>
        
  <!-- The datasource to use for the persistence manager -->
                            
  <attribute name="DataSource">java:/DefaultDS</attribute>

  <!-- If true will attempt to create tables and indexes on every start-up -->
              
  <attribute name="CreateTablesOnStartup">true</attribute>

  <!-- If true then will use JDBC batch updates -->
             
  <attribute name="UsingBatchUpdates">false</attribute>

  <!-- The maximum number of parameters to include in a prepared statement -->            

  <attribute name="MaxParams">500</attribute>
</mbean>

重要

Sybase データベーステキストとイメージデータのタイプの最大サイズはデフォルトでは 2 kilobytes に設定されています。この制限を越えるすべてのメッセージは、通知や警告なく切り捨てられます。切り捨てられないようにするには @@TEXTSIZE データーベースのパラメータをそれより高く設定します。
@@TEXTSIZE 値をデフォルト値より低く設定すると、Microsoft SQL Server でもこの切り捨て動作が起こることがあります。詳しくは http://jira.jboss.com/jira/browse/SOA-554 と、『管理設定ガイド』の『Sybaseに関する特記』 の項を参照してください。

重要

データがデーターベースから削除される場合、Microsoft SQL Server はハードドライブの領域の割り振り解除を自動的に行うことはありません。多くの記録を一時的に格納するサービスのデータストアとしてハードドライブのデータベース領域を使用する場合 (メッセージングサービスなど)、そのディスク領域は実際に格納されているデータ量より非常にかつ素早く大きくなります。
未使用領域が必ず再利用されるようデーターベース管理者は、データーベースのメンテナンス計画を実施する必要があります。未使用領域を使用するガイダンスに関しては、DBCC コマンドの ShrinkDatabaseUpdateUsage に関するご使用の Microsoft SQL Server のドキュメントを参照してください。この問題の詳細については https://issues.jboss.org/browse/SOA-629 を参照してください。

5.7.1. JDBCPersistenceManager MBean 属性

JDBCPersistenceManager 属性が以下の一覧で説明されています。
CreateTablesOnStartup
永続マネージャーが起動時にテーブル(およびインデックス)の作成を試行するようにするには、これを true に設定します。テーブルまたはインデックスが既に存在している場合は、SQLException は JDBC ドライバーによって送出されますが、永続マネージャーはこれを無視するためその動作は継続します。
デフォルトでは、CreateTablesOnStartup 属性の値は true に設定されています。
UsingBatchUpdates
データベースが JDBC バッチ更新に対応している場合は、これを true に設定します。JDBC 永続マネージャーは、バッチ内のデータベースアップデートを複数まとめ、パフォーマンスを向上します。
デフォルトでは、UsingBatchUpdates 属性の値は false に設定されています。
UsingBinaryStream
getBytes(), setBytes() ではなく JDBC バイナリストリームを使いメッセージを保存、読み込みたい場合は、これを true に設定します。データベースによっては、getBytes()/setBytes() を使った ゲット/セットにはバイトの上限があります。
デフォルトでは、UsingBinaryStream 属性の値は true に設定されています。
UsingTrailingByte
末尾にゼロがある場合、Sybase のバージョンによっては、blob を切り捨てると言われています。これを防ぐには、この属性を true に設定し、末尾に0がこないバイト数を追加し、永続前と後で各 blob を削除し、データベースから blob が切り捨てられないようにします。現在、Sybase のみに必要であるとわかっています。
デフォルトでは、UsingTrailingByte 属性の値は false に設定されています。
SupportsBlobOnSelect
Oracle (および、他のデータベース) では、INSERT INTO ... SELECT FROM 文字列を使い、BLOB を挿入できないため、2段階のメッセージ条件挿入が必要となります。この値が false の場合、このような2段階の挿入を使います。
デフォルトでは、SupportsBlobOnSelect 属性の値は true に設定されています。
SQLProperties
特定のデーターベースの DDL と DML を指定します。特定の DDL や DML ステートメントがオーバーライドされていない場合は、デフォルトの Hypersonic 設定がそのステートメントに使用されます。
MaxParams
メッセージをロードすると、永続マネージャーは多数のパラメーターで準備している文字列を生成します。この値により、永続マネージャーは、用意した文字列毎に許容されるパラメーターの絶対最大数はどれくらいであるか判断します。
デフォルトでは、MaxParams 属性値は 100 に設定されています。
UseNDBFailoverStrategy
クラスター化されたデータベース環境で実行している場合、データベーストランザクションのコミット中にMySQL などのデータベースで問題が発生することがあります。これは、データベースのノードがコミット中に切断された場合 (つまり、トランザクションの最終段階が未知の状態の場合) 発生します。この属性を true に設定すると、上記が発生し、SQL ステートメントは再度実行されます。ただし、さらにエラーが発生すると、以前のトランザクションのコミットが正常に終了したためと推測され、このエラーは無視されます。
デフォルトでは、UseNDBFailoverStrategy 属性は false に設定されています。
Database Connection Retry パラメーターは、接続失敗が検出された場合接続を再確立するか、何度再接続を試みるか、接続再試行の間隔はどの程度かを制御します。
RetryOnConnectionFailure
MBean がデータベースへの再接続を試行すべきか指定します。デフォルト値は false です。
MaxRetry
DataSource 接続失敗の上限を指定します。デフォルトは 25 です。パラメーターを -1 に設定し、「Retry forever」モードを有効にします。このパラメーターは RetryOnConnectionFailuretrue に設定されている場合有効です。

重要

クラスター化されたデスティネーションからメッセージをコンシュームするクライアントは、クローズされると応答しなくなります。これは、ノードの MaxRetry 値が-1 に設定されている場合に発生し、データベースへの接続が失われます。この問題を回避するには、ノードのMaxRetry パラメーターを-1よりも大きな値に設定してください。 [database]-persistence-service.xmlファイルにある PersistenceManagerPostOfficeJMSUserManager MBeanの属性値を設定してください。
RetryInterval
連続する再試行の間隔を指定します。デフォルトは、1000 (ミリ秒) となっています。このパラメーターは、RetryOnConnectionFailuretrue に設定されている場合に有効です。
CreateTablesOnStartup
Persistence Manager を開始する時に、テーブルとインデックスの作成を試行するか設定します。true (デフォルト) に設定すると、永続マネージャーは起動時にテーブル(およびインデックス)を作成するよう試行します。テーブルまたはインデックスが既に存在している場合は、SQLException は JDBC ドライバーによって送出されますが、永続マネージャーはこれを無視するためその動作は妨害されずに継続します。
UsingBatchUpdates
パフォーマンスを向上させるために複数のデーターベース更新をバッチでグループ化するか指定します。ご使用のデータベースが JDBC のバッチ更新をサポートする場合は、この値を true に設定します。デフォルト値は false です。
UsingBinaryStream
メッセージが getBytes()setBytes() を介してではなく、JDBC バイナリストリームを使用して保存や読み取りを行うか指定します。ご使用のデーターベースが getBytes()setBytes() を使用する必要がある場合は、この値を false に設定します。デフォルト値は true です。
UsingTrailingByte
末尾のゼロが含まれる Sybase database BLOB の処理方法を指定します。true に設定すると、末尾がゼロでないバイトは、永続化の前にそれぞれの BLOB に追加され、永続化に続く BLOB から削除されます。これによりデーターベースによる切り捨てを防止します。デフォルト値は false です。

注記

Sybase の特定のバージョンは末尾にゼロがある BLOB を切り捨てます。この属性は Sybase データーベースを実行している場合のみ必要です。
SupportsBlobOnSelect
BLOB をどのように特定のデーターベースの種類に挿入するか設定します。false に設定すると、2 ステージ挿入が使用されます。デフォルト値は true です。

注記

特に Oracle などの特定のデーターベースでは、INSERT INTO ... SELECT FROM ステートメントを介した BLOB 挿入を許可しないため、2 ステージの条件メッセージの挿入が必要です。Oracle のデーターベース、またはこの要件が付いた他のデーターベースを実行している場合は、この属性を false に設定します。
SQLProperties
特定のデーターベースの DDL と DML を指定します。特定の DDL や DML ステートメントが無効になっていない場合は、デフォルトの Hypersonic 設定がそのステートメントに使用されます。
UseNDBFailoverStrategy
クラスター環境でデーターベースのトランザクションのコミットが失敗した場合に、SQL ステートメントを再度実行するか指定します。true に設定すると、コミットが失敗した場合 SQL ステートメントは再度実行されます。さらにエラーが発生する場合は、永続マネージャーはそのエラーは以前のトランザクションが正しくコミットされているためと仮定し、エラーを無視します。デフォルトでは、この属性は false に設定されています。

注記

クラスター環境で実行する MySQL などの一部のデータベースは、データーベースのトランザクションのコミット中に失敗することがあります。これが発生すると、最終的なトランザクションの状態は不明です。
MaxParams
メッセージのロード中に、準備済みステートメントごとに許可されたパラメーターの最大数を指定します。デフォルト値は 500 です。