一劳永逸的数据库编码解决方案2节能
民生娱乐 2020-11-08 08:09 字号: 大 中 小
public Statement getStatement() {
Class[] interfaces = tClass().getInterfaces();
if(interfaces==null||ngth==0){
interfaces = new Class[1];
interfaces[0] = ass;
}
Statement stmt = (Statement)wProxyInstance(
tClass().getClassLoader(),
interfaces,this);
return stmt;
}
/**
* 方法接管
*/
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
String method = tName(); //接管setString方法
if(decode uals(method)) {
try{
String param = (String)args[1];
if(param!=null)
param = new String(tBytes(),"8859_1");
return voke(statement,new Object[]{args[0],param});
} catch(InvocationTargetException e){
throw tTargetException(); }
}
//接管executeQuery方法
if(decode uals(method)){
try{
ResultSet rs = (ResultSet)voke(statement,args);
return new _ResultSet(rs,decode).getResultSet();
}catch(InvocationTargetException e){
throw tTargetException();
}
}
try{
return voke(statement, args);
} catch(InvocationTargetException e) {
throw tTargetException();
}
}
//两个要接管的方法名
private final static String SETSTRING = "setString";
private final static String EXECUTEQUERY = "executeQuery";
}
_va
/*
* Created on by Liudong
*/
package ol;
import sultSet;
import vocationHandler;
import vocationTargetException;
import thod;
import oxy;
/**
* 数据库结果集的代理类
* @author Liudong
*/
class _ResultSet implements InvocationHandler{
private ResultSet rs = null;
private boolean decode = false;
public _ResultSet(ResultSet rs,boolean decode) {
= rs;
code = decode;
}
public ResultSet getResultSet(){
Class[] interfaces = tClass().getInterfaces();
if(interfaces==null||ngth==0){
interfaces = new Class[1];
interfaces[0] = ass;
}
ResultSet rs2 = (ResultSet)wProxyInstance(tClass().getClassLoader(),
interfaces,this);
return rs2;
}
/**
* 结果getString方法
*/
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
String method = tName();
if(decode uals(method)){
try{
近日又曝出德国情报机构一名雇员涉嫌为美国提供情报。德外交部4日就此事召见美驻德大使约翰埃默森String result = (String)voke(rs,args);
if(result!=null)
return new String(tBytes("8859_1"));
return null;
}catch(InvocationTargetException e){
throw tTargetException();
}
}
try{
return voke(rs, args);
}catch(InvocationTargetException e){
throw tTargetException();
}
}
pri在世界范围内迅速传播vate final static String GETSTRING = "getString";
} 现在我们已经把三个接口的代理类做好了,下一步就是怎么来使用这三个类。其实对于使用者来讲并不需要关心三个类,只需要了解_Connection就可以了,因为另外两个是_Connection直接调用的。为了使用_Connection我们必须传入两个参数,第一个是数据库实际的数据库连接实例,另外一个是布尔值代表是否进行转码处理。我们必须先通过实际的情况获取到数据库连接后再传入_Connection的构造函数作为参数,下面例子告诉你如何来使用_Connection这个类: Connection conn = getConnection(); //获取数据库连接boolean coding = false; //从配置或者其他地方读取是否进行转码的配置//接管数据库连接实例_Connection _conn = new _Connection(conn,coding);//获得接管后的数据库连接实例,以后直接使用conn2而不是connConnection conn2 = _tConnection();
因为对一个应用系统来讲,数据库连接的获取必然有统一的方法,在这个方法中加入对连接的接管就可以一劳永逸的解决数据库的编码问题。 性能比较 功能没有问题了,开发者接下来就会关心性能的问题,因为在进行一些对响应速度要求很高或者大数据量的处理情况下性能就成为一个非常突出的问题。由于JAVA中的动态接口代理采用的是反射(Reflection)机制,同时又加入我们自己的一些代码例如方法名判断,字符串转码等操作因此在性能上肯定比不上直接使用没有经过接管的数据库连接。但是这点性能上的差别是不是我们可以忍受的呢,为此我做了一个试验对二者进行了比较: 测试环境简单描述: 使用ACCESS数据库,建两张结构一样的表,计算从获取连接后到插入数据完毕后的时间差,两个程序(直连数据库和使用连接接管)都进行的字符串的转码操作。 测试结果: 插入记录数 直连数据库程序耗时 单位:ms 使用连接接管程序耗时 性能比较 1000 2063 2250 9.0% 5000 8594 8359 -2.7% 10000 16750 17219 2.8% 15000 22187 23000 3.6% 20000 27031 27813 2.9%
从上面这张测试结果表中来看,二者的性能的差别非常小,尽管在两万条数据的批量插入的时候时间差别也不会多于一秒钟,这样的结果应该说还是令人满意的,毕竟为了程序良好的结构有时候牺牲一点点性能还是值得的。 本文算是我之前文章《使用JAVA动态代理实现数据库连接池》中提出的数据库连接池实现的进一步完善,同样使用动态接口代理的技术来解决数据库编码的问题。JAVA的这个高级技术可以用来解决许多实际中非常棘手的问题,就像本文提到的编码问题的处理以及数据库连接池的实现,同时在WEB开发框架的实现上也有非常大的作为。欢迎对这方面感兴趣的朋友来信共同来研究。
乐山好的白癜风医院碧凯保妇康栓生肌茂名白斑医院-
-
观点孔蒂是大顶尖教练之一切尔西有他太幸运搭配
观点:孔蒂是大顶尖教练之一 切尔西有他太幸运埃梅内洛:孔...
2020-05-28 | 民生娱乐
-
-
观山湖区加强防护巡查确保道路安全
观山湖区加强防护巡查 确保道路安全连日来因强降雨天气导致...
2019-12-17 | 民生娱乐
-
-
介休市举办法治大讲堂
介休市举办法治大讲堂运用法治思维方式维护社会和谐稳定9月...
2019-07-16 | 民生娱乐
-
-
遂宁市船山区民政局组织全区民政系统工作人
遂宁市船山区民政局组织全区民政系统工作人员开展综合减灾...
2019-07-15 | 民生娱乐
-
-
扎兰屯市民政局召开两学一做学习教育常态化
扎兰屯市民政局召开“两学一做”学习教育常态化制度化推进...
2019-07-12 | 民生娱乐
-
-
沙土镇各党支部召开专题组织生活会
沙土镇各党支部召开专题组织生活会近日沙土镇组织各党支部...
2019-07-07 | 民生娱乐