GWT RPC: использовать одно и то же соединение с БД для нескольких запросов - PullRequest
1 голос
/ 06 июля 2010

Я работаю над веб-интерфейсом для базы данных. Цель состоит в том, чтобы создать инструмент, который студенты могут использовать для изучения SQL, выдачи запросов и просмотра результатов. До сих пор я использовал CLI. Его основными недостатками являются: а) студенты в наши дни более привыкли к GUI; и б) когда запрос возвращает очень широкую таблицу, его трудно прочитать, потому что он оборачивается. Мой веб-интерфейс предназначен для устранения этих недостатков.

Я использую GWT в качестве клиентского интерфейса и сервера базы данных PostgreSQL. GWT связывается с базой данных через контейнер сервлетов Java, размещенный на Jetty или Tomcat.

Использование механизма RPC GWT для выдачи простых запросов достаточно просто. Однако я застрял на том, как обрабатывать долгосрочные транзакции. Чтобы студенты лучше поняли, как ведут себя транзакции, мне нужно, чтобы они могли выполнить инструкцию BEGIN, затем выполнить один или несколько запросов, а затем COMMIT или ROLLBACK. Я бы хотел, чтобы они выполняли операторы BEGIN / COMMIT / ROLLBACK вручную, что означает, что транзакция может быть активной в течение нескольких минут.

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

Чтобы реализовать это, я должен быть уверен, что через всю транзакцию клиент будет подключен к одному и тому же соединению с базой данных. Используя традиционные (не сохраняющие состояние) методы, соединения с базой данных являются либо кратковременными, либо объединенными. Следовательно, никогда нельзя быть уверенным, что одно и то же соединение с базой данных будет использоваться для нескольких запросов.

Боюсь, я немного новичок в сервлетах Java, поэтому у меня есть несколько вопросов.

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

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

1 Ответ

3 голосов
/ 06 июля 2010

Java-сервлеты сохраняют объект HttpSession для каждого сеанса пользователя.Каждый объект сеанса имеет карту со строковым ключом, которую можно использовать для присоединения произвольных объектов Java (например, соединения SQL) к сеансу.В вашем случае я бы извлекал объект подключения для каждого запроса следующим образом:

// getThreadLocalRequest is a member of GWT's RemoteServiceServlet
HttpSession session = getThreadLocalRequest().getSession();
Connection connection = (Connection)session.getAttribute("connection");

if (connection == null) {
     // I'll leave it to you to implement createConnection
     final Connection c = createConnection();
     connection = c;

     session.setAttribute("connection", connection);
     session.setAttribute("expiryListener", new HttpSessionBindingListener() {
         public void valueBound(HttpSessionBindingEvent e) {}

         // This method will be called when the user's session expires
         public void valueUnbound(HttpSessionBindingEvent e) {
             c.close();
         }
     });
}

// connection is ready to use!
Statement statement = connection.createStatement();
...