我正在尝试使用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; } } } }
提前致谢。
答案 0 :(得分:1)
关于keyup的滞后,我认为这与性能问题有关,所以让我先修复它,然后再进行检查。
至于性能方面,您提供的设置信息很少,但初学者经常忽略的两个常见解决方案如下:
使用合并DataSource
而非DriverManager
的连接。这样可以节省在每次查询时连接数据库的成本(在没有时间返回池化连接时可能需要200多秒)。有关详细信息,请参阅相关应用程序服务器的JNDI资源配置文档(提示:admin console)。
在SQL端而不是在Java端限制结果集大小。这节省了通过网络传输无关数据的成本。只需返回前10个结果或其他内容而不是整个表格。有关详细信息,请参阅相关数据库的SQL手册(提示:SET ROWCOUNT
)。