接続の切替え
DBサーバとの接続を同時に複数確立して作業することができる.この際に必要な接続の切替えについて調査してみた.
接続を切替えるための構文は二種類ある.一つ目は現在(コード上の位置としての現在※)使用する接続を切替えるものである.
EXEC SQL SET CONNECTION 接続名;この文を実行した後は,指定した接続名の接続に対してSQL文が発行される.もう一つは上の文で設定する「現在の接続」はそのままに,そのSQL文のみに有効な指定を行うものである.
EXEC SQL AT 接続名 ...;今までのSQL文に「AT 接続名」を付加した形である.指定した接続名の接続に対して...のSQL文を発行する.
※ ecpgによる変換後のCコードを見ればわかるが,ecpgが行うのはやはり関数呼び出しの接続名の引数指定を切替えるだけである.すなわち接続の切替えというのは,純粋にecpgによる文字列変換に対する指定であり,エラー処理のためのコールバックの設定/重要な注意点と同じ注意が必要となる.
DBサーバとの接続を同時に複数もつ場合の多くは,接続毎に接続先DBサーバが異なると思うが,今回は一つのDBに複数の接続を張るサンプルを作成した.
このサンプルで複数の接続を同時に扱っているという確認は,出力文とトランザクションの隔離性(サンプルではREAD COMMITED)を利用する.実行してみた.
$> ./select-connection -d tcp:postgresql://dbserver/firstdb -u matsu -p hogefuga [16496]: ECPGdebug: set to 1 [16496]: ECPGconnect: opening database firstdb on dbserver port <DEFAULT> for user matsu [16496]: ECPGconnect: opening database firstdb on dbserver port <DEFAULT> for user matsu [16496]: ECPGexecute line 49: QUERY: create table hoge ( id integer , name char ( 8 ) ) on connection dbConnection1 [16496]: ECPGexecute line 49 Ok: CREATE [16496]: ECPGtrans line 50 action = commit connection = dbConnection1 [16496]: ECPGexecute line 52: QUERY: insert into hoge values( 1 , 'aaa' ) on connection dbConnection2 [16496]: ECPGexecute line 52 Ok: INSERT 990177 1 [16496]: ECPGexecute line 56: QUERY: select count (*) from hoge on connection dbConnection1 [16496]: ECPGexecute line 56: Correctly got 1 tuples with 1 fields [16496]: ECPGget_data line 56: RESULT: 0 offset: 4 array: 3 COUNT = 0 [16496]: ECPGexecute line 61: QUERY: select count (*) from hoge on connection dbConnection2 [16496]: ECPGexecute line 61: Correctly got 1 tuples with 1 fields [16496]: ECPGget_data line 61: RESULT: 1 offset: 4 array: 3 COUNT = 1 [16496]: ECPGtrans line 63 action = commit connection = dbConnection2 [16496]: ECPGexecute line 67: QUERY: select count (*) from hoge on connection dbConnection1 [16496]: ECPGexecute line 67: Correctly got 1 tuples with 1 fields [16496]: ECPGget_data line 67: RESULT: 1 offset: 4 array: 3 COUNT = 1 [16496]: ECPGexecute line 69: QUERY: delete from hoge on connection dbConnection1 [16496]: ECPGexecute line 69 Ok: DELETE 1 [16496]: ECPGexecute line 73: QUERY: select count (*) from hoge on connection dbConnection2 [16496]: ECPGexecute line 73: Correctly got 1 tuples with 1 fields [16496]: ECPGget_data line 73: RESULT: 1 offset: 4 array: 3 COUNT = 1 [16496]: ECPGtrans line 77 action = commit connection = dbConnection1 [16496]: ECPGexecute line 80: QUERY: drop table hoge on connection dbConnection2 [16496]: ECPGexecute line 80 Ok: DROP [16496]: ECPGtrans line 81 action = commit connection = dbConnection2 [16496]: ecpg_finish: Connection dbConnection1 closed. [16496]: ecpg_finish: Connection dbConnection2 closed.「on connection 接続名」という,どの接続でSQL文を発行したかが出力されている.さらにCOMMITされたかどうかによって,レコード数をカウントするSELECT文の結果が接続毎に異なることも確認できる.特に最後のDROPがdbConnection2で実行されていることに注意すること.この周りの処理の概要は以下である.
- EXEC SQL SET CONNECTION dbConnection2;
- EXEC SQL AT dbConnection1 ...;
- EXEC SQL DROP TABLE hoge;
AT 接続名による接続指定では「現在の接続」は切り替わらないということである.

