ТОР 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" <!—создание пул соединений для СУБД 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 с некоторым именем (не только с именем БД, но и вообще Затем созданный объект можно получить с помощью метода 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(). CЕССИИ, СОБЫТИЯ и ФИЛЬТРЫ Сеанс (сессия) При посещении клиентом Web-ресурса и выполнении вариантов запросов, контекстная информация о клиенте не хранится. В протоколе HTTP нет возможностей для сохранения и изменения информации о предыдущих посещениях клиента. При этом возникают проблемы в распределенных системах c различными уровнями доступа для разных пользователей. Действия, которые может делать администратор системы, не может выполнять гость. В данном случае необходима проверка прав пользователя при переходе с одной страницы на другую. В иных случаях необходима информация о предыдущих запросах клиента. Существует несколько способов хранения текущей информации о клиенте или о нескольких соединениях клиента с сервером. Сеанс (сессия) – соединение между клиентом и сервером, устанавливаемое на определенное время, за которое клиент может отправить на сервер сколько угодно запросов. Сеанс устанавливается непосредственно между клиентом и Web-сервером. Каждый клиент устанавливает с сервером свой собственный сеанс. Сеансы используются для обеспечения хранения данных во время нескольких запросов Web-страницы или на обработку информации, введенной в пользовательскую форму в результате нескольких HTTP-соединений (например, клиент совершает несколько покупок в интернет-магазине; студент отвечает на несколько тестов в системе дистанционного обучения). Как правило, при работе с сессией возникают следующие проблемы: · поддержка распределенной сессии (синхронизация/репликация данных, уникальность идентификаторов и т.д.); · обеспечение безопасности; · проблема инвалидации сессии (expiration), предупреждение пользователя об уничтожении сессии и возможность ее продления (watchdog). Чтобы открыть новый сеанс, используется метод getSession() интерфейса HttpServletRequest. Метод извлекает из переданного в сервлет запроса объект сессии класса HttpSession,соответствующий данному пользователю. Сессия содержит информацию о дате и времени создания последнего обращения Если для метода 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 { Не нашли, что искали? Воспользуйтесь поиском:
|