该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-25
最后修改:2009-06-25
已经用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 } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-25
推荐换jdbc or ibatis
... |
|
返回顶楼 | |
发表时间: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 另一个也做类似修改 |
|
返回顶楼 | |
发表时间:2009-06-25
用jdk1.5+ 麻烦用用自动转型吧
|
|
返回顶楼 | |
发表时间:2009-06-25
用union all 在oracle里面是很慢的
不知道mysql是怎么回事 hibernate 4000条数据慢 肯定不是hibernate的问题 你只有2张表的 你需要看看你sql是不是你需要的sql |
|
返回顶楼 | |
发表时间:2009-06-25
你直接在这里回复吧
|
|
返回顶楼 | |
发表时间:2009-06-25
没有关联?
说说你sql的作用是什么? |
|
返回顶楼 | |
发表时间: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为紫竹,那么紫竹桥,紫竹院,紫竹路均符合 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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合并 |
|
返回顶楼 | |