Главная » Java, JavaBeans » Поддержка JDBC EJB

0

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

Inprise-Контейнер EJB реализует интерфейс DataSource JDBC 2.0. Это означает, что Компонент может использовать интерфейс javax.sql.DataSource, а не javax.sql.DriverManager, хотя интерфейс DriverManager все еще поддерживается для совместимости с предыдущими версиями.

Рекомендуется использовать интерфейс DataSource вследствие его более высокой производительности. Работа с этим интерфейсом не требует наличия драйверов JDBC 2.x; приложение может использовать существующие драйвера JDBC 1.x. Кроме того, при замене драйвера JDBC 1.x на JDBC 2.x, в приложение не требуется вносить никаких изменений.

Чтобы ваш Компонент использовал интерфейс DataSource (или использовал его в режиме СМР), вам необходимо указать параметры источника данных в Дескрипторе Поставки, и Компонент должен использовать средства JNDI. Взаимодействие с JNDI и конфигурирование источников данных берет на себя Контейнер. Пример Кода 8.2 показывает, как вы могли бы использовать источники данных в программе.

Пример Кода 8.2 Использование DataSource в программе

javax.sql.DataSource ds;

try {

javax.naming.Context ctx = (javax.naming.Context) new

j avax.naming.InitialContext(); ds = (javax.sql.DataSource)ctx.lookup(java:comp/jdbc/ SavingsDataSource"); } catch (javax.naming.NamingException exp){ exp.printStackTrace();

}

Задание DataSource

<username>scott</username> <password>tiger</password>

<driver-class-name >oracle.j dbc.driver.OracleDriver</driver- class-name>

</datasource> </deployment-descriptor> Если вы для установки соединения с базой данных используете интерфейс DriverManager, а не DataSource, то вы должны добавить к URL префикс inprise:its direct, как показано ниже

j dbc:inprise:its direct:oracle:thin:@avicenna:1521:avi73a Кроме того, при использовании интерфейса DriverManager, в командной строке запуска Контейнера вы должны указать системное свойство j dbc. drivers. Например, для работы с драйвером Oracle вы могли бы задать следующую командную строку:

vbj -Dj dbc.drivers=oracle.j dbc.driver.OracleDriver

com.inprise.ejb.Container test bank beans.jar -jts -jns

При использовании интерфейса DataSource нет необходимости указывать значение этого свойства, если вы указываете параметр driver-class-name в Дескрипторе Поставки.

Вы можете указать в Дескрипторе Поставки два необязательных дополнительных элемента, описывающих источник данных – имя пользователя и его пароль. Они не являются обязательными, поскольку могут являться частью URL. Существует и третий необязательный элемент, который называется "диалект" (dialect). Диалект – это имя базы данных, которая содержит хранимые данные приложения, и Контейнер EJB Inprise использует это имя для поддержки сохранения состояния. Например, если вы хотите указать, что для этого нужно использовать Sybase, вы могли бы включить следующую строку в ваш Дескриптор Поставки:

<dialect>sybase</dialect> Когда этот параметр присутствует, Контейнер автоматически создает необходимые таблицы для указанной базы данных.

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

Управление соединениями с базой данных и пулами

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

Iprise-реализация Контейнера EJB обеспечивает механизм кеширования соединений с базами данных, что позволяет Компонентам повторно

использовать ранее установленные соединения. Эта схема существенно уменьшает время, необходимое для управления соединением и повышает производительность.

Как работает механизм кеширования соединения? После того, как Компонент устанавливает соединение с базой данных, Контейнер помещает это соединение в пул на определенное количество времени (это количество времени является настраиваемым параметром). Соединение содержится в пуле до истечения указанного интервала времени, а затем удаляется. При использовании СМР, пул соединений автоматически используется Контейнером.

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

•          Свойство ITSJDBCidle timeout позволяет вам указать величину интервала тайм-аута для кешированных соединений JDBC. По определению его величина равна 10 минутам. Вы можете указать другое значение этого интервала (в секундах) непосредственно в командной строке. Например, следующая строка устанавливает интервал, равный 20 минутам:

Vbj -DITSJDBCidle timeout=1200 com.inprise.ijb.Container myContainer beans.jar -jts -jns

•          Свойство ITS timeout управляет частотой, с которой сервис транзакции проверяет, не истек ли интервал тайм-аута для кешированных соединений. По умолчанию это 5 минут (300 секунд), и вы можете установить любое другое значение в командной строке, как показано ниже:

Vbj -DITS_timeout=600 -DITSJDBCidie_timeout=1200

com.inprise.ijb.Container myContainer beans.jar -jts -jns

Ниже описано, как Контейнер управляет пулом соединения. В общем случае Контейнер устанавливает соединения тогда, когда это действительно необходимо, а не просто при выполнении определенных операций. Например, он не устанавливает соединение при начале транзакции, он ждет первого обращения к методу getConnection () интерфейса javax.sql.DataSource. Этот вызов сопоставляет транзакцию с соединением. Контейнер может использовать как соединение из пула, так и создать новое, если это необходимо. Когда выполняются другие вызовы метода getConnection () в контексте той же транзакции, Контейнер использует первоначальное соединение. Когда Компонент вызывает метод commit (), Контейнер проверяет, относится ли commit () к используемому соединению. После того, как транзакция завершена, Контейнер продолжает держать это соединение во внутреннем кеше. Если другая транзакция нуждается в соединении с тем же источником данных, Контейнер использует кешированное соединение. Контейнер поддерживает пул соединений автоматически. Код установления

соединения с базой данных мог бы выглядеть так, как показано в Примере Кода 8.4:

Пример Кода 8.4 Использование пула соединений

Context ctx = (Context) new InitialContext!); ds = (DataSource)ctx.lookup("java:comp/jdbc/SomeDataSource"); ds.getConnection(); // some database work

ds.getConnection(); // вы получаете то же самое соединение Для выполнения действий, специфических для конкретной RDBMS, таких, как подготовка выполнения запросов, Контейнер EJB полагается на JDBC-драйвер. Контейнер игнорирует большинства JDBC-вызовов, за исключением обращения к методу java. sql .Connection. setAutoCommit (). Он перехватывает это обращение, так как это не разрешено в контексте глобальной транзакции. Кроме того, режим AUT0C0MMIT для JDBC- соединения, возвращаемого Inprise DataSource, имеет значение OFF, и Компонент не может установить его в значение ON. При установленном AUTOCOMMIT=OFF Контейнер Inprise подтверждает все изменения в конце транзакции, а не после того, как изменения были внесены.

Источник: Руководство программиста Enterprise JavaBeans

По теме:

  • Комментарии