在公司开发了一套hiveAdmin系统,此系统的主要功能类似于PLSQL Developer,pgAdmin等软件,为的是给熟悉sql语句,但是不熟悉hive的数据分析师等人员方便操作hive。在实际工作中确实有些查询语句执行时间比较长,但是IE等浏览器默认等待响应的时间是5分钟,也就是说如果一个http请求超过5分钟还没有响应,那么页面就会出现超时的情形,见下图。
解决方法:
主要描述:本系统使用的是struts框架,所以可以在action中启动一个子线程执行查询,主线程则判断子线程的查询结果,在结果未返回之前,主线程则reponse查询状态之类的信息给客户端,以确保上图的问题不发生,可response一些友好而字节比较少的提示信息给前台页面,并且查询结果页面在此action方法中生成,不能用mapping.findForward("****")方法到一个jsp页面。
实际代码(下面代码截取与action方法中):
final PrintWriter out = resp.getWriter();
out.write("查询正在进行中...");
out.flush();
new Thread()//启动一个子线程异步查询
{
@Override
public void run() {
logger.info("查询数据的子线程开始运行。。。。。。");
//下面的result是实际的结果集。
result = hiveExecuteAO.execute(hq, user, hr, flag );
logger.info("查询数据的子线程运行结束。。。。。。");
synchronized(this)
{
this.notify();
}
};
}.start();
while(result==null)
{
Thread.sleep(1000);
out.write(".");
out.flush();
}
out.write("查询结束");
out.flush();
//结果查询处理后
//动态生成jsp页面--------参照sql-result.jsp页面生成-----begin
logger.info("开始生成页面.......................");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.write("<html>");
out.write("<body>");
out.write("实际的结果代码,此处省略n个字");
out.write("</body>");
out.write("</html>");
out.flush();
logger.info("生成页面结束.......................");
return null;