初试cblib动态代理

初试cblib动态代理,第1张

概述 最近改之前做的系统做论文题材,数据库由MSsqlserver2000改成了PostgreSQL8.4,在数据库结构方面做了些调整,性能出现了明显的差异。由于存在空间数据,之前在sqlserver里我是把地理数据转出xml格式以varbinary(8000)类型存储的;现在则采用了PostgreSQL支持的空间数据存储类型。算法是相似的,相同的计算方案性能相差两倍:sqlserver中耗时300m

最近改之前做的系统做论文题材,数据库由MSsqlserver2000改成了Postgresql8.4,在数据库结构方面做了些调整,性能出现了明显的差异。由于存在空间数据,之前在sqlserver里我是把地理数据转出xml格式以varbinary(8000)类型存储的;现在则采用了Postgresql支持的空间数据存储类型。算法是相似的,相同的计算方案性能相差两倍:sqlserver中耗时300ms,Postgresql耗时700ms;我想找出瓶颈在哪里?是连接数据库读取还是算法上的变动造成的,于是想在读取数据库时加一个时间统计,由于DAO读取数据的方法很多,所以想起了动态代理。jdk本身的动态代理只支持基于接口的代理方式,而我没有定义接口:(。先前学过一点spring,知道有个cglib代理可以实现基于类的代理。马上实现试试。

目标类:DBUtil

代理类:

public class DBInvokeImpl implements MethodInterceptor {

private static double time = 0.0;
private double startTime=0.0;
private Object targetobject;//要代理的目标对象
/*
* 这个方法也可以写在外面实现
*/
public Object newProxy(Object targetobject) {
this.targetobject = targetobject ;
Enhancer enhancer = new Enhancer();//该类用于生成代理对象
enhancer.setSuperclass(this.targetobject.getClass());//设置父类
enhancer.setCallback(this);//设置回调对象为本身
return enhancer.create();//通过字节码技术动态创建子类实例
}
@OverrIDe
public Object intercept(Object proxy,Method method,Object[] args,MethodProxy methodProxy) throws Throwable {
Object result = null;;

dobefore();
try{
result = methodProxy.invokeSuper(proxy,args);//调用原始对象的方法
doAfter();
}catch (Exception e) {
e.printstacktrace();
doWhenException();
}finally{
doFinally();
}
return result;
}

private voID dobefore() {
startTime = System.currentTimeMillis();
}

private voID doAfter() {
time += System.currentTimeMillis()-startTime;
}

private voID doWhenException() {
//System.out.println("WhenException method invoke!");
}

private voID doFinally() {
//System.out.println("Finally method invoke!");
}

public double getTime(){
return time;
}
}

连接测试:

DBInvokeImpl dbProxy = new DBInvokeImpl();
DBUtil db = (DBUtil)dbProxy.newProxy(new DBUtil());
MatrixBean matrix = db.getMatrix();
double start = System.currentTimeMillis();
matrix.s2sProject(83,71);
double usetime = System.currentTimeMillis()-start;
System.out.println(usetime/1000+"秒");
System.out.println("数据库连接耗时:"+dbProxy.getTime()+"ms");

测试结果:sqlserver连接耗时:219ms;Postgresql连接耗时:266ms;差距不大。看来问题出在结构调整后的算法改动。于是继续测试,最终瓶颈在读取地理坐标的比较上。继续想办法改进ing

总结

以上是内存溢出为你收集整理的初试cblib动态代理全部内容,希望文章能够帮你解决初试cblib动态代理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1180335.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存