年华是封无效信 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条)

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)