Java Servlet DB Query with Ajax - медленное время запроса и строка запроса не всегда полностью передаются сервлету - PullRequest
0 голосов
/ 21 февраля 2011

Я пытаюсь создать SQL-запрос на основе AJAX с помощью Java EE и сервлетов.Я использую Glassfish 3.01 и сервер MS SQL с Jquery на стороне клиента.Я собрал все вместе и связал свою функцию ajax с событием onkeyup текстового поля.Но иногда, когда я помещаю «testtring» в текстовое поле, сервлету передается только «testtrin»Таким образом, в основном последний символ исчезает, и поэтому результат запроса не является правильным.Не говоря уже о том, что когда набор результатов содержит большой объем данных, запрос выполняется довольно медленно.Не могли бы вы проверить, если я делаю что-то не так на стороне сервера и клиента?

На стороне клиента у меня есть эта функция JQuery:

  function ajaxSearch(sstring) {</p>

<p>if (sstring.length < 3)
  {
      $("#external").html("<p>at least 3 chars please....</p>")
  }
  else
  {
    $('#loading').ajaxStart(function() {
      $(this).show()
      $("#external").hide()
    });</p>

<pre><code>$('#loading').ajaxComplete(function() {
  $(this).hide()
  $("#external").show()
});

$.ajax({
    type:"GET",
    url: "/myApp/getStd",
    dataType: "application/x-www-form-urlencoded",
    data: "sstring="+escape(sstring),
            async: true,
    success: function(data){
        $("#external").html(data);

    }
 })
</code>

}}

На стороне сервера у меня есть это:

@WebServlet (name = "getStd",urlPatterns = {"/ getStd"}) открытый класс getStd расширяет HttpServlet {@Override public void doGet (HttpServletRequest req, HttpServletResponse res) создает ServletException, IOException {Connection conn = null;Заявление stmt = null;ResultSet rs = null;ArrayList rows = new ArrayList ();res.setCharacterEncoding ( "UTF-8");res.setContentType ( "текст / html");PrintWriter out = res.getWriter ();Строка sql = null;String test = req.getParameter ("sstring");try {InitialContext cxt = new InitialContext ();if (cxt == null) {выбросить новое исключение ("Ой, нет контекста!");} DataSource ds = (DataSource) cxt.lookup ("jdbc / Sample");conn = ds.getConnection ();stmt = conn.createStatement ();sql = "Выбрать * из MYDB.dbo.testdb, где myField похож на '%" + req.getParameter ("sstring") + "%';";rs = stmt.executeQuery (sql);while (rs.next ()) {stdRecord cols = new stdRecord ();cols.setTeljel (rs.getString ( "Field1"));cols.setTitle (rs.getString ( "Field2"));cols.setICS (rs.getString ( "Field3"));cols.setREF (rs.getString ( "Field4"));rows.add (смещ_по_столбцы);} req.setAttribute ("std", строки);req.setAttribute («запрос», тест);req.getRequestDispatcher ("/ showRes.jsp"). forward (req, res);// закрываем все, чтобы освободить ресурсы rs.close ();rs = ноль;stmt.close ();stmt = ноль;conn.Close ();/ conn = ноль;строки = NULL;} catch (SQLException e) {e.printStackTrace (out);} catch (Exception e) {e.printStackTrace (out);} наконец {if (rs! = null) {try {rs.close ();} catch (SQLException e) {;} rs = null;} if (stmt! = null) {try {stmt.close ();} catch (SQLException e) {;} stmt = null;} if (conn! = null) {try {conn.close ();} catch (SQLException e) {;} conn = null;}}}}

Заранее спасибо.

1 Ответ

1 голос
/ 21 февраля 2011

Что касается отставания в keyup, я думаю, что это связано с проблемой производительности, поэтому давайте сначала исправим это, а затем пересмотрим.

Что касается производительности, вы дали очень мало информации о своемнастройки, но два распространенных решения, которые часто упускаются из виду инициаторами, следующие:

  1. Используйте соединение из пула DataSource вместо DriverManager.Это экономит затраты на подключение БД по каждому запросу (это может занять более 200 мс, в то время как соединение в пуле возвращается в кратчайшие сроки).За подробностями обратитесь к документации по конфигурации ресурса JNDI рассматриваемого сервера приложений (подсказка: консоль администратора ).

  2. Ограничьте размер набора результатов на стороне SQL, а не на Javaбоковая сторона.Это экономит затраты на передачу нерелевантных данных по сети.Просто верните 10 лучших результатов или что-то вместо всей таблицы.За подробностями обращайтесь к руководству по SQL для рассматриваемой базы данных (подсказка: SET ROWCOUNT).

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