📄 sqltranslator.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 + -