当前位置:编程学习 > JAVA >>

hibernate 连接问题

TOMCAT服务器运行几天后,网页就会有有java.lang.null异常,并且都显示不了数据,但是数据库里有数据。重新启动TOMCAT后又回复正常,我上网找是因为连接诶释放的问题,我的项目是用struts2+hibernate3.0 没用到SPRING,我也不知道哪错了,一直纠结了好多天。DAO层的代码贴在下面,麻烦大神们看看

package com.dc_system.dao;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.transform.Transformers;

import com.dc_system.hibernate.HibernateSessionFactory;
import com.dc_system.vo.DcUserVO;

public class BaseDAO<T>  {

private Session session;
private Transaction trans;


public Session getSession() {
if(session == null)
session =  HibernateSessionFactory.getSession();

return session;
}


public Transaction getTrans() {
if(trans == null)
trans = getSession().beginTransaction();
return trans;
}

public void closeSession(){
HibernateSessionFactory.closeSession();
}


public List getResBySQL(String sql,Class[] beanClass,Class targetClass) { 
        List list = new ArrayList();
        try { 
         System.out.println(sql);
         //getTrans().begin();
         SQLQuery query  = getSession().createSQLQuery(sql);
         for(int i = 0 ;i < beanClass.length;i++)
         query.addEntity(beanClass[i]);
         if(beanClass.length > 1)
         list = converVO(query.list(),targetClass); 
         else
         list = query.list();
           // getTrans().commit(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
            //getTrans().rollback(); 
        } finally { 
            trans = null; 
            closeSession();
        } 
        return list; 
    }
/***
 * 将得到后的结果转到目的的类
 * @param list
 * @param beanClass  转换成目标类
 * @return
 */
public List converVO(List list,Class beanClass){
 List list1 = new ArrayList();
  Iterator iterator1 = list.iterator(); 
  try {
  while (iterator1.hasNext()) { 
  Object vo = beanClass.newInstance();
  Object[] o = (Object[]) iterator1.next(); 
  
     for(int i = 0 ;i < o.length;i++)
   copyProperties(o[i], vo);
     list1.add(vo);
      }
  } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
 }
   return list1;
}

/***
 * 多表查询返回一个VO
 * @param hql
 * @return
 */
public List getResByHQL(String hql,Class beanClass) { 
 List list = new ArrayList();
 List list1 = new ArrayList();
        try { 
         Query query = getSession().createQuery(hql); 
            list = query.list(); 
            list1 = converVO(list,beanClass);
            //getTrans().commit(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
            //getTrans().rollback(); 
        } finally { 
            trans = null; 
            closeSession(); 
        } 
        return list1; 
    }

public List findByProperty(String property_name, Object value , String table_name,Class targetClass) {
try {
//getTrans().begin();
String queryString = "select * from "+table_name.toLowerCase()+" as model where model."
+ property_name + "='"+String.valueOf(value).toLowerCase()+"' and (model.del is null or model.del = 0)" ;
SQLQuery query  = getSession().createSQLQuery(queryString);
query.addEntity(targetClass);
System.out.println(queryString);
return query.list();
} catch (Exception re) {
re.printStackTrace();
}finally { 
            trans = null; 
             closeSession(); 
        } 
return null;
}

/***
 * 保存和更新
 * @param transientInstance
 */
public void save(T transientInstance) {
try {
getTrans().begin();
getSession().saveOrUpdate(transientInstance);
getTrans().commit();
} catch (RuntimeException re) {
re.printStackTrace();
throw re;
}finally { 
            trans = null; 
             closeSession(); 
        } 
}

public void delete(T persistentInstance) {
try {
// getTrans().begin();
getSession().delete(persistentInstance);
getTrans().commit();
} catch (RuntimeException re) {
throw re;
}finally { 
            trans = null; 
             closeSession(); 
        } 
}

/***
 * 获得所有的没有删除的数据
 * @param table_name
 * @param haveDel
 * @param tableClass
 * @return
 */
public List getAll(String table_name , Boolean haveDel,Class tableClass) {
try {
//getTrans().begin();
String sql="";
if(haveDel){
sql = "select * from "+table_name+" where del < 1 or del is null";
}else
sql = "select * from "+table_name;
return getResBySQL(sql, new Class[]{tableClass},tableClass);
} catch (RuntimeException re) {
throw re;
}finally { 
            trans = null; 
             closeSession(); 
        } 
}

public List getPageList(String table_name, String primerKey,int pageNo ,Boolean haveDel,Class tableClass){
try {
//getTrans().begin();
String sql="";
if(haveDel){
sql = "select * from "+table_name+" where (del < 1 or del is null) order by "+primerKey+" desc limit "
+ (pageNo-1)*10+",10 ";
}
return getResBySQL(sql, new Class[]{tableClass},tableClass);
} catch (RuntimeException re) {
throw re;
}finally { 
            trans = null; 
             closeSession(); 
        } 
}
/***
 * 一个类复制到另一个类
 * @param oldObj
 * @param newObj
 * @throws Exception
 */
public static void copyProperties(Object oldObj , Object newObj) throws Exception{
Class c1 = oldObj.getClass();
Class c2 = newObj.getClass();
//Field[] fields = c1.getDeclaredFields();
Method[] methods = c1.getMethods();
for(Method f : methods) { 
if(f.getName().indexOf("set") == 0){
PropertyDescriptor pd1 = new PropertyDescriptor(f.getName().substring(3), c1); 
Method getter = pd1.getReadMethod();
Object val = getter.invoke(oldObj);
try{
PropertyDescriptor pd2 = new PropertyDescriptor(f.getName().substring(3), c2); 
Method setter = pd2.getWriteMethod();
setter.invoke(newObj, val);
}catch(Exception e){
System.out.println("-----------"+f.getName() +" is not found in "+newObj+"------------");
}
}
}
return;
}

public void upadateByHql(String hql){
try{
getTrans().begin();
Query query = getSession().createQuery(hql);
query.executeUpdate();
getTrans().commit();
}catch(Exception e){
e.printStackTrace();
}finally { 
            trans = null; 
             closeSession(); 
        } 
}
/**
 * 获得记录数
 * @return
 */
public Integer getCount(String tableName,String whereHQL,Class targetClass){
String hql="select count(*) as count from "+tableName +" "+ whereHQL;

SQLQuery query  = getSession().createSQLQuery(hql.toLowerCase());
query.addScalar("count",Hibernate.INTEGER);
return (Integer) query.uniqueResult();

}
}
--------------------编程问答-------------------- 看下你hibernate的配置文件 --------------------编程问答--------------------
引用 1 楼 fangmingshijie 的回复:
看下你hibernate的配置文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">jdbc:mysql://localhost:3306/lyc_dc_server</property>
<property name="connection.username">lyc</property>
<property name="connection.password">uLW4PMHv5wZyu2aE</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">MYSQL</property>

<property name="c3p0.min_size">5</property> 
<property name="c3p0.max_size">30</property> 
<property name="c3p0.time_out">1800</property> 
<property name="c3p0.max_statement">50</property> 

<mapping resource="com/dc_system/bo/DcComment.hbm.xml" />
<mapping resource="com/dc_system/bo/DcArticle.hbm.xml" />
<mapping resource="com/dc_system/bo/DcUserDetail.hbm.xml" />
<mapping resource="com/dc_system/bo/DcUser.hbm.xml" />
<mapping resource="com/dc_system/bo/DcTea.hbm.xml" />
<mapping resource="com/dc_system/bo/DcAchievement.hbm.xml" />
<mapping resource="com/dc_system/bo/DcCommon.hbm.xml" />
<mapping resource="com/dc_system/bo/DcArea.hbm.xml" />
<mapping resource="com/dc_system/bo/DcVote.hbm.xml" />
<mapping resource="com/dc_system/bo/DcTrade.hbm.xml" />

</session-factory>

</hibernate-configuration> --------------------编程问答-------------------- <property name="c3p0.max_size">30</property> 这个弄大点 --------------------编程问答-------------------- 我按照网上说的添加CP30的数据库连接池,就这样在XML里添加这个代码啊?在DAO层还需要专门写一个获取连接的类吗?如果要添加JAVA代码的话,还要添加什么? --------------------编程问答--------------------
引用 3 楼 fangmingshijie 的回复:
<property name="c3p0.max_size">30</property> 这个弄大点

调成300可以么? --------------------编程问答-------------------- 嗯,再跑断时间看下 --------------------编程问答--------------------
引用 6 楼 fangmingshijie 的回复:
嗯,再跑断时间看下

原来我的项目没用到连接池,后来添加的,我就添加了一个CP30的JAR包,然后在hibernate这个配置文件添加这一段,其他什么都没做,这样可以吗? --------------------编程问答-------------------- 嗯,,,跑下看看 --------------------编程问答-------------------- 如果mysql连接8小时内不操作的话,会被自己回收掉。。去加大Mysql连接超时时间吧 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 9 楼 music_mouse 的回复:
如果mysql连接8小时内不操作的话,会被自己回收掉。。去加大Mysql连接超时时间吧


当初第一个上线项目就是这mysql8小时问题,加大时间后就可以了,楼主可以试试
补充:Java ,  Web 开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,