年华是封无效信 2011-05-04 17:20
浏览 876
已采纳

菜鸟的代码 性能差 不知道如何优化。

半年javaweb开发 性能很差 请各位老鸟拍砖 点评下  小弟先谢过了
补充一点  我觉得我这里慢的主要原因都是因为关联的太多  where后面的条件也多  我刚开始时条件不多 关联也不多 速度明显要快的多  这里有什么方法可以解决吗


public Paginate getBookInfoByPublishDateAndPublisher(Paginate paginate,
String unionSiteID,String publisher, Date fromDate, Date toDate, String bookName,
Double price1, Double price2, String vendor, String bookCategory) {
// TODO Auto-generated method stub
StringBuffer whereCause =new StringBuffer( "not exists(select l from UnionSiteProductList l where l.unionSiteID=? and b.bookID =l.productID)");
Vector paras = new Vector();
paras.add(unionSiteID);
if (publisher != null && publisher.trim().length() > 0) {
whereCause.append( (whereCause.length() > 0 ? " and " : "")
+ "b.publisherName like ?");
paras.add("%" + publisher + "%");
}
if (fromDate != null) {
whereCause.append( (whereCause.length() > 0 ? " and " : "")
+ "b.publishDate >= ?");
paras.add(fromDate);
}
if (toDate != null) {
whereCause.append( (whereCause.length() > 0 ? " and " : "")
+ "b.publishDate <= ?");
paras.add(toDate);
}
if (bookName != null && bookName.trim().length() > 0) {
whereCause.append((whereCause.length() > 0 ? " and " : "")
+ "b.bookName like ?");
paras.add("%" + bookName + "%");
}
if (price1 != null) {
whereCause.append( (whereCause.length() > 0 ? " and " : "")
+ "pp.productPrice >= ?");
paras.add(price1);
}
if (price2 != null) {
whereCause.append( (whereCause.length() > 0 ? " and " : "")
+ "pp.productPrice <= ?");
paras.add(price2);
}
if (vendor != null && vendor.trim().length() > 0) {
whereCause.append((whereCause.length() > 0 ? " and " : "")
+ "v.vendorName like ?");
paras.add("%" + vendor + "%");
}
if (bookCategory != null && bookCategory.trim().length() > 0) {
whereCause.append( (whereCause.length() > 0 ? " and " : "")
+ "bcv.bookCategoryName like ?");
paras.add("%" + bookCategory + "%");
}
String hql = "select b,pp,v,bcv from Book b,ProductItem i,Product p, "
+ "ProductPrice pp,Vendor v,BookCategoryView bcv "
+ " where b.bookID=i.entityID and b.deleteFlag=0 and b.flag=4 "
+ " and i.entityType=1 and i.deleteFlag=0"
+ " and i.productID=p.productId and p.productType=1 and p.deleteFlag=0 and p.isValid=1"
+ " and p.productId=pp.productId and pp.deleteFlag=0"
+ " and b.vendorID = v.vendorID "
+ " and b.bookCategoryCode=bcv.bookCategoryCode ";
    if (whereCause.length() &gt; 0) {
        hql = hql + " and " + whereCause;
    }
    paginate = this.pagedQuery(hql, paginate, paras.toArray());
    return paginate;
}



问题补充
没人来?  我先自己弄个沙发 。。。 
问题补充
haoxun 写道
判断空的语句为什么不封装一下呢;每次都写不是很累;
放在一个ValidateUtil.isNull(String param) 里面多好;
我不知道你用的是什么框架还是纯的JDBC,如果用的是框架的话可以用其自带的分页,查询条件类似ibatis有动态SQL都可以用的;纯的去拼凑也是可以的。
不过都可以封装成一个方法; SQLUtil.addCause(String filed,String express) 这样代码复用稍微提高一点,美观一点;个人愚见,仅供参考

谢谢  我用的S2SH框架  拼凑SQL 这个也想过  只是感觉修改起来太麻烦 得从数据库修改入手
问题补充
lyw985 写道
所谓的性能差是什么意思?

1.修改方法难
2.获取数据慢


主要是获取数据慢
问题补充
aaronwong_best 写道
我只想知道,半年的你,现在多少米???

成都 2K+
问题补充
wuxianjun 写道
你把sql打印出来去数据库查询下看需要多长时间。
如果时间很长的话分析出查询耗时在那里,然后做优化。
1,最简单的建索引,但这样插入会变慢,后期要修复索引。
2,改表结构,做数据冗余。
3,数据缓存
......等等
本人觉得连表查询不是最后的方法,尽量少用。当数据量大连表多的时候就会有性能问题了。


那用视图可不可以呢
问题补充
天泪不死 写道
你这sql语句有些小的注意影响性能的地方太多
1.关联多的时候,可能把各表的这种数字条件放前面i.entityType=1这种关联条件b.bookID=i.entityID放后面
2.多条件下,数字条件在前,字符串条件在后
3.不要用过多的模糊查询,模糊查询用不上索引,会废了整个高效sql
4.精确条件放前面,模糊条件放后面
别小看放置顺序,看看数据库原理sql执行方面的你会懂的....
就说这么些

受教了  谢谢你
问题补充
liuyfly 写道
za3999 写道
带十个参数的方法。。。NB。。


是啊 佩服啊 十个参数。。。我还没写过超过四个参数的方法呢。。。看来是少见多怪了,唉!


呵呵 小弟是菜鸟  就别贬我了  这不需求的嘛  我也不想啊 
问题补充
bestchenwu 写道
楼主可以看下《重构:改善既有代码的设计》 会对你有不少的帮助的

谢谢你  有时间我会去看的
问题补充
幻无极 写道
你试着把一部分条件加到()里,我原来碰到过一次蛋疼的问题,整个查没什么,后来加了才几个条件就用了好几倍的时间觉得不正常,结果把查询的多个条件放进了()里就好了,我琢磨着不把查询条件放进括号是会对每条记录进行过滤,加了括号优先把前面的查询做完了,在从查询过的结果中进行过滤,也只能这么猜测了
你可以试着把容易过滤的条件放在前面

我和你的问题差不多  我去试一下
  • 写回答

55条回答 默认 最新

  • 西游工作室 2011-05-04 17:20
    关注
    1. String hql = "select b,pp,v,bcv from Book b,ProductItem i,Product p, "

      + "ProductPrice pp,Vendor v,BookCategoryView bcv "

      + " where b.bookID=i.entityID and b.deleteFlag=0 and b.flag=4 "

      + " and i.entityType=1 and i.deleteFlag=0"

      + " and i.productID=p.productId and p.productType=1 and p.deleteFlag=0 and p.isValid=1"

      + " and p.productId=pp.productId and pp.deleteFlag=0"

      + " and b.vendorID = v.vendorID "

      + " and b.bookCategoryCode=bcv.bookCategoryCode ";

      不需要改成 StringBulider或StringBuffer,因为这样累加,始终是一个String对象,例如:
      String str1 = "hello " + "word" ;
      String str2 ="hello word" ;

      str1 = stru2

    2. 你的SQL,可以优化,like 不要前后都用 %,这样会全表扫描

    3. 判断是否为空,可以试试用 apache 的 StringUtils

    4. 方法参数太多,需要封装,提高可读性,你的代码严格的静态检查,肯定过不了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(54条)

报告相同问题?

悬赏问题

  • ¥15 wamp3.3.5安装完成后图标正常显示绿色,鼠标左右键点击图标均无反应。求解决方法。
  • ¥15 鼠标点击的这条记录了什么?
  • ¥15 在写pid调速的程序时,电机始终维持最大速度
  • ¥15 请问如何查看手机root记录?
  • ¥15 商城小程序订单号重复
  • ¥15 学校优化算法sbo和蚁群算法怎么结合
  • ¥21 matlab怎么求时域信号的二阶导数
  • ¥15 判断两个表是否完全相同
  • ¥15 java map类型数据格式,如何快速通过前缀匹配元素
  • ¥15 stc12c5a60s2、QMC5883L、LCD1602组合测量磁场所需程序