Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

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

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Cn.rollback(savepoint);




out.print("<b>Откат к точке сохранения: "

+ savepoint + "</b>");

} finally {

if (cn!= null) cn.close();

}

} catch (Exception e) {

e.printStackTrace();

}

out.close();

}

}

В результате в браузер будет выведено:

Соединение с БД...

java.sql.SQLException: You have an error in your SQL syntax...

Откат к точке сохранения: savepoint1

При этом результаты выполнения запроса trueSQL будут сохранены перед попыткой повторения транзакции.

Пул соединений

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

Пул соединений – это одна из стратегий предоставления соединений приложению (не единственная, да и самих стратегий организации пула существует несколько).

Пул соединений можно организовать с помощью server.xml дескрипторного файла Аpache Tomcat в виде:

<Context docBase=" FirstProject " path="/FirstProject"
reloadable="true" source="com.ibm.etools.webtools.server: FirstProject">

<!—создание пул соединений для СУБД MySQL -->

<Resource auth="Container" name=" jdbc/db1 "

type=" javax.sql.DataSource "/>

<ResourceParams name=" jdbc/db1 ">

<parameter>

<name>factory</name>

<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

</parameter>

<parameter>

<name> driverClassName </name>

<value> org.gjt.mm.mysql.Driver </value>

</parameter>

<!—url-адрес соединения JDBC для конкретной базы данных db1

Аргумент autoReconnect=true, заданный для url-адреса драйвера JDBC, должен автоматически разорвать соединение, если mysqld его закроет. По умолчанию mysqld закроет соединение через 8 часов.-->

<parameter>

<name> url </name>

<value> jdbc:mysql://localhost:3306/db1?autoReconnect=true

</value>

</parameter>

<parameter>

<name> usernam e</name>

<value> root </value>

</parameter>

<parameter>

<name> password </name>

<value> pass </value>

</parameter>

<parameter>

<name> maxActive </name>

<value> 500 </value>

</parameter>

<parameter>

<name>maxIdle</name>

<value>10</value>

</parameter>

<parameter>

<name>maxWait</name>

<value>10000</value>

</parameter>

<parameter>

<name>removeAbandoned</name>

<value>true</value>

</parameter>

<parameter>

<name>removeAbandonedTimeout</name>

<value>60</value>

</parameter>

<parameter>

<name>logAbandoned</name>

<value>true</value>

</parameter>

</ResourceParams>

</Context>

Найти и запустить данный пул соединений можно с помощью JNDI.

Разделяемый доступ к источнику данных можно организовать, например, путем объявления статической переменной типа DataSource из пакета javax.sql, однако в J2EE принято использовать для этих целей каталог. Источ­ник данных типа DataSource – это компонент, предоставляющий соединение
с приложением СУБД.

Класс InitialContext, как часть JNDI API, обеспечивает работу с каталогом именованных объектов. В этом каталоге можно связать объект источ­ника данных DataSource с некоторым именем (не только с именем БД, но и вообще
с любым), предварительно создав объект DataSource.

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

javax.naming.Context ct =

new javax.naming.InitialContext();

DataSource ds = (DataSource)ct.lookup("java:jdbc/db1");

Connection cn = ds.getConnection("root", "pass");

После выполнения запроса соединение завершается, и его объект возвращается обратно в пул вызовом:

cn.close();

Некоторые производители СУБД для облегчения создания пула соединений определяют собственный класс на основе интерфейса DataSource. В этом случае пул соединений может быть создан, например, следующим образом:

import COM.ibm.db2.jdbc.DB2DataSource;

...

DB2DataSource ds = new DB2DataSource();

ds.setServerName("//localhost:50000/db1");

Connection cn = ds.getConnection("db2inst1", "pass");

Драйвер определяется автоматически в объекте DB2DataSource.

Задания к главе 20

Вариант А

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

· Организацию соединения с базой данных вынести в отдельный класс, метод которого возвращает соединение.

· Создать БД. Привести таблицы к одной из нормированных форм.

· Создать класс для выполнения запросов на извлечение информации из БД с использованием компилированных запросов.

· Создать класс на добавление информации.

· Создать HTML-документ с полями для формирования запроса.

· Результаты выполнения запроса передать клиенту в виде HTML-документа.

1. Файловая система. В БД хранится информация о дереве каталогов файловой системы – каталоги, подкаталоги, файлы.

Для каталогов необходимо хранить:

– родительский каталог;

– название.

Для файлов необходимо хранить:

– родительский каталог;

– название;

– место, занимаемое на диске.

· Определить полный путь заданного файла (каталога).

· Подсчитать количество файлов в заданном каталоге, включая вложенные файлы и каталоги.

· Подсчитать место, занимаемое на диске содержимым заданного каталога.

· Найти в базе файлы по заданной маске с выдачей полного пути.

· Переместить файлы и подкаталоги из одного каталога в другой.

· Удалить файлы и каталоги заданного каталога.

2. Видеотека. В БД хранится информация о домашней видеотеке – фильмы, актеры, режиссеры.

Для фильмов необходимо хранить:

– название;

– имена актеров;

– дату выхода;

– страну, в которой выпущен фильм.

Для актеров и режиссеров необходимо хранить:

– ФИО;

– дату рождения.

· Найти все фильмы, вышедшие на экран в текущем и прошлом году.

· Вывести информацию об актерах, снимавшихся в заданном фильме.

· Вывести информацию об актерах, снимавшихся как минимум в N фильмах.

· Вывести информацию об актерах, которые были режиссерами хотя бы одного из фильмов.

· Удалить все фильмы, дата выхода которых была более заданного числа лет назад.

3. Расписание занятий. В БД хранится информация о преподавателях
и проводимых ими занятиях.

Для предметов необходимо хранить:

– название;

– время проведения (день недели);

– аудитории, в которых проводятся занятия.

Для преподавателей необходимо хранить:

– ФИО;

– предметы, которые он ведет;

– количество пар в неделю по каждому предмету;

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

· Вывести информацию о преподавателях, работающих в заданный день недели в заданной аудитории.

· Вывести информацию о преподавателях, которые не ведут занятия
в заданный день недели.

· Вывести дни недели, в которых проводится заданное количество занятий.

· Вывести дни недели, в которых занято заданное количество аудиторий.

· Перенести первые занятия заданных дней недели на последнее место.

4. Письма. В БД хранится информация о письмах и отправляющих их людях.

Для людей необходимо хранить:

– ФИО;

– дату рождения.

Для писем необходимо хранить:

– отправителя;

– получателя;

– тему письма;

– текст письма;

– дату отправки.

· Найти пользователя, длина писем которого наименьшая.

· Вывести информацию о пользователях, а также количестве полученных и отправленных ими письмах.

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

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

· Направить письмо заданного человека с заданной темой всем адресатам.

5. Сувениры. В БД хранится информация о сувенирах и их производителях.

Для сувениров необходимо хранить:

– название;

– реквизиты производителя;

– дату выпуска;

– цену.

Для производителей необходимо хранить:

– название;

– страну.

· Вывести информацию о сувенирах заданного производителя.

· Вывести информацию о сувенирах, произведенных в заданной стране.

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

· Вывести информацию о производителях заданного сувенира, произведенного в заданном году.

· Удалить заданного производителя и его сувениры.

6. Заказ. В БД хранится информация о заказах магазина и товарах в них.

Для заказа необходимо хранить:

– номер заказа;

– товары в заказе;

– дату поступления.

Для товаров в заказе необходимо хранить:

– товар;

– количество.

Для товара необходимо хранить:

– название;

– описание;

– цену.

· Вывести полную информацию о заданном заказе.

· Вывести номера заказов, сумма которых не превосходит заданную,
и количество различных товаров равно заданному.

· Вывести номера заказов, содержащих заданный товар.

· Вывести номера заказов, не содержащих заданный товар и поступивших в течение текущего дня.

· Сформировать новый заказ, состоящий из товаров, заказанных в текущий день.

· Удалить все заказы, в которых присутствует заданное количество заданного товара.

7. Продукция. В БД хранится информация о продукции компании.

Для продукции необходимо хранить:

– название;

– группу продукции (телефоны, телевизоры и др.);

– описание;

– дату выпуска;

– значения параметров.

Для групп продукции необходимо хранить:

– название;

– перечень групп параметров (размеры и др.).

Для групп параметров необходимо хранить:

– название;

– перечень параметров.

Для параметров необходимо хранить:

– название;

– единицу измерения.

· Вывести перечень параметров для заданной группы продукции.

· Вывести перечень продукции, не содержащий заданного параметра.

· Вывести информацию о продукции для заданной группы.

· Вывести информацию о продукции и всех ее параметрах со значениями.

· Удалить из базы продукцию, содержащую заданные параметры.

· Переместить группу параметров из одной группы товаров в другую.

8. Погода. В БД хранится информация о погоде в различных регионах.

Для погоды необходимо хранить:

– регион;

– дату;

– температуру;

– осадки.

Для регионов необходимо хранить:

– название;

– площадь;

– тип жителей.

Для типов жителей необходимо хранить:

– название;

– язык общения.

· Вывести сведения о погоде в заданном регионе.

· Вывести даты, когда в заданном регионе шел снег и температура была ниже заданной отрицательной.

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

· Вывести среднюю температуру за прошедшую неделю в регионах
с площадью больше заданной.

9. Магазин часов. В БД хранится информация о часах, продающихся в магазина.

Для часов необходимо хранить:

– марку;

– тип (кварцевые, механические);

– цену;

– количество;

– реквизиты производителя.

Для производителей необходимо хранить:

– название;

– страну.

· Вывести марки заданного типа часов.

· Вывести информацию о механических часах, цена на которые не превышает заданную.

· Вывести марки часов, изготовленных в заданной стране.

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

10. Города. В БД хранится информация о городах и их жителях.

Для городов необходимо хранить:

– название;

– год основания;

– площадь;

– количество населения для каждого типа жителей.

Для типов жителей необходимо хранить:

– город проживания;

– название;

– язык общения.

· Вывести информацию обо всех жителях заданного города, разговаривающих на заданном языке.

· Вывести информацию обо всех городах, в которых проживают жители выбранного типа.

· Вывести информацию о городе с заданным количеством населения
и всех типах жителей, в нем проживающих.

· Вывести информацию о самом древнем типе жителей.

11. Планеты. В БД хранится информация о планетах, их спутниках
и галактиках.

Для планет необходимо хранить:

– название;

– радиус;

– температуру ядра;

– наличие атмосферы;

– наличие жизни;

– спутники.

Для спутников необходимо хранить:

– название;

– радиус;

– расстояние до планеты.

Для галактик необходимо хранить:

– название;

– планеты.

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

· Вывести информацию о планетах и их спутниках, имеющих наименьший радиус и наибольшее количество спутников.

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

· Найти галактику, сумма ядерных температур планет которой наибольшая.

12. Точки. В БД хранится некоторое конечное множество точек с их координатами.

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

· Вывести точку из множества, наиболее удаленную от заданной.

· Вывести точки из множества, лежащие на одной прямой с заданной прямой.

13. Треугольники. В БД хранятся треугольники и координаты их точек на плоскости.

· Вывести треугольник, площадь которого наиболее приближена к заданной.

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

· Вывести треугольники, которые помещаются в окружность заданного радиуса.

14. Словарь. В БД хранится англо-русский словарь, в ко­тором для одного английского слова может быть указано нес­колько его значений и наоборот. Со стороны клиента вводятся последовательно английские (русские) слова. Для каждого из них вывести на консоль все русские (английские) значения слова.

15. Словари. В двух различных базах данных хранятся два словаря: русско-белорусский и белорусско-русский. Клиент вводит слово и выбирает язык. Вывести перевод этого слова.

16. Стихотворения. В БД хранятся несколько стихотворений с указанием автора и года создания. Для хранения стихотворений использовать объекты типа Blob. Клиент выбирает автора и критерий поиска.

· в каком из стихотворений больше всего восклицательных предложений?

· в каком из стихотворений меньше всего повествовательных предложений?

· есть ли среди стихотворений сонеты и сколько их?

17. Четырехугольники. В БД хранятся координаты вершин выпуклых четырехугольников на плоскости.

· Вывести координаты вершин параллелограммов.

· Вывести координаты вершин трапеций.

18. Треугольники. В БД хранятся координаты вершин треугольников
на плоскости.

· Вывести все равнобедренные треугольники.

· Вывести все равносторонние треугольники.

· Вывести все прямоугольные треугольники.

· Вывести все тупоугольные треугольники с площадью больше заданной.

Вариант B

Для заданий варианта В главы 4 создать базу данных для хранения информации. Определить класс для организации соединения (пула соединений). Создать классы для выполнения соответствующих заданию запросов в БД.

Тестовые задания к главе 20

Вопрос 20.1.

Объекты каких классов позволяют загрузить и зарегистрировать необходимый JDBC-драйвер и получить соединение с базой данных или получить доступ
к БД через пространство имен?

1) java.sql.DriverManager;

2) javax.sql.DataSource;

3) java.sql.Statement;

4) java.sql.ResultSet;

5) java.sql.Connection.

Вопрос 20.2.

Какой интерфейс из пакета java.sql должен реализовывать каждый драйвер JDBC?

1) Driver;

2) DriverManager;

3) Connection;

4) DriverPropertyInfo;

5) ResultSet.

Вопрос 20.3.

С помощью какого метода интерфейса Connection можно получить сведения о базе данных, с которой установлено соединение?

1) getMetaData();

2) getDatabaseInfo();

3) getInfo();

4) getMetaInfo();

5) getDatabaseMetaData().

Вопрос 20.4.

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

1) Statement;

2) PreparedStatement;

3) StoredStatement;

4) CallableStatement;

5) StoredProcedure.

Вопрос 20.5.

Какой метод интерфейса Statement необходимо использовать при выполнении SQL-оператора SELECT, который возвращает объект ResulSet?

1) execute();

2) executeQuery();

3) executeUpdate();

4) executeBatch();

5) executeSelect();

6) executeSQL().

 
Глава 21

CЕССИИ, СОБЫТИЯ и ФИЛЬТРЫ

Сеанс (сессия)

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

Сеанс (сессия) – соединение между клиентом и сервером, устанавливаемое на определенное время, за которое клиент может отправить на сервер сколько угодно запросов. Сеанс устанавливается непосредственно между клиентом и Web-сервером. Каждый клиент устанавливает с сервером свой собственный сеанс.

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

· поддержка распределенной сессии (синхронизация/репликация данных, уникальность идентификаторов и т.д.);

· обеспечение безопасности;

· проблема инвалидации сессии (expiration), предупреждение пользователя об уничтожении сессии и возможность ее продления (watchdog).

Чтобы открыть новый сеанс, используется метод getSession() интерфейса HttpServletRequest. Метод извлекает из переданного в сервлет запроса объект сессии класса HttpSession,соответствующий данному пользователю. Сессия содержит информацию о дате и времени создания последнего обращения
к сессии, которая может быть извлечена с помощью методов
getCreationTime() и getLastAccessedTime().

Если для метода getSession(boolean param) входной параметр равен true, то сервлет-контейнер проверяет наличие активного сеанса, установленного с данным клиентом. В случае успеха метод возвращает дескриптор этого сеанса. В противном случае метод устанавливает новый сеанс:

HttpSession se = request.getSession(true);

после чего начинается сбор информации о клиенте.

Чтобы сохранить значения переменной в текущем сеансе, используется метод setAttribute() класса HttpSession, прочесть – getAttribute(), удалить – removeAttribute(). Список имен всех переменных, сохраненных в текущем сеансе, можно получить, используя метод Enumeration getAttributeNames(), работающий так же, как и соответствующий метод интерфейса HttpServletRequest.

Метод String getId() возвращает уникальный идентификатор, который получает каждый сеанс при создании. Метод isNew() возвращает false для уже существующего сеанса и true – для только что созданного.

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

se.setAttribute( " teacherId ", new Integer(71));

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

Integer testId = (Integer)se.getAttribute( " teacherID " );

Завершить сеанс можно методом invalidate(). Сеанс уничтожает все связи с объектами, и данные, сохраненные в старом сеансе, будут потеряны для всех приложений.

/* пример # 1: добавление информации в сессию: SessionServlet.java */

package chapt21;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class SessionServlet extends HttpServlet {

protected void doGet(

HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {

performTask(req, resp);

}

private void performTask(

HttpServletRequest req,

HttpServletResponse resp)

throws ServletException {






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных