论坛首页 Java企业应用论坛

性能提升--意见收集贴(数据超过4000条,就明显慢了),代码已贴出

浏览 4582 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-06-25   最后修改:2009-06-25
简单说明下:用hibernate查询数据,OuterTask表记录越来越多(超4000条),感觉查询速度越来越慢.

已经用hibernate分页机制了,为什么还这么慢哦,恼火!
各位走过路过,一定要给点意见啊,谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢啦~

实际效果可见http://www.ctask.cn/项目,别的menu一点就来,就它慢,个NN的。[再加个:数据库是mysql5.0]

package com.affectu.dao.pagination;

import java.util.List;
import org.hibernate.Session;
import com.affectu.category.Category;
import com.affectu.common.util.Helper;
import com.affectu.task.InnerTask;
import com.affectu.task.Task;

/**
 * Oct 13, 2008
 * 
 * @author daniel nathan
 */
public class CategoryTaskDataModel extends BaseDataModel<Task, Long> {

	private Session em = Helper.getInstance().getSession();
	// not use view for optimizing performance
	private String sql = "select t1.* from OuterTask t1 where  t1.tag regexp :tags union all select t2.* from InnerTask t2 where  t2.tag regexp :tags order by publishDate desc  ";

	private String sqlCount = "select count(t.id) from ("
			+ " select t1.id from OuterTask t1 where  t1.tag regexp :tags union all select t2.id from InnerTask t2 where  t2.tag regexp :tags ) t";

	private Category category;

	public CategoryTaskDataModel(Category category) {
		this.category = category;
	}

	@Override
	public Task findById(Long id) {
		return (Task) em.get(Task.class, id);
	}

	@Override
	public Long getCount() {
		// TODO Auto-generated method stub
		Long count;
		count = Long.valueOf(em.createSQLQuery(sqlCount).setParameter("tags",
				this.getTags()).uniqueResult().toString());
		return count;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Task> getList(Integer firstRow, Integer maxResults) {
		// TODO Auto-generated method stub
		return em.createSQLQuery(sql).addEntity("t", InnerTask.class)
				.setParameter("tags", this.getTags()).setFirstResult(firstRow)
				.setMaxResults(maxResults).list();
	}

	private String getTags() {
		List<Category> children = category.getChildren();
		String tags = "";
		for (int i = 0; i < children.size(); i++) {
			tags += "." + children.get(i).getName() + ".|";
		}
		tags += "." + category.getName() + ".";
		tags = tags.replaceAll("[+]*", "");
		return tags;
	}

	public void finalize() {
		em.close();
	}

	public void destroy() {
		em.close();
	}
}


对应的entiy
package com.affectu.task;

import java.io.Serializable;
import javax.persistence.Entity;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.search.annotations.Indexed;
import org.jboss.seam.annotations.Name;
/*
 * 2008-8-15 
 * @author daniel nathan
 */
@Entity
@Name("outerTask")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Indexed
public class OuterTask extends Task implements Serializable {

}


/*
 * 2008-8-15 
 * @author daniel nathan
 */
//@Entity
@Name("task")
@MappedSuperclass()
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Task extends EntityBase implements Serializable {
	@Field(name = "tag", index = Index.TOKENIZED, analyzer = @Analyzer(impl = ChineseAnalyzer.class))
	private String tag;
	private int budget;
	private int bidDay;
	private int finishDay;
	@Temporal(value = TemporalType.TIMESTAMP)
	private Date publishDate;
	private String attachName;
	private String url;
	private Type type;
	public enum Type {
		INNER, OUTER
	}
   发表时间:2009-06-25  
推荐换jdbc or ibatis
...
0 请登录后投票
   发表时间:2009-06-25   最后修改:2009-06-25
select t1.id from OuterTask t1 where  t1.tag regexp :tags union all select t2.id from InnerTask t2 where  t2.tag regexp :tags


你这个语句是不是
outertask表通过tag字段和innertask表的tag字段关联的
为什要用union all呢,直接用字段关联不久可以了么
我觉的你sql这么写会慢
你两个sql都这么写的
...

select t1.id from OuterTask t1 where  t1.tag regexp :tags union all select t2.id from InnerTask t2 where  t2.tag regexp :tags

改为这个吧
select t1.id from OuterTask ,innertask where OuterTask.t1 = innertask.t1 

另一个也做类似修改
0 请登录后投票
   发表时间:2009-06-25  
用jdk1.5+ 麻烦用用自动转型吧
0 请登录后投票
   发表时间:2009-06-25  
用union all 在oracle里面是很慢的
不知道mysql是怎么回事
hibernate 4000条数据慢 肯定不是hibernate的问题
你只有2张表的
你需要看看你sql是不是你需要的sql
0 请登录后投票
   发表时间:2009-06-25  
你直接在这里回复吧
0 请登录后投票
   发表时间:2009-06-25  
没有关联?
说说你sql的作用是什么?
0 请登录后投票
   发表时间:2009-06-25   最后修改:2009-06-25
spyker 写道
用union all 在oracle里面是很慢的
不知道mysql是怎么回事
hibernate 4000条数据慢 肯定不是hibernate的问题
你只有2张表的
你需要看看你sql是不是你需要的sql




其实逻辑不复杂:就是用一个关键字去表里匹配tag字段【有两表,OuterTask,InnerTask,结构一样,用正则匹配法】,如果匹配上则返回出来,最后把两表的结果合并一下。

补充:没用like,因为exp更灵活,可以同时达到*key1*|*key2*|...的效果,类似反向匹配,比如tag为紫竹,那么紫竹桥,紫竹院,紫竹路均符合
0 请登录后投票
   发表时间:2009-06-25  
jmzwcn 写道
spyker 写道
用union all 在oracle里面是很慢的
不知道mysql是怎么回事
hibernate 4000条数据慢 肯定不是hibernate的问题
你只有2张表的
你需要看看你sql是不是你需要的sql




其实逻辑不复杂:就是用一个关键字去表里匹配tag字段【有两表,OuterTask,InnerTask,结构一样,用正则匹配法】,如果匹配上则返回出来,最后把两表的结果合并一下。

补充:没用like,因为exp更灵活,可以同时达到*key1*|*key2*|...的效果,类似反向匹配,比如tag为紫竹,那么紫竹桥,紫竹院,紫竹路均符合

按照你说的你的sql写的有问题哦...
其实就是
select t1.id
   from
     OuterTask ,innertask
   where OuterTask.t1 = innertask.t1  
     and t1 like ‘%紫竹%’

其实就是两张表关联 前后模糊查询
end
0 请登录后投票
   发表时间:2009-06-25  
spyker 写道
jmzwcn 写道
spyker 写道
用union all 在oracle里面是很慢的
不知道mysql是怎么回事
hibernate 4000条数据慢 肯定不是hibernate的问题
你只有2张表的
你需要看看你sql是不是你需要的sql




其实逻辑不复杂:就是用一个关键字去表里匹配tag字段【有两表,OuterTask,InnerTask,结构一样,用正则匹配法】,如果匹配上则返回出来,最后把两表的结果合并一下。

补充:没用like,因为exp更灵活,可以同时达到*key1*|*key2*|...的效果,类似反向匹配,比如tag为紫竹,那么紫竹桥,紫竹院,紫竹路均符合

按照你说的你的sql写的有问题哦...
其实就是
select t1.id
   from
     OuterTask ,innertask
   where OuterTask.t1 = innertask.t1  
     and t1 like ‘%紫竹%’

其实就是两张表关联 前后模糊查询
end



rs:OuterTask和InnerTask彼此独立,用OuterTask.t1 = innertask.t1 用意何在?


分两步看,第一部:各查各的,分别得到各自的resultSet,第二步,把两个resultSet合并
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics