Top / TIPS / IIS と ORACLE の連携

oo4o のバージョンアップにより、旧コンテンツの内容とは、かなり違っていますのでご注意ください。

ASP で、ORACLE との連携を行うときに、注意すべき点を挙げておきます。

# いまさらASPでもないですが(^_^;)

Oracle 10.2G/oo4o v5.0/IIS 6.0 を前提にしています。


Global.asa

コネクションプーリングの機能をつかいましょう。
また、meta タグで oo4o のタイプライブラリを指定すると ORAPARAM_INPUT などの定数が使えるようになります。
Global.asa の記述は次のようになります。

<OBJECT RUNAT=Server SCOPE=Application ID=OraSession PROGID="OracleInProcServer.XOraSession"></OBJECT>
<!--METADATA TYPE="TypeLib" FILE="oip10.tlb" -->
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Option Explicit
Sub Application_OnStart()
    OraSession.CreateDatabasePool 1, 20, 200, "ORCL", "SCOTT/TIGER", 0
End Sub

Sub Application_OnEnd()
    OraSession.DestroyDatabasePool
End Sub
</SCRIPT>

古い ORACLE クライアントでは

■ マルチスレッド・プログラムにおいてアクセス違反が発生する
http://support.oracle.co.jp/krown_external/oisc_showDoc.do?id=16381

このような不具合があり、プーリング機能を使うのが定石となっていました。
その後、修正されたのですが

■ Oracle 9i でのマルチスレッド・アプリケーションの対応について
http://support.oracle.co.jp/krown_external/oisc_showDoc.do?id=30995

という情報も出ており、引き続きプーリング機能を使うことが推奨されています。

Common.asp

汎用的な処理を、まとめておいて、各コンテンツの先頭で INCLUDE しておくと、メンテナンスが容易です。
DB 接続オブジェクトを変数に格納したり、セキュリティを実装するロジックを書き込みます。
ファイルの拡張子は、不用意に中身を見られないよう、.inc などではなく、.asp にしておきます。

Common.asp

<% @LANGUAGE="VBScript" %>
<% Option Explicit %>
<%
'===============================================================================
'       共通初期処理
'===============================================================================
'   Oracle
Public gDB                   ' OraDatabase

    Set gDB = New COraDatabase

各コンテンツの記述

<!--#include file="./include/Common.asp"-->
<HTML>
<HEAD>
<%
'===============================================================================
'   コンテンツスクリプト処理
'===============================================================================
Dim objRec
   Set objRec = gDB.CreateDynaset("SELECT * FROM EMP", 0)
              ・
              ・
%>

トランザクション処理

OraDatabase オブジェクトの Connection プロパティに対し、BeginTrans などのトランザクション処理メソッドを実行してください。

OraDatabase オブジェクトをラップしたクラスを使おう

スクリプトが異常終了して、Parameter が削除されないまま残ってしまうと正常にプールに戻されないようです。
次のようなクラスを作成し、スクリプト終了後、破棄されるときに、Parameters を削除する処理を入れておきます。

Class COraDatabase
 
   Dim mConnection
   Dim mDatabase
 
   Private Sub Class_Initialize()
       Set mDatabase = OraSession.GetDatabaseFromPool(1000)
       Set mConnection = mDatabase.Connection
   End Sub
 
   Private Sub Class_Terminate()
       With mDatabase.Parameters
           Do While .Count > 0
               .Remove 0
           Loop
       End With
 
       mConnection.ResetTrans
 
       Set mConnection = Nothing
       Set mDatabase = Nothing
   End Sub
 
   Public Property Get CreateDynaset(sqlStmt, options)
       Set CreateDynaset = mDatabase.CreateDynaset(sqlStmt, options)
   End Property
 
   Public Sub BeginTrans()
       mConnection.BeginTrans
   End Sub
 
   Public Sub CommitTrans()
       mConnection.CommitTrans
   End Sub
 
   Public Sub Rollback()
       mConnection.Rollback
   End Sub
 
   Public Function ExecuteSQL(sqlStmt)
       ExecuteSQL = mDatabase.ExecuteSQL(sqlStmt)
   End Function
 
   Public Property Get Parameters
       Set Parameters = mDatabase.Parameters
   End Property
 
End Class

Value プロパティをかならずつけよう

ダイナセットを作成して、フィールドの値を参照する場合、かならず規定プロパティの Value をつけてください。 つけないで、フィールドの値を参照すると、固定長キャラクタのフィールドに、スペースがセットされていた場合、ASP-0115 が発生します。

   Dim objRec
   Dim objFields
   Set objRec = gRefDB.CreateDynaset(strSQL, 0)
   Set objFields = objRec.Fields
   Response.Write objFields("HOGE").Value

Session 変数にオブジェクトを格納しない

Session 変数に OraDatabase, OraDynaset などのオブジェクトを格納しないでください。
セッションが破棄されるのは、接続がなくなってから 20 分(デフォルトの値)ですが、その間、OraDatabase オブジェクトを占有し、ほかのセッションから使えなくなってしまいます。
データベースプールを使う意味がなくなってしまうのです。

セッションレスを検討する

できればIISの構成をセッションレスにしてください。
イントラネットや会員制のコンテンツなど、限定された使い方をするならともかく、インターネットに公開するような場合、ツールによるアクセスも考えられます。

それが Cookie に非対応なツールであった場合、セションが増え続けてしまいます。

CreateDynaset は ORADYN_NOCACHE で

ORADYN_NOCACHE オプションで OraDynaset を開くと、テンポラリフォルダに OIP-xxxx というワークファイルを作成しなくなります。
できる限り使用したほうが良いでしょう。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2010-12-12 (日) 00:59:07 (2440d)