Смекни!
smekni.com

Огляд технології сервлетів (стр. 2 из 3)

Для реалізації багатопоточності в Java передбачено два способи:

1. Використання успадкування від класу Thread.

2. Використання інтерфейсу Runnable.

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

Thread t = Thread.currentThread();

Цей спосіб – використання реалізації інтерфейсу Runnable. Для цього необхідно визначити заголовок класу наступним чином:

class NewThread implements Runnable

Другий спосіб – використання наслідування від класу Thread. Переробимо програму для цього способу. При цьому необхідно змінити тільки заголовок класу NewThread.

class NewThread extends Thread

Клас Thread та інтерфейс Runnable містять метод run(), який програміст повинен перевизначити. Всередині даного методу необхідно розміщувати оператори, які будуть виконуватись в новому потоці. Оскільки головний потік повинен завершуватись останнім, то використовують метод join(), який очікує поки завершиться потік для якого даний метод викликаний.


2. Особливості взаємодії Java з SQL-серверами

Java надає доступ до баз даних за допомогою інтерфейсу JDBC. Даний інтерфейс за своєю суттю нагадує ODBC, більш того, в Win32 є шлюз JDBC-ODBC .

Пакет JDBC призначений для роботи з різноманітними диспетчерами СКБД від різних розробників. Для підключення до бази даних середовище виконання Java повинне завантажити відповідний драйвер вказаної бази даних. Завантаження і вивантаження таких драйверів здійснюється за допомогою класу DriverManager.

Рис.2.1. Схема підключення додатків JAVA до SQL сервера

На рис.2.1. показана схема підключення Java-програми до бази даних. Клас DriverManager має структуру даних, яка містить як самі драйвери у вигляді об'єктів Driver, так і інформацію про них.

Отже розглянемо кроки які необхідно зробити для того, щоб обробити SQL запит:

1. Завантаження та реєстрація JDBC-драйвер (на етапі ініціалізації додатку).

2. Сформувати JDBC-URL-рядок для отримання з'єднання з базою.

3. Одержати екземпляр об’єкта класу Connection.

4. Сформувати SQL запит.

5. Виконання і обробка SQL-запиту.

6. Закрити одержані з'єднання (ResultSet, Statament, Connection).

Тепер розглянемо ці кроки детальніше на приклад роботи з MySQL.

2.1 Завантаження та реєстрація JDBC-драйвера

Драйвери JDBC звичайно створюються постачальниками СКБД. Їх робота полягає в обробці JDBC-підключень і команд, що поступають від Java-додатку, і в генерації машинно-залежних викликів по відношенню до бази даних.

Далеко не всі постачальники СКБД пропонують драйвери JDBC, але як правило ними завжди поставляються драйвера ODBC (Open Database Connectivity), які задовольняють стандарту Microsoft. При роботі з СКБД на платформі Windows постачальник використовуваної СКБД майже завжди пропонує власний драйвер JDBC. Тому дані з баз даних можна легко отримати в Office проблем з підключенням Java-додатку до бази даних в середовищі Windows звичайно не виникає, необхідно тільки завантажити відповідний JDBC-драйвер.

Завантаження драйвера може здійснюватися як з програми, так і з командного рядка.

Для завантаження драйвера JDBC з командного рядка необхідно ввести наступну команду:

Java -Djdbc.drivers=sun.odbc.JdbcOdbcDriver MyApplication

При реєстрації драйвера-моста JDBC-ODBC з програми у Вас повинні бути:

- JAR-файл з драйвером повинен бути підключений в CLASSPATH.

- Ви повинні знати назву класу-драйвера, який ви збираєтеся підключати (цю інформацію шукайте на сайті виробника драйверів).

JAR Ви підключили, тепер необхідно зареєструвати драйвер:

String driver=" sun.odbc.JdbcOdbcDriver";

try{

Class.forName(driver).newInstance();

DriverManager.registerDriver( (Driver)Class.forName(driver).newInstance());

} catch(Exception e)

{ System.out.println("Exception while register driver: "+e); }

2.2 Формування JDBC-URL-рядка

У найзагальнішому випадку цей рядок має вигляд:

jdbc:id_бази:параметри

У разі MySQL вона має вигляд:

jdbc:mysql://хост/база?user=користувач

Наприклад:

jdbc:mysql://127.0.0.1/GENERAL?user=root

Необхідний відступ з приводу "особливостей" роботи драйверів mysql. Для підключення необхідна передача login/password в JDBC драйвер, проте JDBC-драйвера MySQL, які зустрічалися під час виконання дипломного проекту сприймали тільки login, прописаний в рядку JDBC-URL і ніякими іншими способами примусити сприйняти драйвер необхідні параметри не вийшло.


2.3 Отримання екземпляра об’єкта класу Connection

Для отримання Connection необхідно викликати DriverManager. getConnection() і передати у всередину login/password/jdbc-url:

String url="jdbc:mysql://127.0.0.1/GENERAL?user=root";

String user="";

String password="";

Connection c=null;

try{

c=DriverManager.getConnection(url,user,password);

} catch(SQLException e)

{ System.out.println("Exception getting connection: "+e); }

2.4 Формування SQL запиту

На даному етапі необхідно сформувати звичайну SQL команду, наприклад:

String str="select * from Mytable";

String str="insert into Mytable (name,cnt) values ('"+name+"',"+cnt+"')";

2.5 Виконання і обробка SQL-запиту

Для виконання запиту необхідно отримати об’єкт Statement у екземпляра об’єкта класу Connection, і викликати один з його методів, залежно від типу запиту:

public int executeUpdate(String sql) throws SQLException

Застосовується для SQL команд INSERT, UPDATE або DELETE. Повертає кількість рядків над якими виконалася операція.

public ResultSet executeQuery(String sql) throws SQLException

Застосовується для SQL команди SELECT. Повертає ResultSet з якого можна витягнути інформація про шапку таблиці (ResultSetMetaData) і самі значення. Як це робиться буде показаний нижче в прикладі.

public boolean execute(String sql) throws SQLException

Даний метод повертає true/false - виконався/не виконався запит. Застосовується в тих випадках коли SQL запит повертає декілька ResultSet'ів. Для їх отримання використовуйте getMoreResults().

Закриття одержаних з'єднань (ResultSet, Statament, Connection)

У кожного з вказаних об’єктів є метод

close();

При необхідності виконання схожих SQL-операторів декілька разів використання підготовлених операторів виявляється більш ефективнішим, ніж виконання кожного разу одного і того ж оператора із різними значеннями параметрів. Створюється параметризований оператор стандартного виду, який надсилається БД на компіляцію перед тим, як він використовуватиметься. Для позначення місць у запиті, де підставлятимуться реальні значення параметрів, використовують знаки питання. Кожного разу при використанні підготовлених операторів достатньо замінити один з параметрів за допомогою методів setXxx. Потім викликається метод executeQuery або executeUpdate.

2.6 Основні проблеми тестування баз даних

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

При виході реляційних баз даних на ринок корпоративних пропозицій, до їх продуктивності стали пред’являти підвищені вимоги. Користувачі хотіли бути впевнені в тому, що вибрана ними СКБД не почне “задихатися” при збільшенні вимог додатків. Це занепокоєння користувачів, яка доповнювалась також зацікавленістю виробниками СКБД призвела до “холодної війни” за показники продуктивності між виробниками. Одних цікавила максимальна абсолютна продуктивність СКБД, інших – співвідношення ціна/продуктивність і відповідна економія коштів. У всіх випадках компанії рекламували контрольні тести, які доказували перевагу їх продукту над іншими, і робилися спроби дискредитувати контрольні тести інших виробників.

Перш за все контрольні тести розроблялися самими виробниками. Однак виробники самі були зацікавлені в найкращих результатах цих тестів, що приводило до спотворення реально існуючої інформації про продуктивності роботи їх продуктів. Пізніше з’явились два незалежних теста “Дебет/кредит” та ТР1. Перший з них виконував прості бухгалтерські транзакції, а другий – вимірював продуктивність OLTP-систем. Однак ці тести були достатньо простими, і тому виробникам не складало великих труднощів маніпулювати результатами отриманих тестів, щоб представити свої продукти в найкращому світлі. Як правило маніпулювання даними тестами полягало у використанні більш продуктивніших та більш сучасних комп’ютерах, специфічно представлених даних, якими наповнювалися таблиці та інші.

Спроби зробити результати тестів більш-менш стабільними та достовірними закінчились об’єднанням декількох виробників і консультантів по базах даних в організацію Transaction Processing Council, яка зайнялась створенням стандартного тесту для реляційних баз даних. Ця організація розробила серію офіційних контрольних тестів для реляційних баз даних, відомих як ТРС-А, ТРС-В, ТРС-С. Ця організація взяла на себе функцію збору, зберігання та публікації результатів контрольних тестів для різних СКБД, а також роботу по верифікації результатів тестів, про які інформують виробники СКБД.

Однак, ці тести як правило втрачаються за горою рекламних кампаній нових продуктів, і кінцеві користувачі, як правило, не мають реальних даних про продуктивність тієї чи іншої СКБД в специфічних умовах (адже організація ТРС не може фізично протестувати всі можливі варіанти поєднання СКБД та різних видів програмного забезпечення). Тому в цій роботі ми спробуємо навести результати тестування певних функцій найбільш поширених СКБД при роботі з технологіями сервлетів та JSP. Ще однією причиною виконання роботи являється те, що компанія ТРС випустила тільки beta версію свого тесту ТРС-W, який орієнтований на оцінку продуктивності тестуючої СКБД у поєднанні з Internet-додатками, які працюють з базами даних через WWW [3].