データベースクライアントとデータベースの相互作用について、いくつかの基本的な質問があります
PS:これらの詳細の一部はデータベースごとに異なることを理解していますが、Postgres、Mysql、Oracle、SQLサーバー、DB2などの一般的な実装がこれらをどのように実装するか一般的に知りたい
データベースは、クライアントからの単一のデータベース接続で同時に複数のトランザクションをサポートしますか?
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 -
したがって、それは可能ですが、上記の本とそれに基づいて構築されたデモを除いて、実際にはこれを見たことがありません。
Q1で指摘した並列処理は売られすぎです。並行して実行できる場合でも、システムは多くの理由で停止します。
必要な要件を満たせば、データベースの設計が簡単になります。個別のクライアントが互いに踏み込んではいけません。次に、単一のクライアント内で、一度に1つのことに集中する方が簡単です。
KISSについて学んでください。
TCPレイヤーについては-提案したことを達成できるルーターを設計する機会があります。何百万ものルーターを作成できます。しかし、それは低レベルに属しますnotデータベースエンジン内。