【VBA×Oracle】DB接続数に上限はある?ADO経由での接続制限とその回避策を解説!

はじめに

VBAからOracleやSQL Serverなどのデータベースに接続していると、
「接続できなくなった」「動作が遅い」「突然 ‘接続制限に達しました’ のようなエラーが出た」
…という現象に遭遇したことはありませんか?
この記事では、VBA(ADO)からのDB接続数の上限や原因、各DBの制約と安定運用のための対処法を解説します。

VBA(ADO)からDBに接続する仕組み

VBAからOracleやSQL Serverに接続する場合、通常はADODB.Connectionオブジェクトを使います。

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Open "Provider=MSDAORA;Data Source=ORCL;User ID=ユーザー名;Password=パスワード"

この conn.Open のたびに、DBサーバーにセッションが1つ張られます。

接続上限の仕組み

  • 1. VBA自体には上限なし
    VBA(Access)には厳密な接続上限はありませんが、同時に大量のConnectionやRecordsetを開きっぱなしにするとリソース不足で不安定になります。
  • 2. 接続先DB(OracleやSQL Server)に上限あり
    Oracle: sessions パラメータで同時接続数の上限が決まっています(例:150セッション)。ADOからの接続も1セッションとしてカウントされます。

    SELECT value FROM v$parameter WHERE name = 'sessions';
    

    この上限を超えると、次のようなエラーが発生します:
    ORA-00018: maximum number of sessions exceeded
    ORA-12516: TNS: listener could not find available handler with matching protocol stack

  • 3. SQL Serverの場合
    user connections 設定で制限されます。

    SELECT @@MAX_CONNECTIONS
    

    接続が無駄に残るとリソース消費やロックの問題が発生します。

よくある原因と対策

原因 説明 対策
Connectionを開きっぱなし 使用後に閉じないとセッションが残る conn.Close+Set conn = Nothing を徹底
毎回新しいConnectionを作っている 同じ接続を再利用せず無限に増える 使い回し、またはConnection Poolingを検討
エラー時に接続が閉じられない On Error中にCloseしない 必ずCloseする構文にする

コーディングベストプラクティス(VBA側)

接続・切断の基本形

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

On Error GoTo ErrH

conn.Open "Provider=MSDAORA;Data Source=ORCL;User ID=user;Password=pass"

' ここでSQL実行など

conn.Close
Set conn = Nothing
Exit Sub

ErrH:
    MsgBox "エラー: " & Err.Description
    If Not conn Is Nothing Then
        If conn.State = adStateOpen Then conn.Close
        Set conn = Nothing
    End If

よくある質問(FAQ)

Q. 複数ユーザーが同じAccessアプリでOracleに接続しているとき、接続数は合算される?
→ はい。全ユーザーからの合計セッション数がOracle側の上限に影響します。共有DBでは注意が必要です。

Q. ADOは接続プールしてくれる?
→ OLE DB Providerが対応していれば有効。ただし「同一接続文字列で再利用」しないとプールは活きません。

まとめ

  • VBA(ADO)からの接続にはDB側の接続上限が適用される
  • 特にOracleでは sessions に注意
  • 接続の開きっぱなしは厳禁! 必ず Close+Set Nothing
  • ユーザー数が多いシステムでは、接続の使い回しや切断タイミングを意識的に設計することが重要

関連キーワード(SEO対策)

  • VBA DB接続数 上限
  • Oracle ADO セッション数
  • Access ADO 接続エラー
  • VBA SQL Server 最大接続数
  • ORA-00018 セッションエラー
  • ADO 接続切り忘れ 対策
  • VBA DB接続 パフォーマンス チューニング