使用Ajax的Java Servlet DB查询 - 慢查询时间和查询字符串并不总是完全传递给servlet

时间:2011-02-21 19:19:44

标签: java jquery jsp servlets

我正在尝试使用Java EE和Servlet创建基于AJAX的SQL查询。我在客户端使用Glassfish 3.01和MS SQL服务器和Jquery。 我将所有内容放在一起,并将我的ajax函数绑定到textfield的onkeyup事件。但有时当我将'teststring'放入文本框时,只有“teststrin”传递给Servlet。所以基本上最后一个字符消失了,因此查询结果不正确。 更不用说当结果集包含大量数据时,查询非常慢。你能否检查我在服务器和客户端是否做错了什么?

在客户端,我有这个JQuery函数:

  function ajaxSearch(sstring) {

if (sstring.length < 3) { $("#external").html("

at least 3 chars please....

") } else { $('#loading').ajaxStart(function() { $(this).show() $("#external").hide() });

$('#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);

    }
 })

} }

On the server side I have this:

@WebServlet(name="getStd", urlPatterns={"/getStd"}) public class getStd extends HttpServlet { @Override public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Connection conn = null; Statement stmt = null; ResultSet rs = null; ArrayList rows = new ArrayList(); res.setCharacterEncoding("UTF-8"); res.setContentType("text/html"); PrintWriter out = res.getWriter(); String sql=null; String test= req.getParameter("sstring"); try{ InitialContext cxt = new InitialContext(); if (cxt == null) { throw new Exception("Uh oh -- no context!");} DataSource ds = (DataSource) cxt.lookup( "jdbc/Sample" ); conn = ds.getConnection(); stmt = conn.createStatement(); sql="Select * from MYDB.dbo.testdb where myField like '%"+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(cols); } req.setAttribute("std", rows); req.setAttribute("query",test ); req.getRequestDispatcher("/showRes.jsp").forward(req, res); // close everything to free up resources rs.close(); rs = null; stmt.close(); stmt = null; conn.close(); / conn = null; rows=null; } catch (SQLException e) { e.printStackTrace(out); } catch (Exception e) { e.printStackTrace(out); } finally { 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 个答案:

答案 0 :(得分:1)

关于keyup的滞后,我认为这与性能问题有关,所以让我先修复它,然后再进行检查。

至于性能方面,您提供的设置信息很少,但初学者经常忽略的两个常见解决方案如下:

  1. 使用合并DataSource而非DriverManager的连接。这样可以节省在每次查询时连接数据库的成本(在没有时间返回池化连接时可能需要200多秒)。有关详细信息,请参阅相关应用程序服务器的JNDI资源配置文档(提示:admin console)。

  2. 在SQL端而不是在Java端限制结果集大小。这节省了通过网络传输无关数据的成本。只需返回前10个结果或其他内容而不是整个表格。有关详细信息,请参阅相关数据库的SQL手册(提示:SET ROWCOUNT)。