content: package com.alimama.web;
  
  import java.io.IOException;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.SQLException;
  import java.sql.Statement;
  import java.util.List;
  import java.util.concurrent.atomic.AtomicBoolean;
  
  import javax.servlet.jsp.JspWriter;
  
  import com.alimama.mdrill.jdbc.MdrillQueryResultSet;
  public class Sql {
  	
  	public static class HeartBeat implements Runnable
  	{
  		public Object lock=new Object();
  
  		JspWriter out;
  		public HeartBeat(JspWriter out) {
  			super();
  			this.out = out;
  		}
  		AtomicBoolean isstop=new AtomicBoolean(false);
  		
  
  		public void setIsstop(boolean isstop) {
  				this.thrStop.set(isstop);
  		}
  		
  		AtomicBoolean thrStop=new AtomicBoolean(false);
  
  		public boolean isstop()
  		{
  			return thrStop.get();
  		}
  		
  
  		@Override
  		public void run() {
  			while(true)
  			{
  					if(this.thrStop.get())
  					{
  						thrStop.set(true);
  						return ;
  					}
  				try {
  					synchronized (this.lock) {
  						if(this.out!=null)
  						{
  							this.out.write(" ");
  							this.out.flush();
  						}
  					}
  				} catch (Throwable e) {
  				}
  				
  				try {
  					Thread.sleep(1000);
  				} catch (InterruptedException e) {
  				}
  			}
  			
  		}
  		
  	}
  	
  public static void execute(String sql,String connstr,JspWriter out) throws ClassNotFoundException, SQLException, IOException
  {
  	HeartBeat hb=new HeartBeat(out);
  	new Thread(hb).start();
  	StringBuffer buff=new StringBuffer();
  	long time1=System.currentTimeMillis();
  
  	Class.forName("com.alimama.mdrill.jdbc.MdrillDriver");
  
  	Connection con = DriverManager.getConnection(connstr, "", "");
  
  	Statement stmt = con.createStatement();
  	
  	  String lowercase=sql.toLowerCase();
  	    if(lowercase.indexOf("insert")>=0&&lowercase.indexOf("into")>0 && lowercase.indexOf("values")>0)
  	    {
  	    	stmt.execute(sql);
  	    	buff.append("执行完毕<br>\r\n");
  	    	buff.append("<br>\r\n");
  	    }else{
  
  				MdrillQueryResultSet res = null;
  			
  				res = (MdrillQueryResultSet) stmt.executeQuery(sql);
  				buff.append("totalRecords:"+res.getTotal());
  				buff.append("<br>\r\n");
  				buff.append("<table border=1><tr>");
  				List<String> colsNames = res.getColumnNames();
  				for (int i = 0; i < colsNames.size(); i++) {
  					buff.append("<td>");
  				    buff.append(colsNames.get(i));
  				    buff.append("</td>");
  				}
  				buff.append("</tr>");
  				while (res.next()) {
  					buff.append("<tr>");
  				    for (int i = 0; i < colsNames.size(); i++) {
  				    	buff.append("<td>");
  					buff.append(res.getString(colsNames.get(i)));
  					buff.append("</td>");
  				    }
  				    buff.append("</tr>");
  				}
  				con.close();
  				buff.append("</table>");
  				
  	    }
  	    long time2=System.currentTimeMillis();
  	    buff.append("times taken "+((time2-time1)*1.0/1000)+" seconds");
  	    buff.append("<br>\r\n");
      
      hb.setIsstop(true);
      while(!hb.isstop())
      {
      	try {
  			Thread.sleep(100);
  		} catch (InterruptedException e) {
  		}
      }
      
      synchronized (hb.lock) {
  		out.write(buff.toString());
  	}
  
      
  }
  }
  