一度環境を設定すればほとんどのケースで
アプリケーションがデータベースに接続したりJDBCプログラミングを行う必要はありません。
データベースの接続先は環境によって異なりますから
面倒ですが接続先の設定は必ず行わなくてはいけません。
設定は WEB-INF/application-settings.xml に記述します。
エディタで開いて以下の"parm-name"要素を修正します。
-
default.connector-class
コネクタクラスを次の3つから選択します。
・jp.simm.jaxson.jdbc.DataSourceConnector
・jp.simm.jaxson.jdbc.DriverManagerConnector
・jp.simm.jaxson.jdbc.PooledConnector
それぞれ、コンテナが用意するデータソースを使用する場合、
接続のオーバーヘッドを気にしない場合、
接続が頻繁に行われてオーバーヘッドが気になる場合で、
適切なものを選択してください。
-
default.datasource
default.connector-class で DataSourceConnector
を指定した場合に接続先のデータソース名を設定します。
データソースを使用する場合は
接続情報がコンテナで保持されますからこれ以降の設定は不要です。
-
default.driver-class
接続するデータベースベンダが用意するJDBCドライバクラスを設定してください。
JDBCドライバを必ず WEB-INF/lib に格納しておいてください。
-
default.driver-url
接続先データベースのURLを設定します。
-
default.database-user
接続ユーザを設定します。
-
default.database-pass
接続パスワードを設定します。
この他に select-limit で条件検索で取得する最大件数を設定します。
これは膨大な量のデータからクライアントを保護するためです。
但し検索範囲を指定する Persister#select(SelectOption, int, int)
の場合はその引数の指定に従います。
また database-charset にデータベースで使用している文字セットを指定しておくと
バリデータ
のバイト長デェックのデフォルト文字セットとして使用されます。
バイト長チェックしているにもかかわらず
文字数が範囲を超えているというSQLExceptionがスローされる場合は
この設定を見直してください。
複数の接続先が必要な場合は、"default"を任意のコネクタ名に変更した設定を追加します。
例えば "otherDB" というコネクタ名のデータソース接続を追加する場合
<parameter>
<param-name>otherDB.connector-class</param-name>
<param-value>jp.simm.jaxson.jdbc.DataSourceConnector</param-value>
</parameter>
<parameter>
<param-name>otherDB.datasource</param-name>
<param-value>java:/comp/env/jdbc/otherDB</param-value>
</parameter>
のようになります。
アクションクラスに型が Persister の実装クラスのインスタンスフィールドを持つ場合、
そのクラスのオブジェクトを生成してデフォルトのコネクタを設定します。
データベースの接続には default.*** の設定が使用されます。
public class UpdateAccountAction extends ServiceAction {
// GenericPersisterオブジェクトが生成されデフォルトの接続がセットされる
@Entity(Account.class) // GenericPersisterクラスはエンティティクラスを指定する必要がある
private GenericPersister<Account> accountPersister;
// クライアントから渡された値を格納するオブジェクトがセットされる
@ContextParam
Account account;
public Object execute() throws Exception {
accountPersister.update(account);
return "更新成功";
}
}
Accountクラスにキー情報が指定されていればACOUNTテーブルは更新されます。
この例のように、ほとんどのケースではデータベース接続を意識する必要はありません。
デフォルト以外の接続を使用する場合はフィールドを @Connector
注釈して使用するコネクタを指定します。
public class XXXAction extends ServiceAction{
// otherDB.**** の設定による接続を使用する
@Connector ("otherDB")
@TableDEF (acount) // BasicPersisterはテーブルを指定する必要がある
private BasicPersister acountPersister;
public Object execute() throws Exception {
// 検索条件を指定していないので全件検索を行う
return accountPersister.select(null);
}
同じ名称のコネクタを複数のPersisterに設定した場合、
close()で接続を切断しない限り
リクエスト内で同一の接続オブジェクトが使用されることを保証します。
業務ロジック内でトランザクションを制御する必要がある場合や
Connectionインスタンスが必要な場合は
ServiceAction#getConnector()、
ServiceAction#getConnector(String),
ServiceAction#getConnector(String,boolean)
によりコネクタを取得することができます。
引数なしのメソッドはデフォルトのコネクタを返し、
引数ありのメソッドはコネクタ名を指定してコネクタを取得します。
二つの引数を持つメソッドはこのリクエスト内でそのコネクタが使用されていない場合、
第二引数にtrueを渡すと新規にコネクタを作成して返し、
falseを指定するとnullを返します。
アプリケーションがトランザクション制御を行う場合、
コネクタのgetConnection()で取得する接続にコミット、ロールバックは行わず、
できる限りコネクタのコミット、ロールバックメソッドを使用してください。
詳細は
トランザクションを参照してください。
接続プールコネクタ PooledConnector の設定はドライバマネージャコネクタと同じですが、
それとは別に接続プールの設定ができます。
接続プールの設定は共通であって接続名ごとの設定はできません。
設定内容は以下のとおりです。
- connection-pool-initialsize 初期接続数
- connection-pool-maxactive 最大アクティブサイズ
- connection-pool-maxidle 最大アイドルサイズ
- connection-pool-minidle 最小アイドルサイズ
- connection-pool-maxwait 接続を取得するまでの最大待ち時間(ミリ秒)
コンテナ起動時に接続プールを用意している訳ではないので
サイズを大きくすると初回の接続には少々時間がかかるかもしれません。