⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqlquerycommand.java

📁 mysql集群
💻 JAVA
字号:
package com.meidusa.amoeba.sqljep.function;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

import com.meidusa.amoeba.context.ProxyRuntimeContext;
import com.meidusa.amoeba.net.poolable.ObjectPool;
import com.meidusa.amoeba.sqljep.ASTFunNode;
import com.meidusa.amoeba.sqljep.JepRuntime;
import com.meidusa.amoeba.sqljep.ParseException;
import com.meidusa.amoeba.util.Initialisable;
import com.meidusa.amoeba.util.InitialisationException;
import com.meidusa.amoeba.util.StringUtil;
import com.meidusa.amoeba.util.ThreadLocalMap;

/**
 * 请使用@see JdbcConnectionFactory 提供的pool
 * @author struct
 *
 */
public class SqlQueryCommand extends PostfixCommand implements Initialisable{
	private static Logger logger = Logger.getLogger(SqlQueryCommand.class);
	private String sql;
	public void setPoolName(String poolName) {
		this.poolName = poolName;
	}

	private String poolName;
	private int parameterSize=1;
	
	/**
	 * enable threadlocal cache or not
	 */
	private boolean threadLocalCache = false;
	public boolean isThreadLocalCache() {
		return threadLocalCache;
	}

	public void setThreadLocalCache(boolean threadLocalCache) {
		this.threadLocalCache = threadLocalCache;
	}

	public void setSql(String sql) {
		this.sql = sql;
	}

	@Override
	public Comparable<?>[] evaluate(ASTFunNode node, JepRuntime runtime)
			throws ParseException {
		
		node.childrenAccept(runtime.ev, null);
		
		Comparable<?>[] parameters = null;
		parameters = new Comparable<?>[parameterSize] ;
		for(int i=parameterSize-1;i>=0;i--){
			parameters[i] = runtime.stack.pop();
		}
		return parameters;
	}

	private Map<String,Object> query(Comparable<?>[] parameters){
		ObjectPool pool =  ProxyRuntimeContext.getInstance().getPoolMap().get(poolName);
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		
		try{
			Map<String,Object> columnMap = null;
			conn = (Connection)pool.borrowObject();
			st = conn.prepareStatement(sql);
			if(parameters != null){
				for(int i=0;i<parameters.length;i++){
					if(parameters[i] instanceof Comparative){
						st.setObject(i+1, ((Comparative)parameters[i]).getValue());
					}else{
						st.setObject(i+1, parameters[i]);
					}
				}
			}
			
			rs = st.executeQuery();
			ResultSetMetaData metaData = rs.getMetaData();
			if(rs.next()){
				columnMap= new HashMap<String,Object>();
				for(int i=1;i<=metaData.getColumnCount();i++){
					String columnName = metaData.getColumnName(i);
					String label = metaData.getColumnLabel(i);
					Object columnValue = rs.getObject(i);
					if(label!= null && !StringUtil.equalsIgnoreCase(label, columnName)){
						columnMap.put(label.toLowerCase(), columnValue);
					}
					columnMap.put(columnName.toLowerCase(), columnValue);
				}
			}
			return columnMap;
		}catch(Exception e){
			logger.error("execute sql error :"+sql,e);
			return null;
		}finally{
			if(rs != null){
				try {
					rs.close();
				} catch (SQLException e1) {
				}
			}
			
			if(st != null){
				try {
					st.close();
				} catch (SQLException e1) {
				}
			}
			
			if(conn != null){
				try {
					pool.returnObject(conn);
				} catch (Exception e) {
				}
			}
			
		}
	}
	@Override
	public int getNumberOfParameters() {
		return parameterSize;
	}

	public void init() throws InitialisationException {
		parameterSize = ProxyRuntimeContext.getInstance().getQueryRouter().parseParameterCount(null, sql)+1;
	}

	@SuppressWarnings("unchecked")
	public Comparable<?> getResult(Comparable<?>... comparables)
			throws ParseException {
		String returnColumnName = null;
		returnColumnName = comparables[0].toString().toLowerCase();
		
		Map<String,Object> result = null;
		Comparable<?>[] parameters = new Comparable<?>[comparables.length-1];
		if(isThreadLocalCache()){
			
			int threadLocalKey = this.hashCode();
			if(parameterSize>1){
				int hash = this.hashCode();
				for(int i=0;i<parameters.length;i++){
					parameters[i] = comparables[i+1];
					hash ^= parameters[i].hashCode() << (i+1);
				}
				threadLocalKey = threadLocalKey ^ hash;
			}
			
			result = (Map<String,Object>)ThreadLocalMap.get(threadLocalKey);
			if(result == null){
				if(!ThreadLocalMap.containsKey(threadLocalKey)){
					result = query(parameters);
					ThreadLocalMap.put(threadLocalKey,result);
				}
			}
		}else{
			result = query(parameters);
		}
		if(result == null){
			return (null);	
		}else{
			return ((Comparable<?>)result.get(returnColumnName));
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -