初试cblib动态代理

来源:互联网 发布:java线程池的使用例子 编辑:程序博客网 时间:2024/05/01 02:33

 最近改之前做的系统做论文题材,数据库由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

原创粉丝点击