我被引用的这个applicationContext-casemanager.xml如下
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName" default-lazy-init="true"
default-dependency-check="none">

<!-- POJO -->
<bean id="tcase" class="com.goodstart.oa.casemanager.vo.Tcase"></bean>
<bean id="caseattach" class="com.goodstart.oa.casemanager.vo.CaseAttach">
</bean>
<bean id="casetype" class="com.goodstart.oa.casemanager.vo.CaseType">
</bean> <!-- DAO --> <!-- 此处的id名一定要与Service中依赖注入定义的属性一致 -->
<bean id="casetypeDAOImpl" class="com.goodstart.oa.casemanager.dao.impl.CaseTypeDAOImpl"
parent="baseDAO">
</bean>
<bean id="tcaseDAOImpl" class="com.goodstart.oa.casemanager.dao.impl.TcaseDAOImpl"
parent="baseDAO">
</bean>
<bean id="caseattachDAOImpl" class="com.goodstart.oa.casemanager.dao.impl.CaseAttachDAOImpl"
parent="baseDAO">
</bean>
<bean id="casedempDAOImpl" class="com.goodstart.oa.casemanager.dao.impl.CaseDempDAOImpl"
parent="baseDAO">
</bean> <!-- service -->
<!-- 此处的id名一定要与Action中依赖注入定义的属性一致 -->
<bean id="casetypeServiceImpl"
class="com.goodstart.oa.casemanager.service.impl.CaseTypeServiceImpl">
<property name="casetypeDAOImpl">
<ref bean="casetypeDAOImpl" />
</property>
</bean>
<bean id="tcaseServiceImpl"
class="com.goodstart.oa.casemanager.service.impl.TcaseServiceImpl">
<property name="tcaseDAOImpl">
<ref bean="tcaseDAOImpl" />
</property>
</bean>
<bean id="caseattachServiceImpl"
class="com.goodstart.oa.casemanager.service.impl.CaseAttachServiceImpl">
<property name="caseattachDAOImpl">
<ref bean="caseattachDAOImpl" />
</property>
</bean>
<bean id="casedempServiceImpl"
class="com.goodstart.oa.casemanager.service.impl.CaseDempServiceImpl">
<property name="casedempDAOImpl">
<ref bean="casedempDAOImpl" />
</property>
</bean> <!-- view -->
<!-- 此处的id 名一定要与struts.xml 里的class名一致 -->
<bean id="tcaseAction" class="com.goodstart.oa.casemanager.action.TcaseActoin"
singleton="false">
<property name="tcase">
<ref bean="tcase" />
</property>
<property name="tcaseServiceImpl">
<ref bean="tcaseServiceImpl" />
</property>
<property name="caseattach">
<ref bean="caseattach" />
</property>
<property name="caseattchServiceImpl">
<ref bean="caseattachServiceImpl" />
</property>
</bean>
<bean id="tcaseuploadAction" class="com.goodstart.oa.casemanager.action.TcaseUploadAction"
singleton="false">
<property name="tcase">
<ref bean="tcase" />
</property>
<property name="tcaseServiceImpl">
<ref bean="tcaseServiceImpl" />
</property>
<property name="caseattach">
<ref bean="caseattach" />
</property>
<property name="caseattachServiceImpl">
<ref bean="caseattachServiceImpl" />
</property>
</bean>
<bean id="casetypeAction" class="com.goodstart.oa.casemanager.action.CaseTypeAction"
singleton="false">
<property name="casetype">
<ref bean="casetype" />
</property>
<property name="casetypeServiceImpl">
<ref bean="casetypeServiceImpl" />
</property>
<property name="casedempServiceImpl">
<ref bean="casedempServiceImpl" />
</property>
</bean>
<bean id="casedempAction" class="com.goodstart.oa.casemanager.action.CaseDempAction"
singleton="false">
<property name="casedempServiceImpl">
<ref bean="casedempServiceImpl" />
</property>
</bean>
</beans>
以下是我的基类 BaseDao
package com.goodstart.oa.casemanager.factory;import org.hibernate.Session;
import org.hibernate.SessionFactory;public class BaseDAO { private SessionFactory sessionFactory; public SessionFactory getSessionFactory() {
return sessionFactory;
} public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public BaseDAO(){

}

public Session getSession(){

Session session = sessionFactory.openSession();
return session;
}
}
以下挑一个DAO来说明下,我的CRUD操作都是这样写的
package com.goodstart.oa.casemanager.dao.impl;import java.util.List;import org.hibernate.Query;
import org.hibernate.Session;import com.goodstart.oa.casemanager.dao.TcaseDAO;
import com.goodstart.oa.casemanager.factory.BaseDAO;
import com.goodstart.oa.casemanager.vo.Tcase;public class TcaseDAOImpl extends BaseDAO implements TcaseDAO {

public void delete(int id) throws Exception {

Session session = getSession();
String hql = "DELETE FROM Tcase WHERE id=?";
Query q = session.createQuery(hql);
q.setInteger(0,id);
q.executeUpdate();
session.beginTransaction().commit();
session.close();
} public void insert(Tcase tcase) throws Exception {
Session session = getSession();
session.save(tcase);
session.beginTransaction().commit();
session.close();

} public List<Tcase> queryAll() throws Exception { Session session = getSession();
     List<Tcase> all = null;
String hql = "FROM Tcase AS tc";
Query q = session.createQuery(hql);
     all = q.list();
     session.close();
     return all;
    
} public Tcase queryById(int id) throws Exception {
 
Session session = getSession();
Tcase tcase = null;
String hql = "FROM Tcase AS tc WHERE tc.caseid=?";
Query q = session.createQuery(hql);
q.setInteger(0, id);
List<Tcase> all = q.list();
if(all.size()>0)
{
tcase = (Tcase)all.get(0);
}
session.close();
return tcase;
}
public void update(Tcase tcase) throws Exception { Session session = getSession();
session.update(tcase);
session.beginTransaction().commit();
session.close();
} public int queryByCaseserial(String caseserial) throws Exception
{
Session session = getSession();
Tcase tc = null;
int caseid = 0 ;
String hql = "FROM Tcase AS tc WHERE caseserial=?";
Query q = session.createQuery(hql);
q.setString(0, caseserial);
List<Tcase> list = q.list();
if(list.size()>0)
{
tc = list.get(0);
caseid = tc.getCaseid();
}
session.close();
return caseid;

}
}
 我的session都有关闭啊,我这个按理说这块应该有释放啊
我想加大连接数和别人在刷新应该不是解决办法的问题(我们这个就是部门几个人测试用的,还没外挂呢,而且我加到30个也是那样,怎么还是显示(10/10)超过10个连接数的异常?),不知道是我的sessionFactory的问题还是,哪里没有释放啊?
非常郁闷啊,弄了几天了,谢谢各位师兄给我指点!!!

解决方案 »

  1.   

    不是单说刷新的问题,其实不刷新就是几个页面来回多次跳转也出现那问题啊,也就是访问数据库,是没关闭,还是sessionFactory没管理好?
    请帮我修正一下吧?
      

  2.   

    是MYsql连接数满了吧,建议用连接池
      

  3.   

    hibernate的session在哪打开和关闭的??
      

  4.   

    hibernate使用proxool连接池 <session-factory><!-- proxool连接池加载的类-->
      <property name="hibernate.connection.provider_class">
       org.hibernate.connection.ProxoolConnectionProvider
      </property>  <!--连接池的别名,即配置连接池时起的别名-->
      <property name="hibernate.proxool.pool_alias">
       xml-test
      </property>  <!--连接池文件的地址-->
      <property name="hibernate.proxool.xml">
       config/proxool/proxool.xml
      </property>
      <!--是否将运行期生成的SQL输出到日志以供调试-->
      <property name="show_sql">true</property>
      <mapping resource="com/jack/ssh/demo/bo/City.hbm.xml" />
      <mapping resource="com/jack/ssh/demo/bo/Province.hbm.xml" />
    </session-factory>proxool.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <something-else-entirely> 
      <proxool> 
        <alias>xml-test</alias> 
        <driver-url>jdbc:oracle:thin:@localhost:1521:oracle</driver-url> 
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> 
        <driver-properties> 
          <property name="user" value="lixiaoyan"/> 
          <property name="password" value="lxy"/> 
        </driver-properties> 
        <maximum-connection-count>10</maximum-connection-count> 
        <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql> 
      </proxool> 
    </something-else-entirely> 
      

  5.   

    有些人怎么就不看完就说话了啊?
    我这是用spring管理的连接池啊
      

  6.   


    晕死      没看见里面写的是spring的配置文件啊????
    <session-factory> 
    </session-factory> 
    写错了   你就不会多看两眼啊?????????
      

  7.   

    <bean id="mainDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">
      

  8.   

    你自己写了baseDao,自然就不用spring 管理事务了,你老大既然都在spring配置了sessionFactory,你只需要在每个dao里ref按名字引用一下就行了再就是你spring配置dao写的真不规范,接口你没必要配置上,业务层调用的时候其实真正用的还是实现类,实现接口是为了实现动态代理
      

  9.   


    刚才有点看晕,收回后面那段话要用spring管理sessionFactory要实现他的支持,HibernateDaoSupport类,你可以去看下源代码,HibernateDaoSupport里有个属性名就叫 sessionFactory ,注意大小写,所以你在继承HibernateDaoSupport的类里面不需要声明sessionFactory了,但要在spring配置DAO的属性里写对sessionFactory
    例如:
    前面那个property name="sessionFactory"里的sessionFactory必须这样写,后面那个ref="sessionFctory",是自己配置的,名字自己定
    <bean id="youDao" class="com.dao.yourDaoImpl" >
        <property name="sessionFactory"a ref="sessionFctory"/> 
    </bean>
      

  10.   

    <bean id="youDao" class="com.dao.yourDaoImpl" >
        <property name="sessionFactory" ref="sessionFctory"/> 
    </bean>用DEBUG模式跑个单元测试看看流程怎么跑的
      

  11.   

    public void update(Tcase tcase) throws Exception { Session session = getSession(); 
    session.update(tcase); 
    session.beginTransaction().commit(); 
    session.close(); 
    }
    类是这一块的上面的所有的 .close(); 
    最好都放在finally里面去关闭,因为你用的session对象是你在具体方法里面里生成局部变量,在这方法里面虽然你 .close(); 了。如果执行相应很顺利,session对象可以关闭,但是如果你页面的请求改变过于频繁,session.close()可能还没有执行,就被新的请求的原因而中断,这样就用以造成死锁,连接关闭不了了等!
    finally{
        if(session!=null){
        session.close(); 
           }
    }
      

  12.   


    老兄非得用HibernateDaoSupport 才行吗?我就是暂时不想用那东西啊,自己写的BaseDao,怎么就不行了?再说昨天我试图用我的BaseDao去继承HibernateDaoSupport ,在我的BaseDao里面写个this.getSession();就行了,然后其他的配置都不用改的 ,可是这样还是不行啊,我老大是用了,可是我不明白模板,也没说非要模板才能解决问题啊,请问还有办法么?
      

  13.   


    这位兄弟,你说的很靠谱啊,可是在代码后面直接加上finally{
        if(session!=null){
        session.close(); 
           }
    }
    是不行的啊,那我还得每个方法加上不必要的try{} catch()才符合语法啊,我先试下吧
      

  14.   

    在DAO中使用getHibernateTemplate().*时,spring会自动管理session(包括connection),
    而强制使用getSession()时Spring是不管理session的,配了事务也没用
      

  15.   


    老兄不行啊,我加了啊,
    //查询全部
    public List queryAll() throws Exception {
    Session session = getSession();
    List all = null;
    String hql ="FROM CaseType AS ct";
    try{
    Query q = session.createQuery(hql);
    all = q.list();
    }catch(Exception e)
    {e.printStackTrace();} finally{
        if(null != session){
        session.close();
           }
    }
    return all;
    }
    然后我只刷新那个查询方法的,还没刷到7,8次就出现那异常了,超过最大连接数(10/10)
      

  16.   

    建议由spring去管理session关闭,即在dao中通过模板去操作,这样在进行声明式事务管理时也比较方便
      

  17.   

    楼主,你的代码太多,看不过来了,所以没办法帮你找问题。
    给你讲讲我如果碰到类似情况会怎么做吧,对你也许有些帮助。明确目标--找到连接池不能及时释放的原因
    明确可能发生问题的地点--DAO\SERVICE\事务
    布置隔离的测试环境,目标一定要对准。
    写测试代码
    我会先针对DAO写测试代码,把你在页面跳来跳去可能执行的DAO用代码mock一下
    如果没问题,就再写代码测service
    最终会找到问题所在的碰到这样的问题,一定要化繁为简,一步一步来,肯定会有答案的。
      

  18.   

    你是只改了一个还是全部都改可了 你不要嫌麻烦全部都改了试试。
    <!-- 此处的id名一定要与Action中依赖注入定义的属性一致 --> 
    <bean id="casetypeServiceImpl" 
    class="com.goodstart.oa.casemanager.service.impl.CaseTypeServiceImpl"> 
    <property name="casetypeDAOImpl"> 
    <ref bean="casetypeDAOImpl" /> 
    </property> 
    </bean> 
    <bean id="tcaseServiceImpl" 
    class="com.goodstart.oa.casemanager.service.impl.TcaseServiceImpl"> 
    <property name="tcaseDAOImpl"> 
    <ref bean="tcaseDAOImpl" /> 
    </property> 
    </bean> 
    <bean id="caseattachServiceImpl" 
    class="com.goodstart.oa.casemanager.service.impl.CaseAttachServiceImpl"> 
    <property name="caseattachDAOImpl"> 
    <ref bean="caseattachDAOImpl" /> 
    </property> 
    </bean> 
    <bean id="casedempServiceImpl" 
    class="com.goodstart.oa.casemanager.service.impl.CaseDempServiceImpl"> 
    <property name="casedempDAOImpl"> 
    <ref bean="casedempDAOImpl" /> 
    </property> 
    </bean> 
    这个依赖注入的配置的 在初始化的时候 这些对象中的方法都没初始化了,你可以在每个数据库操作的地方把sql语句 输出在控制台,你就会看到在初始化的时候这些都基本上被执行了一次。
    这样没有关闭的就差不多把10个的限制占满了。你再查询关联的因为你配置的原因关联的也一块执行,这样很容易就达到了10没游标没有关闭吧!
    也是猜测,你可以试一下,全部改成finally
      

  19.   

    尝试用以下方式来关闭: public static void closeSession()throws HibernateException{
         Session s = (Session)session.get();
            session.set(null);     if(s!=null && s.isOpen() ){
           s.close();
         }    
        }
      

  20.   

    在你的BaseDAO类加上close方法看看行不行。
    public void close(){
    sessionFactory.close();
    }
    或者在子类里面使用sessionFactory.close();不知是否可行。不过既然使用了spring还是建议使用HibernateDaoSupport。很多都不用自己管理了。
      

  21.   

    public void update(Tcase tcase) throws Exception {Session session = getSession();
    session.update(tcase); ---1
    session.beginTransaction().commit();
    session.close(); ---2

    这样写就很不规范 ,不应该抛出异常,应该try catch 然后再finally里关闭session。
    原因:如果在1附近出现异常,那么程序就不会执行到2.当然session就不会被关闭了。
    觉得情况我不是很清楚,只能这么猜猜。
      

  22.   

    有人提过这个mysql的bug不过他们的开发人员一直没有处理,你可以看一下, session.close()不一定真正的关闭了connection.
    http://bugs.mysql.com/bug.php?id=10917
    session.close()不是必需的,session.disconnect()才是真正的释放连接。