C подключиться к oracle db

Обновлено: 05.07.2024

У вас есть несколько различных вариантов подключения вашего приложения к базе данных.

3.1.1 Создание и завершение среды

Вся обработка OCCI происходит внутри класса Environment. Среда OCCI предоставляет режимы приложений и определяемые пользователем функции управления памятью. В примере 3-1 показано, как создать среду OCCI.

Все объекты OCCI, созданные с помощью методов create xxx() (соединения, пулы соединений, операторы), должны быть явно завершены. При необходимости вы также должны явно завершить работу среды. В примере 3-2 показано, как завершить среду OCCI.

Кроме того, среда OCCI должна иметь область действия, превышающую область действия следующих типов объектов, созданных в этой среде: Agent , Bytes , Date , Message , IntervalDS , IntervalYM , Subscription и Timestamp . Это правило не применяется к объектам BFile , Blob и Clob, как показано в примере 3-3.

Если приложению требуется доступ к объектам в глобальной области, таким как статические или глобальные переменные, эти объекты должны быть установлены в NULL до завершения работы среды. В предыдущем примере, если b была глобальной переменной, вызов b.setNull() должен быть выполнен перед вызовом terminateEnvironment().

Вы можете использовать параметр режима метода createEnvironment(), чтобы указать, что ваше приложение:

Выполняется в многопоточной среде ( THREADED_MUTEXED или THREADED_UNMUTEXED )

Использует объекты ( OBJECT )

Режим можно установить независимо в каждой среде.

Пример 3-1. Как создать среду OCCI

Пример 3-2. Как завершить среду OCCI

Пример 3-3. Как использовать область окружения с объектами Blob

3.1.2 Открытие и закрытие соединения

Класс Environment — это фабричный класс для создания объектов Connection. Сначала вы создаете экземпляр среды, а затем используете его, чтобы пользователи могли подключаться к базе данных с помощью метода createConnection().

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

Вы должны использовать метод terminateConnection(), показанный в следующем примере кода, чтобы явно закрыть соединение в конце рабочего сеанса. Кроме того, среда OCCI должна быть явно завершена.

Вы должны помнить, что все объекты (Ref, Bfile, Producer, Consumer и т. д.), созданные или названные в экземпляре Connection, должны находиться во внутренней области этого экземпляра; область этих объектов должна быть явно завершена до того, как соединение будет завершено. В примере 3-5 показано, как завершить соединение и среду.

Пример 3-4. Как создать среду, а затем подключиться к базе данных

Пример 3-5. Как разорвать соединение с базой данных и средой

3.1.3 О поддержке подключаемых баз данных

Мультитенантная архитектура позволяет базе данных Oracle содержать переносимый набор схем, объектов схемы и объектов, не являющихся схемами, которые отображаются для клиента Oracle как отдельная база данных. Многопользовательская контейнерная база данных (CDB) — это база данных Oracle, включающая одну или несколько подключаемых баз данных (PDB).

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

Руководство администратора базы данных Oracle для получения дополнительной информации о PDB и дополнительных сведений о настройке служб для подключения к различным PDB

Руководство программиста по интерфейсу вызовов Oracle для получения информации об ограничениях при работе с PDB.

3.2 О соединениях пула

В этом разделе обсуждается, как использовать функцию пула соединений OCCI. Рассматриваемая информация включает следующие темы:

Основное различие между ними заключается в том, что StatelessConnectionPools используются для приложений, которые не зависят от соображений состояния; эти приложения могут извлечь выгоду из улучшений производительности, доступных за счет использования соединений с предварительной аутентификацией.

3.2.1 Об использовании пулов соединений

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

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

3.2.1.1 Создание пула соединений

Чтобы создать пул соединений, вы используете метод createConnectionPool(), как показано в примере 3-6.

В примере 3-6 используются следующие параметры:

poolUserName : владелец пула соединений

poolPassword : пароль для доступа к пулу соединений

connectString : имя базы данных, указывающее сервер базы данных, с которым связан пул соединений

minConn : минимальное количество соединений, которые будут открыты при создании пула соединений.

maxConn : максимальное количество соединений, которые может поддерживать пул соединений. Когда в пуле соединений открыто максимальное количество соединений, и все соединения заняты, вызов метода OCCI, которому требуется соединение, ожидает, пока он не получит его, если только для пула соединений не был вызван setErrorOnBusy()

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

Пример 3-7 демонстрирует, как можно создать пул соединений.

Вы также можете настроить все эти атрибуты динамически. Это позволяет вам разработать приложение, которое имеет возможность считывать текущую нагрузку (количество открытых соединений и количество занятых соединений) и соответствующим образом настраивать эти атрибуты. Кроме того, вы можете использовать метод setTimeOut() для тайм-аута соединений, которые простаивают дольше указанного времени. OCCI периодически прерывает незанятые соединения, чтобы поддерживать оптимальное количество открытых соединений.

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

Пример 3-6. Метод createConnectionPool()

Пример 3-7. Как создать пул соединений

3.2.1.2 Создание прокси-соединений

Если вы разрешаете пользователю пула соединений действовать в качестве прокси для других соединений, то для входа в базу данных пользователей, использующих соединения в пуле соединений, пароль не требуется.

Прокси-соединение можно создать с помощью любой из следующих двух версий метода createProxyConnection(), показанных в примере 3-8.

В предыдущем примере метода используются следующие параметры:

roles[] : массив roles определяет список ролей, которые будут активированы после активации прокси-соединения для клиента

Connection::ProxyType proxyType = Connection::PROXY_DEFAULT : В перечислении Connection::ProxyType перечислены константы, представляющие различные способы достижения аутентификации прокси. PROXY_DEFAULT используется для указания того, что имя представляет имя пользователя базы данных и является единственным поддерживаемым в настоящее время режимом проверки подлинности прокси-сервера.

Пример 3-8. Метод createProxyConnection()

3.2.2 Использование пула соединений без сохранения состояния

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

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

Некоторые соединения в пуле могут быть помечены особыми свойствами. Пользователь может запросить подключение по умолчанию, установить определенные атрибуты, такие как настройки поддержки глобализации, затем пометить его и вернуть в пул. Когда требуется соединение с одинаковыми атрибутами, можно сделать запрос на соединение с тем же тегом, и можно повторно использовать одно из нескольких соединений в пуле с одним и тем же тегом. Тег соединения можно изменить или сбросить.

Прокси-подключения также можно создавать и поддерживать через интерфейс пула подключений без сохранения состояния.

Пулинг подключений без сохранения состояния улучшает масштабируемость приложений среднего уровня за счет мультиплексирования подключений. Однако соединения из StatelessConnectionPool не следует использовать для длинных транзакций, так как удержание соединений в течение длительного времени снижает параллелизм.

OCCI не проверяет правильность пары тег-соединение. Вы несете ответственность за то, чтобы соединения с разными свойствами на стороне клиента не имели одинаковый тег.

Ваше приложение должно фиксировать или откатывать любые открытые транзакции перед возвратом соединения в пул. Если этого не сделать, Oracle автоматически фиксирует все открытые транзакции при разрыве соединения.

Существует два типа пулов соединений без сохранения состояния:

Однородный пул — это пул, в котором все соединения аутентифицируются с помощью имени пользователя и пароля, предоставленных при создании пула. Таким образом, все соединения имеют одинаковый контекст проверки подлинности. Прокси-подключения в таких пулах запрещены.

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

Пример 3-9 иллюстрирует базовый сценарий использования пулов соединений. В примере 3-10 представлен сценарий использования для создания и использования однородного пула соединений без сохранения состояния, а в примере 3-11 рассматривается использование разнородных пулов.

Пример 3-9. Как использовать StatelessConnectionPool

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

При создании пула открывается пять соединений:

Используя методы get[AnyTagged][Proxy]Connection(), пользователь использует все 5 открытых соединений:

Когда пользователю нужно другое подключение, пул открывает 2 новых подключения и возвращает одно из них пользователю.

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

Пользователь также может изменить параметры пула после его создания с помощью вызова метода setPoolSize().

Если создается гетерогенный пул, аргументы incrConn и minConn игнорируются.

Пример 3-10. Как создать и использовать однородный пул соединений без сохранения состояния

Чтобы создать однородный пул соединений без сохранения состояния, выполните следующие основные шаги и команды псевдокода:

Создайте пул соединений без сохранения состояния в режиме HOMOGENEOUS среды с помощью вызова createStatelessConnectionPool().

Получить новое или существующее соединение из пула, вызвав метод getConnection().

Во время выполнения этого вызова в пуле выполняется поиск соединения с соответствующим тегом. Если такое соединение существует, оно возвращается пользователю. В противном случае возвращается нетегированное соединение, аутентифицированное с помощью имени пользователя и пароля пула.

В качестве альтернативы вы можете установить соединение с помощью вызова getAnyTaggedConnection(). Он возвращает соединение с несовпадающим тегом, если ни совпадающий тег, ни соединения с тегом NULL недоступны. Вы должны проверить тег, возвращаемый вызовом getTag() в Connection .

Использовать соединение.

Отключить соединение с StatelessConnectionPool с помощью вызова releaseConnection().

Пустой тег "" удаляет тег Connection .

У вас есть возможность получить соединение из StatelessConnectionPool, используя то же значение параметра тега в вызове getConnection().

Вместо того, чтобы возвращать Connection в StatelessConnectionPool, вы можете уничтожить его с помощью вызова terminateConnection().

Уничтожить пул с помощью вызова aterminateStatelessConnectionPool() объекта Environment.

Пример 3-11. Как создать и использовать гетерогенный пул соединений без сохранения состояния

Чтобы создать разнородный пул соединений без сохранения состояния, выполните следующие основные шаги и команды псевдокода:

Создайте пул подключений без сохранения состояния в ГЕТЕРОГЕННОМ режиме среды с помощью вызова createStatelessConnectionPool().

Если вы включаете внешнюю аутентификацию, вы также должны активировать режим USES_EXT_AUTH в вызове createStateStatelessConnectionPool().

Получите новое или существующее соединение из пула, вызвав метод getConnection() пула StatelessConnectionPool, который перегружен для параметра гетерогенного пула.

Во время выполнения этого вызова в гетерогенном пуле выполняется поиск соединения с совпадающим тегом. Если такое соединение существует, оно возвращается пользователю. В противном случае возвращается должным образом аутентифицированное нетегированное соединение с тегом NULL.

Кроме того, вы можете получить подключение с помощью вызова getAnyTaggedConnection(), который был перегружен для гетерогенных пулов. Он возвращает соединение с несовпадающим тегом, если ни совпадающий тег, ни соединения с тегом NULL недоступны. Вы должны проверить тег, возвращаемый вызовом getTag() в Connection .

Вы также можете использовать прокси-соединения с помощью вызовов getProxyConnection() или getAnyTaggedProxyConnection() в StatelessConnectionPool .

Если пул поддерживает внешнюю аутентификацию, используйте следующий вызов getConnection():

Использовать соединение.

Отключить соединение с StatelessConnectionPool с помощью вызова releaseConnection().

Пустой тег "" удаляет тег Connection .

У вас есть возможность получить соединение из StatelessConnectionPool, используя то же значение параметра тега в вызове getConnection().

Вместо того, чтобы возвращать Connection в StatelessConnectionPool, вы можете уничтожить его с помощью вызова terminateConnection().

Уничтожить пул с помощью вызова terminateStatelessConnectionPool() объекта Environment.

3.2.3 О пуле резидентных подключений к базе данных

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

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

Архитектура резидентного пула подключений к базе данных очень похожа на выделенную модель по умолчанию для подключения к экземпляру базы данных Oracle; однако это устраняет накладные расходы, связанные с назначением определенного сервера для каждого соединения. На уровне сервера большинство подключений неактивны в любой момент времени, и каждое из этих подключений потребляет память. Поэтому системы баз данных, поддерживающие большие объемы подключений, сталкиваются с риском быстрого исчерпания всей доступной памяти. Пул резидентных подключений к базе данных позволяет использовать для подключения выделенный сервер, который сочетает в себе серверный процесс Oracle и пользовательский сеанс. Как только подключение становится неактивным, оно возвращает свои ресурсы в пул для использования аналогичными подключениями.

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

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

Обратите внимание, что клиенты, поддерживающие подключения из резидентного пула подключений базы данных, постоянно подключены к фоновому процессу посредника подключений. Посредник подключений реализует функциональность пула и мультиплексирует входящие клиентские подключения к пулу выделенных серверных процессов. Клиенты, которые не используют пул соединений, вместо этого используют процессы выделенного сервера.

Oracle Database Concepts для получения подробной информации об архитектуре резидентного пула соединений с базой данных

Руководство администратора базы данных Oracle для получения подробной информации о настройке пула резидентных подключений к базе данных

Читайте также: