アプリケーションが実行時にデータベースにアクセスする直前に、接続プロパティを動的に変更するように Procedure オブジェクトを設定します。
ジェネレーター: .NET、
Java、
.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 ] モデルプロパティにおいて記述される必要があります。
ルール
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()
実行時に外部データソースと 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
ルール
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 ] プロパティ