最近改之前做的系统做论文题材,数据库由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 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|