我被引用的这个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的问题还是,哪里没有释放啊?
非常郁闷啊,弄了几天了,谢谢各位师兄给我指点!!!
<?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的问题还是,哪里没有释放啊?
非常郁闷啊,弄了几天了,谢谢各位师兄给我指点!!!
请帮我修正一下吧?
<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>
我这是用spring管理的连接池啊
晕死 没看见里面写的是spring的配置文件啊????
<session-factory>
</session-factory>
写错了 你就不会多看两眼啊?????????
刚才有点看晕,收回后面那段话要用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>
<property name="sessionFactory" ref="sessionFctory"/>
</bean>用DEBUG模式跑个单元测试看看流程怎么跑的
session.update(tcase);
session.beginTransaction().commit();
session.close();
}
类是这一块的上面的所有的 .close();
最好都放在finally里面去关闭,因为你用的session对象是你在具体方法里面里生成局部变量,在这方法里面虽然你 .close(); 了。如果执行相应很顺利,session对象可以关闭,但是如果你页面的请求改变过于频繁,session.close()可能还没有执行,就被新的请求的原因而中断,这样就用以造成死锁,连接关闭不了了等!
finally{
if(session!=null){
session.close();
}
}
老兄非得用HibernateDaoSupport 才行吗?我就是暂时不想用那东西啊,自己写的BaseDao,怎么就不行了?再说昨天我试图用我的BaseDao去继承HibernateDaoSupport ,在我的BaseDao里面写个this.getSession();就行了,然后其他的配置都不用改的 ,可是这样还是不行啊,我老大是用了,可是我不明白模板,也没说非要模板才能解决问题啊,请问还有办法么?
这位兄弟,你说的很靠谱啊,可是在代码后面直接加上finally{
if(session!=null){
session.close();
}
}
是不行的啊,那我还得每个方法加上不必要的try{} catch()才符合语法啊,我先试下吧
而强制使用getSession()时Spring是不管理session的,配了事务也没用
老兄不行啊,我加了啊,
//查询全部
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)
给你讲讲我如果碰到类似情况会怎么做吧,对你也许有些帮助。明确目标--找到连接池不能及时释放的原因
明确可能发生问题的地点--DAO\SERVICE\事务
布置隔离的测试环境,目标一定要对准。
写测试代码
我会先针对DAO写测试代码,把你在页面跳来跳去可能执行的DAO用代码mock一下
如果没问题,就再写代码测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>
这个依赖注入的配置的 在初始化的时候 这些对象中的方法都没初始化了,你可以在每个数据库操作的地方把sql语句 输出在控制台,你就会看到在初始化的时候这些都基本上被执行了一次。
这样没有关闭的就差不多把10个的限制占满了。你再查询关联的因为你配置的原因关联的也一块执行,这样很容易就达到了10没游标没有关闭吧!
也是猜测,你可以试一下,全部改成finally
Session s = (Session)session.get();
session.set(null); if(s!=null && s.isOpen() ){
s.close();
}
}
public void close(){
sessionFactory.close();
}
或者在子类里面使用sessionFactory.close();不知是否可行。不过既然使用了spring还是建议使用HibernateDaoSupport。很多都不用自己管理了。
session.update(tcase); ---1
session.beginTransaction().commit();
session.close(); ---2
}
这样写就很不规范 ,不应该抛出异常,应该try catch 然后再finally里关闭session。
原因:如果在1附近出现异常,那么程序就不会执行到2.当然session就不会被关闭了。
觉得情况我不是很清楚,只能这么猜猜。
http://bugs.mysql.com/bug.php?id=10917
session.close()不是必需的,session.disconnect()才是真正的释放连接。