Основные средства доступа к серверам баз данных
Подключение к серверу БД
Клиент-серверные СУБД, как правило, представляют клиентам несколько разных способов подключения, среди которых именованные каналы, сокеты, сетевые порты. Последние являются основным способом взаимодействия приложения и сервера баз данных. Номера зарегистрированных портов для распространенных СУБД можно посмотреть в файле /etc/services (cat /etc/services | grep sql
, листинг 1).
Листинг 1. Зарегистрированные порты клиент-серверных СУБД
sql*net 66/tcp # Oracle SQL*NET sql*net 66/udp # Oracle SQL*NET sqlserv 118/tcp # SQL Services sqlserv 118/udp # SQL Services sql-net 150/tcp # SQL-NET sql-net 150/udp # SQL-NET sqlsrv 156/tcp # SQL Service sqlsrv 156/udp # SQL Service mini-sql 1114/tcp # Mini SQL mini-sql 1114/udp # Mini SQL mysql-cluster 1186/tcp # MySQL Cluster Manager mysql-cluster 1186/udp # MySQL Cluster Manager ms-sql-s 1433/tcp # Microsoft-SQL-Server ms-sql-s 1433/udp # Microsoft-SQL-Server ms-sql-m 1434/tcp # Microsoft-SQL-Monitor ms-sql-m 1434/udp # Microsoft-SQL-Monitor sybase-sqlany 1498/tcp # Sybase SQL Any sybase-sqlany 1498/udp # Sybase SQL Any unisql 1978/tcp # UniSQL unisql 1978/udp # UniSQL unisql-java 1979/tcp # UniSQL Java unisql-java 1979/udp # UniSQL Java mysql-im 2273/tcp # MySQL Instance Manager mysql-im 2273/udp # MySQL Instance Manager mysql 3306/tcp # MySQL mysql 3306/udp # MySQL ssql 3352/tcp # Scalable SQL ssql 3352/udp # Scalable SQL postgresql 5432/tcp # PostgreSQL Database postgresql 5432/udp # PostgreSQL Database sqlexec 9088/tcp # IBM Informix SQL Interface sqlexec 9088/udp # IBM Informix SQL Interface sqlexec-ssl 9089/tcp # IBM Informix SQL Interface - Encrypted sqlexec-ssl 9089/udp # IBM Informix SQL Interface - Encrypted
Клиент СУБД
Всю работу клиентского приложения с сервером БД можно свести к выполнению трех задач: подключение к серверу, отправка запросов и получение результатов, отключение. Эти и прочие функции доступны клиентскому приложению через API сервера баз данных. Функции API, доступные клиенту, описаны в документации соответствующей СУБД. В листинге 2 приведен пример использования API MySQL в программе на языке C.
Листинг 2. Пример MySQL-клиента на языке C
#include <stdio.h> #include <stdlib.h> #include "mysql.h" // подключение API MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; void exiterr(int exitcode) { fprintf(stderr, "%s\n", mysql_error(&mysql)); exit(exitcode); } int main() { uint i = 0; if (!(mysql_connect(&mysql,"host","username","password"))) // соединение с БД exiterr(1); if (mysql_select_db(&mysql,"payroll")) exiterr(2); if (mysql_query(&mysql,"SELECT name,rate FROM emp_master")) // запрос exiterr(3); // обработка ответа if (!(res = mysql_store_result(&mysql))) exiterr(4); while((row = mysql_fetch_row(res))) { for (i=0 ; i < mysql_num_fields(res); i++) printf("%s\n",row[i]); } if (!mysql_eof(res)) exiterr(5); mysql_free_result(res); mysql_close(&mysql); // отключение }
Постоянные соединения с сервером БД
Операции открытия и закрытия соединения с БД привносят дополнительные накладные расходы в процесс взаимодействия клиентского приложения и сервера БД. Снизить их можно путем установления постоянного соединения (permanent connection) с базой данных. В этом случае соединение, открытое специальной функцией API, удерживается в этом состоянии для будущего использования. При повторном обращении к этому же серверу тем же пользователем (с логином и паролем, указанными при первом подключении) СУБД вернет дескриптор ранее открытого соединения.
Пример установления постоянного подключения к СУБД MySQL приведен в листинге 3.
Листинг 3. Постоянное подключение к MySQL из PHP-скрипта
<?php $link = mysql_pconnect("localhost", "username", "password") or die("Could not connect: " . mysql_error()); print ("Connected successfully"); ?>
Ограничения
Использование API СУБД в клиентских приложениях простой, но не всегда подходящий способ. При переходе с одной СУБД на другую это потребует переписывания кода клиентов. Более прозрачным работу с базами данных делает применение промежуточного программного обеспечения или использование унифицированных интерфейсов прикладного программирования (ODBC, JDBC и др.).
CC-BY-CA Анатольев А.Г., 31.01.2012