J'ai quelques questions fondamentales sur la façon dont les clients de bases de données et la base de données interagissent
PS: Je comprends que certains de ces détails varient d'une base de données à l'autre, mais je veux savoir en général comment les implémentations populaires telles que Postgres, Mysql, Oracle, SQL Server et DB2 les implémentent
Les bases de données prennent-elles en charge plusieurs transactions simultanément sur une seule connexion de base de données à partir du client?
Pour SQL Server, non.
Sinon, pourquoi pas? (car le multiplexage permettrait d'économiser sur la surcharge de ressources par connexion)
Cela compliquerait sérieusement le protocole réseau, qui doit être implémenté sur plusieurs plates-formes clientes, créant une source possible de bogues et de problèmes de performances.
Et la surcharge de ressources causée par plusieurs connexions est faible et largement atténuée par le pool de connexions, où un ensemble de connexions à longue durée de vie est partagé entre tous les threads d'un programme client.
Oracle
C'est un fait peu connu, que dans Oracle, on peut avoir 0, 1 ou même plusieurs sessions dans la même connexion TCP.
Ceci est discuté dans le livre Expert Oracle Database Architecture (ISBN 978-1-4302-6299-2, Authors: Kyte, Thomas, Kuhn, Darl) in Chapter 5 - Oracle Processes
.
https://books.google.com/books?id=NG4RpD8aLEIC&pg=PA17
Connexions vs sessions
Il surprend beaucoup de gens de découvrir qu'une connexion n'est pas synonyme de session. Aux yeux de la plupart des gens, ce sont les mêmes, mais la réalité est qu’ils n’ont pas à l'être. Une connexion peut avoir zéro, une ou plusieurs sessions établies sur elle. Chaque session est distincte et indépendante, même si elles partagent toutes la même connexion physique à la base de données. Une validation dans une session n'affecte aucune autre session sur cette connexion. En fait, chaque session utilisant cette connexion peut utiliser des identités d'utilisateur différentes! Dans Oracle, une connexion est simplement un circuit physique entre votre processus client et l'instance de base de données - une connexion réseau, le plus souvent. La connexion peut être établie avec un processus serveur dédié ou avec un répartiteur. Comme indiqué précédemment, une connexion peut avoir zéro ou plusieurs sessions, ce qui signifie qu'une connexion peut exister sans session correspondante.
Démo:
Connectez-vous à la base de données:
[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>
Dans une autre session, démarrée ailleurs, interrogez les sessions de BP:
SQL> select sid, process, port, paddr from v$session where username = 'BP';
SID PROCESS PORT PADDR
---------- ------------------------ ---------- ----------------
395 31251 35298 0000000066E75338
Activez maintenant le suivi automatique dans la session d'origine:
SQL> set autotrace on
Et vérifiez à nouveau les sessions, depuis l'autre session:
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
Nous avons 2 sessions, utilisant les mêmes processus client et serveur et la même TCP également (et c'est la partie habituellement surprenante). Maintenant, si nous disconnect
, mais quittons sqlplus en cours d'exécution lors de la première session:
SQL> disconnect
Disconnected from Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
SQL>
Et vérifiez à nouveau la base de données de l'autre session:
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
Nous avons toujours le processus de serveur de base de données, nous avons toujours le processus client, nous avons toujours une connexion TCP entre eux, mais nous avons 0 sessions qui leur sont associées. Une fois que vous quittez sqlplus avec exit
, c'est-à-dire lorsque les processus et la connexion se terminent:
SQL> exit
[Oracle@o71 ~]$
Et:
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 -
C'est donc possible, mais je n'ai jamais vu cela en pratique à part le livre ci-dessus et les démos construites sur cette base.
Le parallélisme auquel vous faites allusion au premier trimestre est survendu. Même lorsque vous pouvez faire des choses en parallèle, le système s'embourbe pour plusieurs raisons:
Les bases de données sont plus faciles à concevoir si vous vous arrêtez à la condition requise: les clients séparés ne doivent pas marcher les uns sur les autres. Ensuite, au sein d'un même client, il est plus facile de se concentrer sur une seule chose à la fois.
En savoir plus sur KISS.
Quant à la couche TCP - Vous avez la possibilité de concevoir un routeur qui peut réaliser ce que vous suggérez. Vous pourriez faire des millions. Mais il appartient à un bas niveau, pas dans le moteur de base de données.