1).在结合Spring时,在DAO层通过使用HibernatTemplate已经封装session的操作。如果在项目中仅仅使用Hibernate框架的话,那么在DAO层对每一个PO对象总是需要对Sesson进行open和close的操作。这样岂不是很会影响性能?请问,有没有什么方法可以改进?
2).关于使用Hibernate进行分页,能不能使用一个通用性的分页功能!这样就可以针对每一个PO对象进行相应的分页查询!!
2).关于使用Hibernate进行分页,能不能使用一个通用性的分页功能!这样就可以针对每一个PO对象进行相应的分页查询!!
解决方案 »
- 求助 java怎么操作excl导入导出oracle数据库啊
- ibatis+spring+struts2 的问题
- 关于hibernate中的缓存
- ajax+jsf+spring+hibernate
- 求职 JAVA 程序员 谁想收小弟啊
- JAXB性能怎么样?
- web工程,上传到服务器出现乱码?求解答
- 在hibernate中,用Middlegen-Hibernate来实现对数据库中表的映射的问题???
- 在Microsoft的SQLServer 2000 Driver for JDBC里,Connection reset是为什么?
- javamail 收邮件问题 急 在线等
- java 字符串处理
- 最简单的struts2 实验 出错了,求指点
1.如果对Sesson不进行open和close的操作,那么容易将数据库连接池的资源耗尽,导致对数据库的操作失败。
2.同意一楼意见。
public class CommonDAOHibImpl extends HibernateDaoSupport implements CommonDAO {
/**
* 传一个hql语句过来,把结束存进pageResult
*/
public void listByPage(String hql, PageResult pageResult) {
if (null==hql || pageResult== null ){
return ;
}
Query query = this.getSession().createQuery(hql);
query.setFirstResult(pageResult.getFirstRec());
query.setMaxResults(pageResult.getPageSize());
List ret = query.list();
pageResult.setList(ret); String queryString = "";
if (hql.toUpperCase().indexOf("SELECT") != -1) {
int i = query.getQueryString().toUpperCase().indexOf("FROM");
queryString = "Select count(*) " + hql.substring(i,hql.length());
} else {
queryString = "Select count(*) " + hql;
}
// 去掉ORDER BY 的部分
int j = queryString.toUpperCase().lastIndexOf("ORDER");
if (j!=-1){
queryString = queryString.substring(0, j);
}
Query cquery = this.getSession().createQuery(queryString);
cquery.setCacheable(true);
int recTotal = ((Integer)cquery.iterate().next()).intValue();
pageResult.setRecTotal(recTotal);
}
}/**
* 让FormBean继承之BaseForm,因为通过struts访问的FormBean是自动存放在request里面的,这样就可* 以直接在页面通过以下标签循环出来
* <logic:iterate id="item" name="FormBean"property="pageResult.list"></logic:iterate>
*/
public class BaseForm extends ActionForm { private PageResult pageResult = new PageResult();
public PageResult getPageResult() {
return pageResult;
}
public void setPageResult(PageResult pageResult) {
this.pageResult = pageResult;
}
} /**
* Action页面
*
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward queryLists(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
FormBean myForm = (FormBean) form; // 获取当前页
int pageNo = 1;
if (Util.isNotNullOrEmpty(request.getParameter("pageNo"))) {
pageNo = Util.parseInt(request.getParameter("pageNo"));
}
PageResult pageResult = myForm.getPageResult();
pageResult.setPageNo(pageNo);
/**
* 这是PageResult的实体类
* @author
*/
public class PageResult<E> {
private String orderBy = "";
private String sort = "asc";
private List<E> list = new ArrayList<E>(); //查询结果
private int pageNo = 1; //实际页号
private int pageSize = 16; //每页记录数
private int recTotal = 0; //总记录数
private int pageTotal=1; //总页数
public List getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
}
public int getPageNo() {
if(pageNo<=0){
pageNo = 1;
}
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return (0==pageSize)?10:pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getRecTotal() {
return recTotal;
}
public void setRecTotal(int recTotal) {
this.recTotal = recTotal;
}
public int getPageTotal() {
int ret = (this.getRecTotal() - 1) / this.getPageSize() + 1;
ret = (ret<1)?1:ret;
return ret;
}
public int getFirstRec()
{
int ret = (this.getPageNo()-1) * this.getPageSize();// + 1;
ret = (ret < 1)?0:ret;
return ret;
}
public String getOrderBy() {
return orderBy;
}
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public void setPageTotal(int pageTotal) {
this.pageTotal = pageTotal;
}
}
query.setMaxResults(pageResult.getPageSize());
这两句是什么意思 啊?
Query cquery = this.getSession().createQuery(queryString);这个得到的是什么啊?
cquery.setCacheable(true);什么意思啊?
int recTotal = ((Integer)cquery.iterate().next()).intValue(); 什么意思啊?
FormBean myForm = (FormBean) form;
这句话是不是写错了啊?
应该是BaseForm myForm =new BaseForm();
我不用Spring 所以也不知道那是什么机制的 不过 如果你用的连接池的话 Hibernate总是维持一定的连接数 并将这些SESSION对象放到线程池里 所以这个时候的close不是关闭连接 而是 释放连接 另 用的时候从没用过open...2.可以使用通用的 参数可以为Query 这样就可以保证他的通用了 不过 用这个通用会有很多不必要的麻烦 比如对于分页的时候获得总数的语句? 查询条件? 乱七八糟的 你自己想想吧 其他技术区的高手..
不过要注意参数的类型,需要进行类型判断.Example: Integer, Double, String, Date等常用类型的参数设置是不一样的
我没说要和Spring结合啊!!!!!
如果仅仅使用Hibernate的话,在dao层使用HibernateSessionFactory.getSessionFactory()得到会话工厂的这种方式好不好?我指的是效率或性能方面的问题!!
默认生成的SESSION工厂你调用他的getSession就行了 要SESSIONFactory干嘛呢?
建议使用bbcp管理connection
你是结合了Spring时才有的撒。
其实,Spring会有一个Filter,当一个Request过来时,会打开一个Session,当Servlet处理结束时,这个Filter又可以把Hibernate的Session关闭。
你只需要造这个类似的Filter即可至于分页,大楖如上面那些朋友写的。
不过,我很烦不停的写这些,自己写了个东西,把hql放在配置文件里,类似如
<page id="queryServiceGroup1" maxRecords="1" maxIndexPages="2">
<sql><![CDATA[
select (selct * from abc) from Entity where id=:id and name like :name and ?1 and 0=1
]]>
</sql>
<reps id="1" default="a=b">
<rep test="${id=='20'}"><![CDATA[abc${name}]]></rep>
<rep test="${id=='1'}"><![CDATA[b=c]]></rep>
</reps>
</page>