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

Posted

技术标签:

【中文标题】使用 Ajax 进行 Java Servlet DB 查询 - 查询时间慢且查询字符串并不总是完全传递给 servlet【英文标题】:Java Servlet DB Query with Ajax - slow query time and querystring not always fully passed to the servlet 【发布时间】:2011-07-01 12:16:36 【问题描述】:

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

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

函数ajaxSearch(字符串)

if (sstring.length

请至少 3 个字符....

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

    
 )

在服务器端我有这个:

@WebServlet(name="getStd", urlPatterns="/getStd") 公共类 getStd 扩展 HttpServlet @覆盖 public void doGet (HttpServletRequest req, HttpServletResponse res) 抛出 ServletException, IOException 连接 conn = null; 语句 stmt = null; 结果集 rs = null; ArrayList 行 = 新的 ArrayList(); res.setCharacterEncoding("UTF-8"); res.setContentType("text/html"); PrintWriter out = res.getWriter(); 字符串 sql=null; 字符串测试= req.getParameter("字符串"); 尝试 InitialContext cxt = new InitialContext(); 如果(cxt == null) 抛出新异常(“哦哦——没有上下文!”); 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); 而(rs.next()) 标准记录列 = 新标准记录(); 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("查询",test ); req.getRequestDispatcher("/showRes.jsp").forward(req, res); // 关闭一切以释放资源 rs.close(); rs = null; stmt.close(); stmt = null; conn.close(); / 连接=空; 行=空; 捕捉(SQLException e) e.printStackTrace(out); 捕捉(异常 e) e.printStackTrace(out); 最后 如果(rs!= null) 试试 rs.close(); 捕捉 (SQLException e) ; rs = null; 如果(stmt!= null) 尝试 stmt.close(); 捕捉 (SQLException e) ; stmt = null; 如果(连接!= null) 试试 conn.close(); 捕捉 (SQLException e) ; 连接=空;

提前致谢。

【问题讨论】:

【参考方案1】:

关于keyup的延迟,我认为这与性能问题有关,所以让我们先解决这个问题,然后再回顾一下。

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

    使用池化连接DataSource 而不是DriverManager。这节省了在每个查询上连接数据库的成本(这可能需要超过 200 毫秒,而池连接会立即返回)。有关详细信息,请参阅相关应用服务器的 JNDI 资源配置文档(提示:admin console)。

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

【讨论】:

感谢您的提示。我很确定我正在使用带有 JTDS 驱动程序的连接池数据源。我搜索了一下,很多专家都推荐了这个,而不是官方的微软,但我不确定。至于您的第二个提示,是的,我计划实施。现在我离开了我的测试环境,但明天我会仔细检查我的连接池和驱动程序设置。再次感谢您的帮助! 嗨!我检查并确定我正在使用连接池数据源。我还使用 SET ROWCOUNT 更改了我的 sql 查询,并且我正在使用preparedstatements。但与常规的 asp ajax 请求相比,这似乎有些滞后。有什么建议吗? 你测量了哪个部分最耗时? javascript请求处理? HTTP 连接? HTTP 请求?数据库连接? SQL 请求? SQL响应处理? HTTP响应处理? Javascript 响应处理? 知道如何测量。我正在使用这个 sql - 这也很慢... public static final String SQLJELZET="SET ROWCOUNT ? SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY ref DESC) AS Row, * FROM dbname.dbo.tbalename where title like ?) AS t2 WHERE Row >= ? AND Row

以上是关于使用 Ajax 进行 Java Servlet DB 查询 - 查询时间慢且查询字符串并不总是完全传递给 servlet的主要内容,如果未能解决你的问题,请参考以下文章

如何使用一个ajax请求从java servlet返回多个json对象

Java Web 技术(JSP 和 servlet)中的 AJAX 自动完成文本框

前端jQuery使用ajax与后端Servlet进行数据交互

Java JSP Jquery AJAX Servlet

Java Servlet:确定请求是不是为 AJAX 的最佳方法

Ajax 将带有两个数组的 JSON 对象发送到一个 servlet 并在没有 jQuery 的情况下在 java servlet 中解析