SharedResourcePowerServer

ネイティブ Java™ コードと生成された Java コードが、データベース接続を共有できるようになりました。これにより、以前に行ったデータベース変更を、両方の種類のコードが含まれている実行単位でコミットできます。 この機能を作動させるには、PowerServer Java クラス SharedResourcePowerServer と、その同じ名前の EGL 外部型を使用します。

この型のオブジェクトを使用すると、ネイティブ Java プログラムと生成された Java プログラムが、一連のデータベース接続を共有できます。 この一連の接続は、以下の 2 つのメカニズムによって決定されます。

EGL コードの記述時には、JavaLib.getSharedResourcePowerServer を呼び出すことによって SharedResourcePowerServer オブジェクトにアクセスできます。 接続を、現行の EGL プログラム内でのみ作成する場合もありますが、接続の詳細を指定するには、オブジェクトをネイティブ Java コードに渡します。この共有メカニズムは、ネイティブ Java コードにどのような方法でアクセスしても機能します。外部型経由であっても、JavaLib システム・ライブラリーで提供される Java アクセス関数経由であっても構いません。

現在のトピックでは、SharedResourcePowerServer の以下のメソッドについてのみ説明します。

これらのメソッドは SharedResourcePowerServer に固有であり、PowerServer または SharedResourcePowerServer のいずれかによって提供されるメソッドを補います。 ネイティブ Java コード内でいずれかの型のオブジェクトを使用する方法の概要については、『Java ラッパー・クラス』を参照してください。

詳しくは、『その他の考慮事項』を参照してください。

addConnection

addConnection メソッドはデータベース接続を追加し、EGL によって生成されるプログラム内でその接続を現行接続にします。addConnection メソッドを繰り返し呼び出すと、前の呼び出しで指定された接続は、その接続が閉じられるまで使用可能な状態のままになります。

public void addConnection( Connection con, String name, int disconnectOption ) 
		throws NullPointerException, IllegalArgumentException, JavartException
con
プログラムの DBMS ビルド記述子オプションで指定された種類のデータベースへの接続。接続は java.sql.Connection 型です。
name
その接続に割り当てる名前。SQLLib.setCurrentDatabase、SQLLib.beginDatabaseTransaction、SQLLib.defineDatabaseAlias、または SQLLib.disconnect を呼び出すときにこの名前を使用します。
disconnectOption
以下のいずれかの SharedResourcePowerServer クラス値。
DISCONNECT_NEVER
EGL ランタイムが接続を閉じることはありません。

基本的に、この値がデフォルトです。多重定義メソッドのバリエーションは、パラメーターを 2 つのみ使用し、この場合 DISCONNECT_NEVER が自動的に指定されます。

DISCONNECT_AUTOMATIC
接続は、SQLLib.disconnect、SQLLib.disconnectAll、SysLib.commit、または SysLib.rollback の呼び出しによって閉じられます。あるいは、SharedResourcePowerServer メソッド commit か rollBack のいずれかの呼び出しによって閉じられます。
DISCONNECT_CONDITIONAL
接続は、以下のいずれかの方法で閉じられます。
  • SQLLib.disconnect、SQLLib.disconnectAll、または SysLib.rollback の呼び出し。
  • 接続によって作成された、開いているすべての結果セットに対して HOLD オプションが無効になっているときは、SysLib.commit の呼び出し。
  • SharedResourcePowerServer メソッド commit または rollBack のいずれかの呼び出し。
DISCONNECT_EXPLICIT
接続は、SqlLib.disconnect または SqlLib.disconnectAll の呼び出しによって、または SharedResourcePowerServer close メソッドの呼び出しによって閉じられます。
このメソッドは、以下の例外をスローします。
  • con または name が null の場合は、NullPointerException。
  • name が空かすべて空白である場合、または disconnectionOption が無効である場合は、IllegalArgumentException。
  • 接続を使用できない場合は、JavartException。

getConnection

getConnection メソッドは、名前付きの接続を返すか、名前の付いた接続がない場合は null を返します。

public Connection getConnection( String name ) throws JavartException
name
接続の名前。

返される接続は java.sql.Connection 型です。このメソッドは、内部エラーの発生後に JavartException をスローします。

getConnections

getConnections メソッドは、アクティブな接続の名前を java.sql.Connection 型のオブジェクトに関連付ける Map オブジェクトを返します。java.util.Map 型である、返される Map オブジェクトは変更できません。

public Map <String, Connection> getConnections() throws JavartException

このメソッドは、内部エラーの発生後に JavartException をスローします。

getCurrentConnection

getCurrentConnection メソッドは、アクティブな接続を返すか、現行接続が有効ではない場合は null を返します。

public Connection getCurrentConnection() throws JavartException

返される接続は java.sql.Connection 型です。このメソッドは、内部エラーの発生後に JavartException をスローします。

releaseConnection

releaseConnection メソッドは、接続が開いている場合、および接続オプションが DISCONNECT_NEVER とは異なる場合に接続オブジェクトを閉じます 切断オプションが DISCONNECT_NEVER である場合や接続が既に閉じている場合でも、EGL ランタイムは接続に関連付けられたリソースを解放することができます。

このメソッドの 2 つのバリエーションが使用可能です。

public void releaseConnection( String name ) throws JavartException, SQLException


public void releaseConnection( Connection con ) throws JavartException, SQLException
name
接続の名前。
con
java.sql.Connection 型である接続オブジェクト。
このメソッドは、以下の例外をスローします。
  • データベース管理システムがエラーを返す場合は、SQLException。
  • 内部エラーが発生した場合は、JavartException。

その他の考慮事項

SharedResourcePowerServer 型のオブジェクトで作業する場合は、いくつかの考慮事項が適用されます。
  • ネイティブ Java コードで接続を閉じる場合は、いずれかの releaseConnection メソッドを呼び出してリソースを解放します。
  • ネイティブ Java コードを記述するときは、ランタイム・エラーが発生する可能性があることに注意してください。エラーが発生する可能性があるのは、生成された Java コードにおいて接続が使用中であるときに、ネイティブ Java コードがその接続を閉じるか、コミットまたはロールバックを実行し、生成されたコードがその接続を再度使用する場合です。 以下に例を示します。
    1. 生成されたコードは、prepare ステートメントを発行し、外部型を使用するか JavaLib アクセス関数を使用してネイティブ Java コードを呼び出し、JavaLib.getSharedResourcePowerServer 関数によって提供されたオブジェクトを渡します。
    2. ネイティブ・コードは、接続を閉じて、生成されたコードに制御を返します。
    3. 生成されたコードは、以前の prepare ステートメントによって作成されたステートメントを使用します。しかし、それより前に接続が閉じられたときに準備済みステートメントは閉じられたため、生成されたコードが失敗します。
  • EGL ロジックによって、SharedResourcePowerServer オブジェクトに複数の接続を割り当てることがあります。デフォルトでは、EGL ステートメントは、powerServer.addConnection() に渡された最後の接続を使用します。SQLLib.setCurrentDatabase を呼び出すことによって、新規接続を選択できます。
  • SysLib.commit または SysLib.rollback の呼び出しは、SharedResourcePowerServer オブジェクトに割り当てられたすべての接続に影響を与えます。ただし、EGL ランタイムが初期接続で行った変更をコミットしても、2 回目の接続で行った変更をコミットすると問題が発生して失敗するという状況が発生する可能性はあります。コミットは、すべてのリソースがコミットされるかどのリソースもコミットされないような 2 フェーズ・コミットではなく 1 フェーズ・コミットであるため、失敗後にデータは矛盾した状態のままになります。
  • 生成されたコードは、対象となる接続が作成されたスレッド内の接続のみを使用することができます。

フィードバック