Calender
Sun Mon Tue Wed Thu Fri Sat
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< September 2018 >>
広告
SEARCH

SELECTED ENTRIES
RECENT COMMENTS
RECENT TRACKBACK
CATEGORIES
ARCHIVES
LINKS
PROFILE
OTHERS
SKYPE
PC: skype.jojo.jp
chat
iPad: iphone.jojo.jp
chat call
THANKS



本日:
昨日:
多言語
広告
 ▼▲ 作業日報 ▼△
    What's under the hood?
<< 【スーパー銭湯】天風の湯(愛知県江南市) | main | 【温泉】喜多の湯_六条温泉(岐阜) >>
ADODB.Connection PostgreSQL接続セッション
 パススルー等で「CREATE TEMP TABLE」するとセッション期間中利用可能な一時テーブルが利用できますが、ウィンドウズからADODB.Connectionで生成したセッションの残り方を検証しました。

テストプログラム(vba)
  strConn = "DRIVER={PostgreSQL Unicode};DATABASE=db;SERVER=192.168.1.99;
              PORT=5432;UID=XX;PWD=XXX;"
  'If IsEmpty(conn) Then Set conn = CreateObject("ADODB.Connection")
  Set conn = CreateObject("ADODB.Connection")
  Set rs = CreateObject("ADODB.Recordset")
  On Error Resume Next
  '************************************
  conn.Open strConn
  rs.Open "select pg_backend_pid()", conn  'バックエンドプロセスID
  Debug.Print "(1).....PID:" & rs.Fields(0).Value
  '-----------------------
  conn.Execute "CREATE TEMP TABLE TTEST (fld1 integer,fld2 text);"
  '-----------------------
  Debug.Print IIf(Err.Number = 0, "create ok", Err.Description)
  Err.Clear
  rs.Close
  conn.Close    ' --------- closeでセッションが終わる訳ではない
  '************************************
  conn.Open strConn
  rs.Open "select pg_backend_pid()", conn 
  Debug.Print "(2).....PID:" & rs.Fields(0).Value
  '-----------------------
  conn.Execute "CREATE TEMP TABLE TTEST (fld1 integer,fld2 text);"
  '-----------------------
  Debug.Print IIf(Err.Number = 0, "create ok", Err.Description)
  Err.Clear
  rs.Close
  conn.Close
  '************************************
  'ADODB.Connectionを開放
  Set conn = Nothing
  Set conn = CreateObject("ADODB.Connection") '再生成してみる
  '************************************
  conn.Open strConn
  rs.Open "select pg_backend_pid()", conn
  Debug.Print "(3).....PID:" & rs.Fields(0).Value
  '-----------------------
  conn.Execute "CREATE TEMP TABLE TTEST (fld1 integer,fld2 text);"
  '-----------------------
  Debug.Print IIf(Err.Number = 0, "create ok", Err.Description)
  Err.Clear
  rs.Close
  conn.Close '  <--広域変数にしcloseしないとセッションの再利用可能
実行結果:
(1).....PID:2457
create ok
(2).....PID:2457
ERROR: relation "ttest" already exists;
Error while executing the query
(3).....PID:2458
create ok
 PostgreSQLのセッションはADODB.Connectionの場合、サーバ側のpostgresqlのQLへの接続ではセッションはサーバ側のワーカープロセス単位が残りWindows側との接続が切れない限り再利用されるようです。

セッションの残存期間は:
1.ADODB.Connectionオブジェクトのスコープ期間
2.Closeしても(1)接続文字列が同一&(2)同一オブジェクト&(3)接続が残っている(1分)以内であれば先のセッションが再利用される
3.時間的にはCloseした場合は1分、しなかった場合は10分以上残っていました(途中で計測やめましたので)上記のtempテーブルが残っていることで確認

 従ってADODB.Connectionを広域変数にし、CREATE TEMPORARY TABLE等で作業用を作成すると、ルーチン間でその値を使いまわすことができそうです。また逆に作業用テーブルの干渉が起きる可能性もあるかもしれません

 
| 開発関連 | 17:35 | comments(0) | trackbacks(0) |









http://blog.jojo.jp/trackback/1235214