最近のアクセス:
[Before connect] プロパティ

アプリケーションが実行時にデータベースにアクセスする直前に、接続プロパティを動的に変更するように Procedure オブジェクトを設定します。

適用範囲

ジェネレーター: .NETJava.NET Framework

説明

この機能を使用するには、必要な接続プロパティを指定する Procedure オブジェクトを定義する必要があります。このプロシージャーは、アプリケーションがデータベースへの接続を確立する直前に実行され、各実行のニーズに応じて接続パラメーターが調整されるようにします。
このプロシージャー内で、アプリケーションが接続する必要がある Datastore のプロパティを記述/変更できます。
Java の BeforeConnect メソッドは、使用する接続プールのタイプがサーバープールか GeneXus プールかによって、異なる頻度で呼び出されます。
  • サーバープールを使用する場合 (.NET と同様): BeforeConnect プロシージャーは、各論理作業単位 (LUW) でデータベースアクセスを実行する前に呼び出されます。つまり、Web Panel オブジェクトのアクション、Transaction オブジェクト、サービスなど、データベースを操作するサーバーへのリクエスト時に (「for each」、「コミット」、「更新」、「削除」など)、BeforeConnect が 1 回実行されます。ただし、実行中に新しい LUW を開始する Procedure オブジェクトがある場合、データベースへの新しい接続が開かれ、BeforeConnect が再度実行されます。
  • GeneXus プールを使用する場合: BeforeConnect は、データベースに対する各操作の前に呼び出されます。これは、GeneXus プールを使用する場合、各操作の前にプールへの接続がリクエストされるためです。プールは以前に使用された同じ接続を返す場合がありますが、データベースとやり取りする各操作で BeforeConnect が実行されます。

接続プールの詳細

.NET では、接続プールは、フレームワークによって自動的に管理されるキーとして、接続文字列を使用します。データストアでユーザーごとに異なるユーザー名が割り当てられている場合、接続はユーザー間で再利用されません。
Java では、接続プールをユーザー間で共有するには、ユーザー名が同じである必要があります。そうしないと、各ユーザーは共有プールを利用せず、独立した接続を使用することになります。

追加の留意事項

ユーザーごとに異なる接続文字列の使用を評価することが不可欠です。この戦略を選択した場合、実行可能な代替策としては、共通の接続文字列を使用し、テナントごとにデータベースのみを変更する方法があります。ログインユーザーの監査は、補助テーブルまたは Web セッションで管理できます。

パフォーマンスへの影響

プロシージャー内で実行される操作が軽量であれば、BeforeConnect を使用しても大きな影響はないはずです。データストア内の接続データの変更など、これらの操作は、パフォーマンスの問題を回避するためのコストがかからないことが重要です。

プロシージャーの要件

[ Before Connect ] プロパティで設定されたプロシージャーは、ナレッジベースで定義され、以下の要件を満たしている必要があります。
DBConnection タイプパラメーターが 1 つ以上必要です。
parm(INOUT: &dbconn); //&dbconn is a DBConnection type variable
3 層モデルでは、[ Execute in new LUW ] プロパティが True に設定されている必要があります。Web 環境では、このプロパティは False に設定されている必要があります。
プロシージャーは Datastore の詳細とともに &dbconn を受け取ります。この詳細は、適用する必要のある論理に基づいて変更できます。たとえば、アプリケーションを実行するユーザーに応じて Datastore の詳細を変更することができます。
データベースに接続したり、データベースに接続する関数を使ったりすることはできません。データベースにアクセスする機能 (プログラムが無限ループを引き起こしてしまうため使用できません) には、次のようなものがあります:
  • For Each コマンド
  • ビジネスコンポーネント
  • GAMSession.Get() または内部でデータベースにアクセスするメソッド
  • データベースにアクセスするプロシージャーの呼び出し

実行時/設計時

このプロパティは実行時のみ適用されます。

複数の会社が使用するアプリケーション

ログイン Web パネルが Web セッションにログインしたユーザーを設定するとします:
&Session.Set('UserID', str(&UserID))
また、ログインしているユーザーに応じて異なるデータベースに接続するものとします。
この目的のため、CONNECT という名前のプロシージャーを定義します。これは、 [ Before Connect ] モデルプロパティにおいて記述される必要があります。

JAVA の例

サンプル I

ルール
Parm(inout: &dbconn);
ソース
&UserID = val(&Session.Get('UserID')) 
Do Case
   Case &UserID = 1 
        &DataBase  = "companyone" 
   Case &UserID = 2 
        &DataBase  = "companytwo" 
   Otherwise 
        &DataBase  = "companyone" //default database 
EndCase

// Changing Default connection 
&dbconn = GetDatastore("Default") 
&dbconn.JDBCDriverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver" 
&dbconn.JDBCDriverURL = "jdbc:microsoft:sqlserver://MyServer:1433;databaseName=" + trim(&DataBase) + ";SelectMethod=cursor" 
&dbConn.UserName = 'username' 
&dbConn.UserPassword = 'userpassword' 
同じケースで JDBC ドライバーを使用する場合: 
&dbconn.JDBCDriverName = "net.sourceforge.jtds.jdbc.Driver"
&dbconn.JDBCDriverURL = "jdbc:jtds:sqlserver://MyServer:1433/"+ &database.Trim()

サンプル II

実行時に外部データソースと GeneXus 接続プールへの接続に変更する
ルール
Parm(inout: &dbconn);
ソース  
&dbconn = GetDatastore("Default")
 
if &Connection = 'JNDI'
   &dbconn.UseExternalDatasource = 1
   &dbconn.ExternalDatasourceName = 'java:/comp/env/jdbc/myoracle' 
else
   &dbconn.UseExternalDatasource = 0
   &dbconn.JDBCDriverName = "oracle.jdbc.driver.OracleDriver"
   &dbconn.JDBCDriverURL = "jdbc:oracle:thin:@Testorcl:1521:testorcl"
   &dbConn.UserName = &UserId.Trim()
   &dbConn.UserPassword = &UserPwd.Trim()
endif

.NET の例

ルール
Parm(inout: &dbconn);
ソース
&UserID = val(&Session.Get('UserID')) 
//select the Database depending on UserID 
Do Case
   Case &UserID = 1 
        &DataBase  = "companyone" 
   Case &UserID = 2 
        &DataBase  = "companytwo" 
   Otherwise 
        &DataBase  = "companyone" //default database 
EndCase

//Change connection properties 
&dbconn = GetDatastore("Default") 
&dbconn.UserName = 'username' 
&dbconn.UserPassword = 'userpassword'
&dbconn.ConnectionData = "DATABASE=" + &DataBase.Trim() //SQLServer 
//&dbconn.ConnectionData = "Data Source=" + &DataBase.Trim()  //MySQL

プロパティの変更の適用方法

プロパティに値を設定したときに、それに対応する変更を適用するには、任意のオブジェクトをビルドして *.config ファイルを生成します。

参考情報

DBConnection データタイプ
[ After connect ] プロパティ



バックリンク
[ After connect ] プロパティDBConnection データタイプJDBC データソースの定義
サブページ
Created: 14/09/18 03:46 by Admin Last update: 25/12/10 18:03 by Admin
カテゴリ
Powered by GXwiki 3.0