Java struts2完整hibernate插件泄漏jdbc连接?
我使用struts2-fullhibernatecore-plugin-2.2.1-GA.jar将会话注入为Java struts2完整hibernate插件泄漏jdbc连接?,java,hibernate,jdbc,struts2,jboss7.x,Java,Hibernate,Jdbc,Struts2,Jboss7.x,我使用struts2-fullhibernatecore-plugin-2.2.1-GA.jar将会话注入为 @SessionTarget protected Session hSession; @TransactionTarget protected Transaction hTransaction; 我可以在jboss日志中看到,它让jdbc连接保持打开状态(未关闭)。Stacktrace作为: [org.jboss.jca.core.api.connecti
@SessionTarget
protected Session hSession;
@TransactionTarget
protected Transaction hTransaction;
我可以在jboss日志中看到,它让jdbc连接保持打开状态(未关闭)。Stacktrace作为:
[org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager]
(http-- 0.0.0.0-8080-203) IJ000100: Closing a connection for you.
Please close them yourself: org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@62a8c68c:
java.lang.Throwable: STACKTRACE
at org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl.registerConnection(CachedConnectionManagerImpl.java:265)
at org.jboss.jca.core.connectionmanager.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:495)
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:129)
at org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:92) [hibernate3.jar:]
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) [hibernate3.jar:]
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) [hibernate3.jar:]
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142) [hibernate3.jar:]
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) [hibernate3.jar:]
at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateTransactionByAnnotation(SessionTransactionInjectorInterceptor.java:572) [struts2-fullhibernatecore-plugin-2.2.1-GA.jar:]
at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateTransactionByAnnotation(SessionTransactionInjectorInterceptor.java:579) [struts2-fullhibernatecore-plugin-2.2.1-GA.jar:]
at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept(SessionTransactionInjectorInterceptor.java:190) [struts2-fullhibernatecore-plugin-2.2.1-GA.jar:]
编码部分,我做事情的方式如下:
使用AbstractSimpleGenericDao类:
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;
@SuppressWarnings("unchecked")
public abstract class AbstractSimpleGenericDao<C, I extends Serializable> {
Class<C> entityClass;
@SessionTarget
protected Session hSession;
@TransactionTarget
protected Transaction hTransaction;
{
entityClass = (Class<C>) ((ParameterizedType)
getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public List<C> getAll()
{
try
{
return hSession.createCriteria(entityClass).list();
}
catch (HibernateException e)
{
throw e;
}
}
public C get(I id)
{
try
{
return (C) hSession.get(entityClass, id);
}
catch (HibernateException e)
{
throw e;
}
}
public void save(C object)
{
try
{
hSession.save(object);
}
catch (HibernateException e)
{
hTransaction.rollback();
throw e;
}
}
public void update(C object)
{
try
{
hSession.update(object);
}
catch (HibernateException e)
{
hTransaction.rollback();
throw e;
}
}
public void delete(I id)
{
try
{
C actual = get(id);
hSession.delete(actual);
}
catch (HibernateException e)
{
hTransaction.rollback();
throw e;
}
}
}
最重要的是,我使用struts2自定义拦截器进行身份验证,因为拦截器不是线程安全的。在拦截器中的ActionInvocation invoke()
方法之后,获取上述错误堆栈跟踪。
这是否意味着拦截器不是线程安全的,可能会泄漏hibernate会话(连接)?1。您正在使用
hibernatePlugin.customSessionFactoryClass
属性吗?2.您是否扩展了hibernate默认值?请提供您在会话中使用的函数的代码。您是否在catch块中指定了回滚?并使用了2.2.2版本。您可能以错误的方式使用了hsession,请提供一些代码,以便我能更多地了解您的问题。您好@ParthTrivedi,谢谢您的回复。我已经添加了代码,我这样做了……但是每当我检查服务器日志时,就会得到很多未关闭连接的堆栈跟踪。我做错了什么吗?@ParthTrivedi首先,我使用struts2自定义拦截器进行身份验证,这不是线程安全的。在拦截器中的ActionInvocation invoke()方法之后,获取上述错误stacktrace。这是否意味着拦截器由于不是线程安全的,可能会泄漏会话(连接)?
public class UserRoleDAO extends AbstractSimpleGenericDao<UserRole, UserRoleId> {
public List L() {
try {
String queryString = "from UserRole";
Query queryObject = hSession.createQuery(queryString);
return queryObject.list();
} catch (RuntimeException re) {
throw re;
}
}
public class abc extends ActionSupport{
private UserRoleDAO userRoleDao = new UserRoleDAO();
private List ls=new ArrayList();
public String execute()
{
List ls=userRoleDao.L()
return "success";
}
}