Разработка Java-приложения для работы с удалённой базой данных

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    10,73 Кб
  • Опубликовано:
    2016-05-19
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка Java-приложения для работы с удалённой базой данных

Содержание

Введение

. Распределённая база данных

. Сервер

. Клиент

Заключение

Список используемой литературы

Введение

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

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

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

На сегодняшний день наибольшее распространение получили распределённая база данных и программные продукты, созданные при помощи объектно-ориентированных языков. Методы их оптимизации и семантика настолько существенно различаются, что объединение этих двух комплексов часто влечет «потерю соответствия» и появление ошибок [4].

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

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

Для взаимодействия сервера и клиента используются сокеты.

Сокеты (сетевые разъёмы) - это логическое понятие, соответствующее разъёмам, к которым подключены сетевые компьютеры и через которые осуществляется двунаправленная поточная передача данных между компьютерами. Сокет определяется номером порта и IP-адресом. При этом IP-адрес используется для идентификации компьютера, номер порта - для идентификации процесса, работающего на компьютере. Когда одно приложение знает сокет другого, создается сокетное протоколо-ориентированное соединение по протоколу TCP/IP. Клиент пытается соединиться с сервером, инициализируя сокетное соединение. Сервер прослушивает сообщение и ждет, пока клиент не свяжется с ним. Первое сообщение, посылаемое клиентом на сервер, содержит сокет клиента. Сервер, в свою очередь, создает сокет, который будет использоваться для связи с клиентом, и посылает его клиенту с первым сообщением. После этого устанавливается коммуникационное соединение.

Сокетное соединение с сервером создается клиентом с помощью объекта класса Socket. При этом указывается IP-адрес сервера и номер порта. Если указано символьное имя домена, то Java преобразует его с помощью DNS-сервера к IP-адресу. Например, если сервер установлен на этом же компьютере, соединение с сервером можно установить из приложения клиента с помощью инструкции:

Socket socket = new Socket("ИМЯ_СЕРВЕРА", 4000);

Сервер ожидает сообщения клиента и должен быть заранее запущен с указанием определенного порта. Объект класса ServerSocket создается с указанием конструктору номера порта и ожидает сообщения клиента с помощью метода accept()класса ServerSocket, который возвращает сокет клиента:

ServerSocket server = new ServerSocket(4000);socket = server.accept();

Таким образом, для установки необходимо установить IP-адрес и номер порта сервера, IP-адрес и номер порта клиента. Порт клиента и сервера устанавливаются одинаковыми. Клиент и сервер после установления сокетного соединения могут получать данные из потока ввода и записывать данные в поток вывода с помощью методов getInputStrеam() и getOutputStrеam() или к PrintStream для того, чтобы программа могла трактовать поток как выходные файлы [5].

1. Распределённая база данных

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

Распределенная/параллельная база данных - это именно база данных, а не «коллекция» файлов, индивидуально хранимых на разных узлах сети. В этом заключается разница между DDB и распределенной файловой системой. Распределенные данные представляют собой DDB, только если они связаны в соответствии с некоторым структурным формализмом (таким как реляционная модель), а для доступа к ним имеется единый высокоуровневый интерфейс.

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

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

В данной работе используется СУБД MySQL, потому что у нас в России эта СУБД очень популярна и является свободно распростираемым программным обеспечением. Для подключения приложения JAVA к базе данных MySQL используется JDBC(java data base connector).

В СУБД MySQL создаём распределенную базу данных, состоящую из двух горизонтальных фрагментов: library1 и library2. Каждый фрагмент содержит по две таблицы: books(книги) и readership(читатели) для первого сервера и books2(книги) и readership2(читатели) для второго сервера.

SQL-операторы создания таблиц представлены ниже.

SQL-оператор создания таблицы readership:

CREATE TABLE `library1`.`readership` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(45) NOT NULL,

`city` VARCHAR(45) NOT NULL,

`id_book` INT(11) NOT NULL,

`count_day` INT(11) NULL,KEY (`id`)),KEY (id_books) REFERENCES books (id);-оператор создания таблицы books:

CREATE TABLE `library1`.`books` (

`id` INT(11) NOT NULL,

`authors` VARCHAR(45) NOT NULL,

`name` VARCHAR(45) NOT NULL,

`year` INT(11) NOT NULL,

`count` INT(11) NOT NULL,KEY (`id`));

2. Сервер

В InteliJIDEA мы создаём проект ServerForLibrary и ServerForLibrary2. В каждом проекте мы создаём по классу Server. В классах мы создаём по методу buildGUI(), который реализует интерфейс нашего сервера. А в конце нашего метода мы вызываем метод conectBD и go().

Первый метод устанавливает соединение с базой данных MySQL. В начале нашего метода мы создаём драйвер и регистрируем его:

Driver driver = new FabricMySQLDriver();.registerDriver(driver);

Далее устанавливаем соединение с базой данных:

conneсtion=DriverManager.getConnection("jdbc:mysql://localhost:3306/library1", "root", "root");

Поясним параметр метода getConnection

"jdbc:mysql://localhost:3306/library1":

jdbc - коннектор, с помощью которого осуществляется подключение;

mysql - база данных,

localhost:3306 - локальная сеть,

library1 - первая база данных, далее указываются логин и пароль;

root в первом случае это логин, а во втором случае пароль.

Далее создаётся запрос.

Код метода conectBD() имеет следующий вид:

public void conectBD(){{driver = new FabricMySQLDriver();.registerDriver(driver);= DriverManager.getConnection(HOST, USERNAME, PASSWORD);= connection.createStatement();.setText("Соединение с mysql установлено!!!");

} catch (SQLException e) {.printStackTrace();.setText("Соединение с mysql отсутствует!!!");

JOptionPane.showMessageDialog(null,"Соединение с mysql отсутствует!!!");

}

}

Метод go() создаёт северский порт, в нашем случае это 4000, потом использую цикл while в котором для каждого вошедшего клиента мы создаём порт для обратной связи, далее мы вызываем нить, которая считывает данные с клиентов.

Код метода go() имеет следующий вид:

private void go() {= new ArrayList<ObjectOutputStream>();{serverSock = new ServerSocket(4000); //создаём порт серверский(true){clientSocket = serverSock.accept();//клиент вошёл и созд. для него портout = new ObjectOutputStream(clientSocket.getOutputStream());//поток для отправки.add(out);

//нить, которая читает данные с вошедшего клиента

Thread t = new Thread(new ClientHandler(clientSocket));.start();//запускает нить

t.join();//ждёт окончания завершения нити

System.out.println("got a connection");

}

}

Во втором сервере создаём такие же методы go() и conectBD(), только в методе go() мы создаём серверский порт 4002.

В интерфейс ClientHandler в конструкторе параметром является сокет клиента, а в параметре создаётся объект Socket, который состоит из IP- адреса и TCP- порта, и создаётся соединение с потоком для считывания данных отправленных клиентами.

Далее переопределяем метод run() в котором создаём цикл while, который считывает объекты, в нашем случае клиенты оправляют текстовые сообщения, содержащие sql-запросы. Потом вызывается метод tellEveryone(massege), в котором в качестве параметра является сообщение клиента.

Метод tellEveryone(Object one) состоит из шести основных if. Сначала создаём ObjectOutputStream поток для отправки.

Первый if принимает от клиента обычный запрос Select * from books, который выводит содержание таблицы books. Помещаем в объект ResultSet, переменная resultSet (объявили её в начале класса ClientHandler - это глобальная переменная), которая содержит все строки удовлетворяющие запросу. Так как объект ResultSet не сериализуемый объект, то его мы не можем отправить клиенту. Сериализация - это сохранения состояния объекта. Чтобы объект был сериализованным, он должен быть помечен или наследовать интерфейс Serializable. Тогда можно передавать его через потоки. Но объект ResultSet - это класс пакета java.sql, который не сериализуется. Поэтому создаём список, состоящий из объектов (ArrayList<Object> aList = new ArrayList<Object>()), в дальнейшем считываем построчно в цикле while содержимое resultSet и добавляем в список. После выхода из первого if отправлям этот список клиенту через строчку out.writeObject(aList), второй if аналогично.

В третьем if мы принимаем сообщение от клиента на добавление строки в таблицу. Четвёртый if обновляет запись, пятый - удаляет, а шестой выводит, выполняет и отправляет результаты выборки.

В самом классе Server есть четыре кнопки, каждой кнопке соответствует внутренний класс, которые наследуют интерфейсы ActionListener.

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

При нажатии кнопки Показать книги, сначала названиям столбцам даем нейтральные имена (--). Далее всем ячейкам таблицы присваиваю пустые значения. При нажатии кнопки Выход закрываем поток connection, далее просто выходим из программы строчкой System.exit(0).

Сервер изображён на рисунке 1.

Рисунок 1- Сервер для библиотеки

На рисунке 2 изображено действие при нажатии кнопки Показать книги:

Рисунок 2- Действие при нажатии кнопки

На рисунке 3 изображено действие при нажатии кнопки Показать читателей.

Рисунок 3- Действие при нажатии кнопки

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

. Клиент

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

В левом нижнем углу кнопка Общая выборка, которая делает выборку из данных, находящихся на двух серверах. Клиент изображён на рисунке 4.

Рисунок 4- Клиент

На рисунке 5 изображено действие при нажатии кнопки Показать книги.

Рисунок 5- Действие при нажатии кнопки Показать книги

На рисунке 6 изображено действие при нажатии кнопки Показать читателей.

Рисунок 6- Действие при нажатии кнопки Показать читателей

В курсовой работе используется локальная сеть, для работы Клиента нужно запустить сервер. При нажатии кнопки добавить всплывает окно для добавления записей, которая изображена на рисунке 7.

Рисунок 7 - Панель для добавления

При нажатии кнопок Для та б.Книги и Для таб.Читатели изменяется название столбцов:

При нажатии кнопки Для та б.Книги панель изменится (рисунок 8).

Рисунок 8 - Панель для добавления для книг

А при нажатии кнопки Для таб.Читатели панель изменится на рисунке 9.

Рисунок 9- Панель для добавления для читателей

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

При нажатии кнопки Обновить, появится окно, изображённое на рисунке 10.

Рисунок 10- Панель для обновления для книг

В этом окошке две первые кнопки работают по такому же принципу как выше. Здесь добавляется новое поле Условие(=,<,>) , в котором мы прописываем условие, например на рисунке 11:

Рисунок 11- Пример

Это означает, что у нас обновляется запись из таблицы books с условием, при котором ID равное 1 изменит фамилию на Васильев В.Г..

При нажатии кнопки Удалить появится окно (рисунок 12).

Рисунок 12- Пример удаления

У нас всплывает окошко, в котором мы можем удалить запись, которую нам нужно удалить, например, на рисунке 13.

Рисунок 13- Удаление записи

Это означает, что удалится запись из таблицы readership при условии, что номер книги будет равен 22 и кол-во дней равно 10. В MySQL это будет выглядеть так: Select from readership where id=22 and count_day=10. Это окошко формирует запрос и отправляет на сервер, который впоследствии его выполняет.

При нажатии кнопки Выбрать появится окно, рисунок 14.

Рисунок 14- Панель для выборки

На панели для выборки находятся три кнопки: очистить, показать выборку, выход. Нажатие первой кнопки очищает поля и флажки. При нажатии второй кнопки и при условии, что мы выбрали столбцы и условия, у нас появится таблица, в которой отобразятся результаты выборки, например, на рисунке 15 изображён пример.

Рисунок 15- Пример выборки

Результирующая таблица Выборка содержит столбцы, отмеченные во флажках с условием, в поле где написано значение, в нашем случае это означает в MySQL коде: select books.id,books.year,readership.id,readership.city from books inner join readership on books.id=readership.id_book where books.id =23;.

При нажатии кнопки Общая выборка появится окно, представленное на рисунке 16.

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

Рисунок 16 - Общая выборка

Например, на рис.17 мы хотим сделать выборку по таблице книги, которая находится в базе данных первого сервера, и по таблице читатели, которая находится в базе данных второго сервера.

Рисунок 17 - Пример выборки

В этом примере нас интересует читатель, который взял 30 книгу. При нажатии кнопки Показать выборку у нас всплывает результат выборки на рисунке 18.

Рисунок 18- Результат выборки

Заключение

За время выполнения курсовой работы были изучен язык Java, среда разработки IntelliJ IDEA, её функции и особенности, СУБД MySQL.

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

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

реестр сеть сервер клиентский

Список используемой литературы

1) К. Сьерра, Б. Бейтс - Изучаем Java (Мировой компьютерный бестселлер) - 2012

2) Argina. 1998-2015.

) Java Guru, книги по Java. 2003-2015.

4) SoftInterGroup. 2009-2016

) Программирование. 2009-2016

Похожие работы на - Разработка Java-приложения для работы с удалённой базой данных

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!