Что означает создание соединения между приложением и базой данных? - PullRequest
1 голос
/ 23 марта 2019

Когда мы говорим, что создали соединение между базой данных и приложением (которое может храниться в пуле соединений), что на самом деле означает здесь «соединение»?

  • Имеет ли это какое-либо отношение к установлению TCP/ TLS соединения?

  • Загружает ли схема базы данных при каждом соединении?

  • Что происходит с соединением (которое уже загружено в пул соединений приложения), когда изменяется схема базы данных и происходит активная транзакция?

Ответы [ 3 ]

0 голосов
/ 23 марта 2019

Проще говоря.«Соединение с базой данных» - это связь между процессом приложения и процессом обслуживания базы данных.

Клиентская сторона:
Когда вы создаете соединение, ваше приложение хранит такую ​​информацию, как: какой адрес базы данных, какой сокет используется для соединения, какой процесс сервера отвечает за обработку вашегозапросы и т. д. Эта информация зависит от реализации драйвера соединения и отличается от базы данных к базе данных.

Сторона сервера:
Когда поступает запрос от клиентского приложения, база данных выполняет аутентификациюавторизация клиента и создание нового процесса или потока, который отвечает за его обслуживание.Реализация и данные, загружаемые этим серверным процессом, также зависят от поставщика и отличаются от базы данных к базе данных.
Этот процесс «подготовки» базы данных для обслуживания нового клиента занимает достаточно много времени, и именно здесь появляются пулы соединений.help.

Пул соединений:
Пул соединений в основном используется для уменьшения необходимости открытия новых соединений и потери времени на аутентификацию, авторизацию, создание процесса сервера и т. д. Он позволяет уже использовать повторноустановленные соединения.
Что происходит с соединением (которое уже загружено в пул соединений приложения), когда изменяется схема базы данных и происходит активная транзакция?
Прежде всего, база данных не знает ни о какихподключение пулов.Для базы данных это функция на стороне клиента.Что происходит, также зависит от конкретной базы данных и ее реализации.Обычно базы данных имеют механизм блокировки, который предотвращает изменение объектов, пока они еще используются, и наоборот.

0 голосов
/ 24 марта 2019

«Соединение» - это не что иное, как детали a Socket, с дополнительными сведениями (такими как имя пользователя, пароль и т. Д.). Каждое соединение имеет свое гнездо.

Например:

Соединение 1:

Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]

Соединение 2:

Socket[addr=localhost/127.0.0.1,port=1030,localport=51246]

Я создал два соединения в одном процессе JVM, чтобы продемонстрировать, как сервер знает, в каком Socket должен быть отправлен ответ. Сокет , если я определяю в терминах UNIX, это специальный файл , который используется для межпроцессного взаимодействия:

srwxr-xr-x. 1 root root 0 Mar  3 19:30 /tmp/somesocket

Когда создается сокет (то есть, когда создается этот специальный файл сокетов; как создать сокет? и this ) операционная система создает дескриптор файла, который указывает на этот файл.Сервер различает Сокет по следующим атрибутам: Ссылка

{SRC-IP, SRC-PORT, DEST-IP, DEST-PORT, PROTOCOL}

PROTOCOL: Я использовал postgres в качестве примера, подключение сокета в драйвере postgres выполняется с помощьюSocksSocketImpl, то есть TCP socket implementation (RFC 1928)

Возвращаясь к двум созданным мною соединениям, если вы внимательно присмотритесь к localport для обоих соединений, то сервер четко понимает, куда он должен отправитьответить назад.

Теперь существуют ограничения на количество файлов (или файловых дескрипторов), которые вы можете открыть в операционной системе, поэтому рекомендуется не допускать зависания ваших соединений (так называемая утечка соединений)

Загружает ли она схему базы данных при каждом соединении?

Ответ: Нет, это ResultSet, который заботится об этом.

Что происходит ссоединение при изменении схемы базы данных

Ответ: Схема соединения и базы данных - это разные вещи.Соединение просто определяет, как общаться с другим процессом.Схема базы данных - это контракт между приложением и базой данных, приложение может выдавать ошибки, если контракт нарушен, или оно может просто игнорировать его.


Если вы заинтересованы в копании большего количества данных, вам следует добавить точку останова.к объекту подключения и ниже, как он выглядит (см. FileDescriptor )

connection = {Jdbc4Connection@777} 
args = {String[0]@776} 
connection = {Jdbc4Connection@777} 
 _clientInfo = null
 rsHoldability = 2
 savepointId = 0
 logger = {Logger@778} 
 creatingURL = "dbc:postgresql://localhost:1030/postgres"
  value = {char[40]@795} 
  hash = 0
 openStackTrace = null
 protoConnection = {ProtocolConnectionImpl@780} 
  serverVersion = "10.7"
  cancelPid = 19672
  cancelKey = 1633313435
  standardConformingStrings = true
  transactionState = 0
  warnings = null
  closed = false
  notifications = {ArrayList@796}  size = 0
  pgStream = {PGStream@797} 
   host = "localhost"
   port = 1030
   _int4buf = {byte[4]@802} 
   _int2buf = {byte[2]@803} 
   connection = {Socket@804} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
    created = true
    bound = true
    connected = true
    closed = false
    closeLock = {Object@811} 
    shutIn = false
    shutOut = false
    impl = {SocksSocketImpl@812} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
     server = null
     serverPort = 1080
     external_address = null
     useV4 = false
     cmdsock = null
     cmdIn = null
     cmdOut = null
     applicationSetProxy = false
     impl = {DualStackPlainSocketImpl@814} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
      exclusiveBind = true
      isReuseAddress = false
      timeout = 0
      trafficClass = 0
      shut_rd = false
      shut_wr = false
      socketInputStream = {SocketInputStream@819} 
       eof = false
       impl = {DualStackPlainSocketImpl@814} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
       temp = null
       socket = {Socket@804} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
        created = true
        bound = true
        connected = true
        closed = false
        closeLock = {Object@811} 
        shutIn = false
        shutOut = false
        impl = {SocksSocketImpl@812} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
         server = null
         serverPort = 1080
         external_address = null
         useV4 = false
         cmdsock = null
         cmdIn = null
         cmdOut = null
         applicationSetProxy = false
         impl = {DualStackPlainSocketImpl@814} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
         timeout = 0
         trafficClass = 0
         shut_rd = false
         shut_wr = false
         socketInputStream = null
         socketOutputStream = null
         fdUseCount = 0
         fdLock = {Object@815} 
         closePending = false
         CONNECTION_NOT_RESET = 0
         CONNECTION_RESET_PENDING = 1
         CONNECTION_RESET = 2
         resetState = 0
         resetLock = {Object@816} 
         stream = false
         socket = null
         serverSocket = null
         fd = {FileDescriptor@817} 
         address = null
         port = 0
         localport = 0
        oldImpl = false
       closing = false
       fd = {FileDescriptor@817} 
        fd = 1260
        handle = -1
        parent = {SocketInputStream@819} 
         eof = false
         impl = {DualStackPlainSocketImpl@814} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
         temp = null
         socket = {Socket@804} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
         closing = false
         fd = {FileDescriptor@817} 
          fd = 1260
          handle = -1
          parent = {SocketInputStream@819} 
           eof = false
           impl = {DualStackPlainSocketImpl@814} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
            exclusiveBind = true
            isReuseAddress = false
            timeout = 0
            trafficClass = 0
            shut_rd = false
            shut_wr = false
            socketInputStream = {SocketInputStream@819} 
            socketOutputStream = {SocketOutputStream@820} 
            fdUseCount = 0
            fdLock = {Object@821} 
            closePending = false
            CONNECTION_NOT_RESET = 0
            CONNECTION_RESET_PENDING = 1
            CONNECTION_RESET = 2
            resetState = 0
            resetLock = {Object@822} 
            stream = true
            socket = {Socket@804} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
            serverSocket = null
            fd = {FileDescriptor@817} 
            address = {Inet4Address@823} "localhost/127.0.0.1"
            port = 1030
            localport = 51099
           temp = null
           socket = {Socket@804} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
           closing = false
           fd = {FileDescriptor@817} 
           path = null
           channel = null
           closeLock = {Object@826} 
           closed = false
          otherParents = {ArrayList@833}  size = 2
          closed = false
         path = null
         channel = null
         closeLock = {Object@826} 
         closed = false
        otherParents = {ArrayList@833}  size = 2
        closed = false
       path = null
       channel = null
       closeLock = {Object@826} 
       closed = false
      socketOutputStream = {SocketOutputStream@820} 
       impl = {DualStackPlainSocketImpl@814} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
       temp = {byte[1]@843} 
       socket = {Socket@804} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
       closing = false
       fd = {FileDescriptor@817} 
       append = false
       channel = null
       path = null
       closeLock = {Object@844} 
       closed = false
      fdUseCount = 0
      fdLock = {Object@821} 
      closePending = false
      CONNECTION_NOT_RESET = 0
      CONNECTION_RESET_PENDING = 1
      CONNECTION_RESET = 2
      resetState = 0
      resetLock = {Object@822} 
      stream = true
      socket = {Socket@804} "Socket[addr=localhost/127.0.0.1,port=1030,localport=51099]"
      serverSocket = null
      fd = {FileDescriptor@817} 
      address = {Inet4Address@823} "localhost/127.0.0.1"
      port = 1030
      localport = 51099
     timeout = 0
     trafficClass = 0
     shut_rd = false
     shut_wr = false
     socketInputStream = null
     socketOutputStream = null
     fdUseCount = 0
     fdLock = {Object@815} 
     closePending = false
     CONNECTION_NOT_RESET = 0
     CONNECTION_RESET_PENDING = 1
     CONNECTION_RESET = 2
     resetState = 0
     resetLock = {Object@816} 
     stream = false
     socket = null
     serverSocket = null
     fd = {FileDescriptor@817} 
     address = null
     port = 0
     localport = 0
    oldImpl = false
   pg_input = {VisibleBufferedInputStream@805} 
   pg_output = {BufferedOutputStream@806} 
   streamBuffer = null
   encoding = {Encoding@807} "UTF-8"
   encodingWriter = {OutputStreamWriter@808} 
  user = "postgres"
  database = "postgres"
  executor = {QueryExecutorImpl@800} 
  logger = {Logger@778} 
 compatible = "9.0"
 dbVersionNumber = "10.7"
 commitQuery = {SimpleQuery@783} "COMMIT"
 rollbackQuery = {SimpleQuery@784} "ROLLBACK"
 _typeCache = {TypeInfoCache@785} 
 prepareThreshold = 5
 autoCommit = true
 readOnly = false
 bindStringAsVarchar = true
 firstWarning = null
 timestampUtils = {TimestampUtils@786} 
 typemap = null
 fastpath = null
 largeobject = null
 metadata = null
 copyManager = null
0 голосов
/ 23 марта 2019

Здесь соединение, о котором вы говорите, означает функцию открытия, которую приложение вызывает для открытия и чтения / изменения / удаления базы данных или ее потомков.

Например, если мы говорим о файле PHP (используется для загрузки запросов веб-сайтов на сервер, например, HTML) или файле HTML, где вы входите на страницу с именем: https://example.com/login.php (PHP) или https://example.com/login.html (HTML), и странице требуется доступ к базе данных пользователей, чтобы проверить правильность введенных учетных данных, если заданы значения (например, для username: «demoUser» и пароль: «password * 1234»), существуют в базе данных в виде строк в конкретной таблице. База данных может содержать бесконечные таблицы и бесконечные строки внутри. Пример простой базы данных только с одной таблицей под названием Users: username | password | date_created // Столбцы таблицы

"demoUser" | "password" | "23-03-2019" // Пример показанный выше

"user1213" | "passw0rd" | "04-02-2019" // Второй пользовательский пример затем здесь выше, если приложению необходимо проверить, существует ли значение в этой базе данных, операционная система приложения получит доступ к базе данных с помощью простого файла, считывающего файл , обычно файл с расширением .db , и затем он будет читать каждый строки для поиска значений.

Для этого код на страницах login.php / login.html вызывает сервер, который запускает файл, и сервер открывает базу данных, а затем сервер принимает запрос (какой запрос кода нужно проверить в базе данных), и выполнить его, как если бы база данных была простым файлом с (например, :) .db. Соединение здесь выступает как запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...