JAXSON 業務アプリケーションフレームワーク
トップ

インストール

ドキュメント
チュートリアル
開発ガイド
トランザクション管理
データベース接続
データベースアクセス
バリデーション
セキュリティ
エクセルファイル出力
JavaScriptリファレンス
API doc

ダウンロード
jaxson-2.1.zip

データベース接続

データベース接続はコネクタとしてフレームワークが管理します。
一度環境を設定すればほとんどのケースで アプリケーションがデータベースに接続したりJDBCプログラミングを行う必要はありません。

コネクタの設定
データベースの接続先は環境によって異なりますから 面倒ですが接続先の設定は必ず行わなくてはいけません。
設定は WEB-INF/application-settings.xml に記述します。 エディタで開いて以下の"parm-name"要素を修正します。 この他に 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 の設定はドライバマネージャコネクタと同じですが、 それとは別に接続プールの設定ができます。 接続プールの設定は共通であって接続名ごとの設定はできません。
設定内容は以下のとおりです。 コンテナ起動時に接続プールを用意している訳ではないので サイズを大きくすると初回の接続には少々時間がかかるかもしれません。