web-dev-qa-db-ja.com

データベース接続とraw TCP接続

データベースクライアントとデータベースの相互作用について、いくつかの基本的な質問があります

  1. データベースは、クライアントからの単一のデータベース接続で同時に複数のトランザクションをサポートしますか?そうでない場合、なぜそうではないのですか? (多重化は接続ごとのリソースオーバーヘッドを節約するため、接続プールは数千の同時クエリを同時に実行する必要がある場合に競合の原因となり、多重化によって確実に回避されます)
  2. データベースクライアントのレベル接続と物理rawの関係はどうですかTCP接続。多対1 [多重化](または)1対1ですか?)多重化されていない場合、なぜでしょうか?
  3. 多重化されている場合、データベースサーバーはその端(または)複数の論理接続から単一の論理接続を維持しますか

PS:これらの詳細の一部はデータベースごとに異なることを理解していますが、Postgres、Mysql、Oracle、SQLサーバー、DB2などの一般的な実装がこれらをどのように実装するか一般的に知りたい

4
Ashok Koyi

データベースは、クライアントからの単一のデータベース接続で同時に複数のトランザクションをサポートしますか?

SQL Serverの場合、違います。

そうでない場合、なぜそうではないのですか? (多重化により、接続ごとのリソースのオーバーヘッドが節約されるため)

複数のクライアントプラットフォームに実装する必要のあるネットワークプロトコルが非常に複雑になり、バグやパフォーマンスの問題の原因となる可能性があります。

また、複数の接続によって発生するリソースオーバーヘッドは小さく、接続プールによって大幅に軽減されます。接続プールでは、長期間有効な一連の接続がクライアントプログラムのすべてのスレッド間で共有されます。

Oracle

あまり知られていない事実ですが、Oracleでは、まったく同じTCP接続で、0、1、またはそれ以上のセッションを持つことができます。

これは、本書 Expert Oracle Database Architecture (ISBN 978-1-4302-6299-2、Authors:Kyte、Thomas、Kuhn、Darl)のChapter 5 - Oracle Processesで説明されています。 。

https://books.google.com/books?id=NG4RpD8aLEIC&pg=PA170

接続とセッション

接続がセッションと同義ではないことを発見することは、多くの人々を驚かせます。ほとんどの人の目には同じですが、現実はそうである必要はありません。接続には、0、1、またはそれ以上のセッションが確立されている場合があります。 すべてのセッションがデータベースへの同じ物理接続を共有していても、各セッションは独立しています。 1つのセッションでのコミットは、その接続の他のセッションには影響しません。実際、その接続を使用する各セッションは異なるユーザーIDを使用する可能性があります!Oracleでは、接続はクライアントプロセスとデータベースインスタンスの間の物理的な回路にすぎません。接続は、専用サーバープロセスまたはディスパッチャへの接続です。前述のように、接続には0個以上のセッションが含まれる場合があり、対応するセッションがない接続が存在する可能性があります。

デモ:

データベースにログインします。

[Oracle@o71 ~]$ sqlplus bp/bp@\'localhost:1521/min18\'

SQL*Plus: Release 18.0.0.0.0 - Production on Thu Dec 27 21:20:03 2018
Version 18.4.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Last Successful login time: Thu Dec 27 2018 21:07:47 +01:00

Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

SQL>

別の場所で開始された別のセッションで、BPのセッションをクエリします。

SQL> select sid, process, port, paddr from v$session where username = 'BP';

       SID PROCESS                        PORT PADDR
---------- ------------------------ ---------- ----------------
       395 31251                         35298 0000000066E75338

元のセッションで自動トレースを有効にします。

SQL> set autotrace on

そして、他のセッションから、セッションを再度確認します。

SQL> select sid, process, port, paddr from v$session where username = 'BP';

       SID PROCESS                        PORT PADDR
---------- ------------------------ ---------- ----------------
       395 31251                         35298 0000000066E75338
       399 31251                         35298 0000000066E75338

SQL> !Sudo netstat -tanlp | grep 35298
tcp        0      0 127.0.0.1:35298         127.0.0.1:1521          ESTABLISHED 31251/sqlplus
tcp        0      0 127.0.0.1:1521          127.0.0.1:35298         ESTABLISHED 31253/oracleMIN18

2つのセッションがあり、同じクライアントおよびサーバープロセスと同じTCP接続も使用しています(通常、これは驚くべき部分です)。今、disconnect最初のセッションで実行されているsqlplus:

SQL> disconnect
Disconnected from Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
SQL>

そして、他のセッションからデータベースをもう一度確認します。

SQL> select sid, process, port, paddr from v$session where username = 'BP';

no rows selected

SQL> select spid from v$process where addr = '0000000066E75338';

SPID
------------------------
31253

SQL> !Sudo netstat -tanlp | grep 35298
tcp        0      0 127.0.0.1:35298         127.0.0.1:1521          ESTABLISHED 31251/sqlplus
tcp        0      0 127.0.0.1:1521          127.0.0.1:35298         ESTABLISHED 31253/oracleMIN18

SQL> select sid, process, port, paddr from v$session where paddr = '0000000066E75338';

no rows selected

データベースサーバープロセス、クライアントプロセス、TCP接続がまだありますが、それらに関連付けられているセッションはありません。exit、つまり、プロセスと接続が終了したときです。

SQL> exit
[Oracle@o71 ~]$

そして:

SQL> select spid from v$process where addr = '0000000066E75338';

no rows selected

SQL> !Sudo netstat -tanlp | grep 35298
tcp        0      0 127.0.0.1:35298         127.0.0.1:1521          TIME_WAIT   -

したがって、それは可能ですが、上記の本とそれに基づいて構築されたデモを除いて、実際にはこれを見たことがありません。

5
Balazs Papp

Q1で指摘した並列処理は売られすぎです。並行して実行できる場合でも、システムは多くの理由で停止します。

  • CPU /ネットワーク/ディスクI/Oなどのリソースのレンガ壁にぶつかる.
  • 「クリティカルセクション」と他のインターロックがあり、互いに踏み込むことを防ぎます。 「少数」の接続/トランザクション/などの場合、これは大した問題ではありません。しかし、数十でさえ、システムはそれ自体に著しくつまずき始めます。
  • 一部のマルチスレッドアプリケーションは、アルゴリズムの壁にぶつかります。ソートは古典的な例です。たぶん、100個のスレッドを起動して(そしてほぼ100倍のスピードアップで)大きなリストのアイテムを計算できますが、結果セットをソートする必要がある場合、アプリケーションはnotでそのフェーズで100倍近く高速化します。そして、配信するためにすべてのデータを単一のストリームに集める必要があります!

必要な要件を満たせば、データベースの設計が簡単になります。個別のクライアントが互いに踏み込んではいけません。次に、単一のクライアント内で、一度に1つのことに集中する方が簡単です。

KISSについて学んでください。

TCPレイヤーについては-提案したことを達成できるルーターを設計する機会があります。何百万ものルーターを作成できます。しかし、それは低レベルに属しますnotデータベースエンジン内。

3
Rick James