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

📄 sqltranslator.java

📁 《j2ee开发全程实录》随书源码
💻 JAVA
字号:
package com.cownew.PIS.framework.common.multisql;

import java.sql.SQLException;
import java.util.Map;

import net.sf.cglib.proxy.Enhancer;

import org.apache.commons.collections.map.LRUMap;
import org.ldbc.adapter.DB2;
import org.ldbc.adapter.MySQL;
import org.ldbc.adapter.Oracle;
import org.ldbc.adapter.SQLServer;
import org.ldbc.core.Adapter;
import org.ldbc.parser.Translator;

import com.cownew.PIS.framework.server.helper.ServerConfig;

public class SQLTranslator
{
	private Translator translator;

	private TargetDBEnum targetDB;

	private static Map sqlMap;

	private SQLTranslator(TargetDBEnum targetDB)
	{
		this.targetDB = targetDB;
		// 因为LDBC对autoIncGetColumn等方法处理与我们的要求不符,因此采用CGLIB生成子类来覆盖这些方法
		Enhancer enhancer = new Enhancer();
		enhancer.setCallback(new SQLAdapaterInterceptor());

		if (targetDB == TargetDBEnum.MSSQLSERVER)
		{
			enhancer.setSuperclass(SQLServer.class);
		} else if (targetDB == TargetDBEnum.DB2)
		{
			enhancer.setSuperclass(DB2.class);
		} else if (targetDB == TargetDBEnum.ORACLE)
		{
			enhancer.setSuperclass(Oracle.class);
		} else if (targetDB == TargetDBEnum.MYSQL)
		{
			enhancer.setSuperclass(MySQL.class);
		} else
		{
			throw new AssertionError();
		}
		translator = new Translator((Adapter) enhancer.create());
	}

	public static SQLTranslator getInstance(TargetDBEnum targetDB)
	{
		SQLTranslator t = new SQLTranslator(targetDB);
		return t;
	}

	// 缓存,缓存算法,LRU
	public String translate(String stdSQL)
	{
		// 因为存在一个服务器连接多种不同数据库的情况,因此要用数据库种类和sql连接起来做key
		String mapKey = targetDB + stdSQL;
		String cacheSQL = (String) sqlMap.get(mapKey);
		if (cacheSQL != null)
		{
			return cacheSQL;
		}

		try
		{
			//String vendorSQL = TranslatorUtils.translateSQL(stdSQL,DataBaseTypeEnum.MSSQLServer);
			String vendorSQL = translator.translate(stdSQL).getVendorSQL();
			sqlMap.put(mapKey, vendorSQL);
			return vendorSQL;
		} catch (SQLException e)
		{
			String msg = e.getMessage();
			// 因为翻译过程中抛出的异常的Throwable对象中包含不能序列化的对象,比如CommonToken,因此不能把e传给客户端
			// 只能在此把异常消息传递
			throw new SQLTranslateException(
					SQLTranslateException.TRANSLATEERROR, new Object[] { msg });
		}
	}

	static
	{
		sqlMap = new LRUMap(ServerConfig.getInstance().getMultiSQLCacheSize());
	}
}

⌨️ 快捷键说明

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