Spring 3 MVC Hibernate 3.5.4 hibernateTemplate不关闭连接(非事务性) [英] Spring 3 MVC Hibernate 3.5.4 hibernateTemplate not closing connections (non-transactional)

查看:134
本文介绍了Spring 3 MVC Hibernate 3.5.4 hibernateTemplate不关闭连接(非事务性)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们使用Spring MVC 3.0.5.RELEASE和Hibernate 3.5.4-Final,没有事务。每次我们通过hibernateTemplate访问数据库时,它会创建一个新的连接,并且看起来从不关闭它们。



更新:我们已经将maxActive和maxIdle设置为5。当它试图打开第六个连接时挂起。我们允许100个mysql连接。



我们的hibernateTemplate是Autowired,所以我们不直接管理这些连接。关于如何确保这些连接的任何想法都已关闭?



这是我们用于hibernate的spring配置:

 < bean id =dataSourceclass =org.apache.commons.dbcp.BasicDataSourcedestroy-method =close> 
< property name =driverClassName>
<值> $ {jdbc.driverClassName}< /值>
< / property>
< property name =url>
< value> $ {jdbc.url}< /值>
< / property>
< property name =username>
<值> $ {jdbc.username}< /值>
< / property>
< property name =password>
<值> $ {jdbc.password}< /值>
< / property>
< property name =maxActive>
<值> 5< /值>
< / property>
< property name =maxIdle>
<值> 5< /值>
< / property>
< property name =removeAbandoned>
<值> true< /值>
< / property>
< property name =removeAbandonedTimeout>
<值> 30< /值>
< / property>
< / bean>

< alias name =dataSourcealias =userInfoDataSource/>

<! - Hibernate SessionFactory - >
< bean id =sessionFactoryclass =org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean>
< property name =dataSource>
< ref local =dataSource/>
< / property>
< property name =packagesToScanvalue =com.domain/>
< property name =hibernateProperties>
<道具>
< prop key =hibernate.dialect> org.hibernate.dialect.MySQLDialect< / prop>
< prop key =hibernate.show_sql> true< / prop>
< prop key =hibernate.connection.release_mode> after_statement< / prop>
< prop key =hibernate.transaction.flush_before_completion> true< / prop>
< /道具>
< / property>
< / bean>

< bean id =hibernateTemplateclass =org.springframework.orm.hibernate3.HibernateTemplate>
< property name =sessionFactoryref =sessionFactory/>
< / bean>

这是我们的HibernateRepository实现:

  package com.dataAccess.impl; 

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
公共抽象类HibernateRepositoryImpl< T>实现com.dataAccess.Repository< T> {

@Autowired
保护HibernateTemplate hibernateTemplate;

public List< T> find(String query){
return hibernateTemplate.find(query);
}

@Override
public void saveOrUpdate(T ENTITY){
hibernateTemplate.saveOrUpdate(ENTITY);
}

@Override
public List< T> find(DetachedCriteria criteria){
return hibernateTemplate.findByCriteria(criteria);
}

@Override
public void delete(T ENTITY){
hibernateTemplate.delete(ENTITY);


$ / code $ / pre

这是我们使用它的一个例子,这似乎泄漏了连接:

  package com.dataAccess.impl; 

import com.domain.Trigger;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class TriggerRepository extends HibernateRepositoryImpl< Trigger> {
public List< Trigger> getActiveTriggers(Integer patientId){
DetachedCriteria findActiveTriggers = DetachedCriteria.forClass(Trigger.class).add(
Restrictions.and(
Restrictions.eq(patientId,patientId),
Restrictions.eq(active,true)

);
返回super.find(findActiveTriggers);
}
public List< Trigger> getInActiveTriggers(Integer patientId){
DetachedCriteria findActiveTriggers = DetachedCriteria.forClass(Trigger.class).add(
Restrictions.and(
Restrictions.eq(patientId,patientId),
Restrictions.eq(active,false)

);
返回super.find(findActiveTriggers);


public Trigger get(Integer triggerId){
return hibernateTemplate.get(Trigger.class,triggerId);
}
}


解决方案

问题最终导致一些遗留代码被调用,将几个方法链接在一起,其中创建连接的方法 - 连接从未被分配(难以察觉),也没有被关闭。这段代码是间接加载的,我错误地怀疑我的Hibernate / Spring配置有问题。



如果您遇到类似问题,请谨防读取以下代码行:

  connectionManager.getConnection()prepareStatement(..)<无论> 

getConnection()调用可能会打开一个新的连接,并且它或准备好的语句都会更改关闭。


We are using Spring MVC 3.0.5.RELEASE with Hibernate 3.5.4-Final without transactions. Every time we access the database through the hibernateTemplate it creates a new connection and seemingly never closes them.

UPDATE: we've set maxActive and maxIdle to 5. The application will hang when it tries to open the 6th connection. We allow 100 mysql connections.

Our hibernateTemplate is Autowired, so we're not directly managing these connections. Any ideas on how to make sure these connections are closed?

Here's our spring configuration for hibernate:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
        <value>${jdbc.driverClassName}</value>
    </property>
    <property name="url">
        <value>${jdbc.url}</value>
    </property>
    <property name="username">
        <value>${jdbc.username}</value>
    </property>
    <property name="password">
        <value>${jdbc.password}</value>
    </property>
    <property name="maxActive">
        <value>5</value>
    </property>
    <property name="maxIdle">
        <value>5</value>
    </property>
    <property name="removeAbandoned">
        <value>true</value>
    </property>
    <property name="removeAbandonedTimeout">
        <value>30</value>
    </property>
</bean>

<alias name="dataSource" alias="userInfoDataSource"/>

<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
        <ref local="dataSource"/>
    </property>
    <property name="packagesToScan" value="com.domain"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.connection.release_mode">after_statement</prop>
            <prop key="hibernate.transaction.flush_before_completion">true</prop>                
        </props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

Here is our HibernateRepository implementation:

package com.dataAccess.impl;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public abstract class HibernateRepositoryImpl<T> implements com.dataAccess.Repository<T> {

  @Autowired
  protected HibernateTemplate hibernateTemplate;

  public List<T> find(String query) {
    return hibernateTemplate.find(query);
  }

  @Override
  public void saveOrUpdate(T ENTITY) {
    hibernateTemplate.saveOrUpdate(ENTITY);
  }

  @Override
  public List<T> find(DetachedCriteria criteria) {
    return hibernateTemplate.findByCriteria(criteria);
  }

  @Override
  public void delete(T ENTITY) {
    hibernateTemplate.delete(ENTITY);
  }
}

Here is an example of our we are using it, which seems to leak connections:

package com.dataAccess.impl;

import com.domain.Trigger;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class TriggerRepository extends HibernateRepositoryImpl<Trigger> {
  public List<Trigger> getActiveTriggers(Integer patientId) {
    DetachedCriteria findActiveTriggers = DetachedCriteria.forClass(Trigger.class).add(
        Restrictions.and(
            Restrictions.eq("patientId", patientId),
            Restrictions.eq("active", true)
        )
    );
    return super.find(findActiveTriggers);
  }
  public List<Trigger> getInActiveTriggers(Integer patientId) {
    DetachedCriteria findActiveTriggers = DetachedCriteria.forClass(Trigger.class).add(
        Restrictions.and(
            Restrictions.eq("patientId", patientId),
            Restrictions.eq("active", false)
        )
    );
    return super.find(findActiveTriggers);
  }

  public Trigger get(Integer triggerId) {
    return hibernateTemplate.get(Trigger.class, triggerId);
  }
}

解决方案

The problem ended up being some legacy code which called was chaining several methods together, where the method in the middle of creating the connection -- so the connection was never getting assigned (tough to spot) nor was it ever getting closed. This code was indirectly getting loaded and I wrongly suspected my Hibernate/Spring configuration to be at fault.

If you hit similar issues be wary of lines of code that read:

connectionManager.getConnection().prepareStatement(..).<whatever>

The getConnection() call likely opens a new connection and it nor the prepared statement every have a change to get closed.

这篇关于Spring 3 MVC Hibernate 3.5.4 hibernateTemplate不关闭连接(非事务性)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆