当前位置: 首页 > 知识库问答 >
问题:

Spring Hibernate C3P0:未释放连接

冯星阑
2023-03-14

C3P0不会在事务完成后释放连接。下面是堆栈跟踪:

    @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public User doLoginByEmail(String email, String password) throws UserStructureException
{
    User u = doUserMainLoginByEmail(email, password);
    if (null != u)
    {
        return u;
    }
    else
    {
        return doUserChildLoginByEmail(email, password);
    }
}




private UserMain doUserMainLoginByEmail(String email, String password) throws UserStructureException
{
    try
    {

        UserMain returnedUser = userDao.getUserMainByEmailPassword(email, password, DeliveryPropertiesSingleton.getInstance().getBusinessId());

        if (null != returnedUser && returnedUser.getPassword().equals(password))
        {

            return returnedUser;
        }
        return null;
    }
    catch (IndexOutOfBoundsException ioe)
    {
      ...
    }
    catch (Exception e)
    {
        ...
    }

}


private  UserChild doUserChildLoginByEmail(String email, String password) throws UserStructureException
{
    try
    {


        UserChild returnedUser = userDao.getUserChildByEmailPassword(email, password, DeliveryPropertiesSingleton.getInstance().getBusinessId());

        if (null != returnedUser && returnedUser.getPassword().equals(password))
        {

            return returnedUser;
        }
        return null;
    }
    catch (IndexOutOfBoundsException ioe)
    {
        ...
    }
    catch (Exception e)
    {
       ....
    }

}
@Transactional(propagation = Propagation.MANDATORY)
public UserMain getUserMainByEmailPassword(String email, String password, Long businessId)
{

    Session session = this.sessionFactory1.getCurrentSession();


    List<UserMain> result = session.createQuery("from UserMain where email like '" + email + "' and password like '" + password + "' and  businessid =" + businessId).list();

    if(result.size()==1)
    {
            UserMain u = result.get(0);

            return u;
    }
    return null;
}


@Transactional(propagation = Propagation.MANDATORY)
public UserChild getUserChildByEmailPassword(String email, String password, Long businessId)
{

    Session session = this.sessionFactory1.openSession();

    List<UserChild> result = session.createQuery("from UserChild where email like '" + email
            + "' and password like '" + password + "' and  businessid =" + businessId).list();

    if(result.size()==1)
    {
        UserChild u = result.get(0);

        return u;
    }
    return null;

}

池配置和事务配置如下:

	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<property name="driverClass" value="org.postgresql.Driver" />
		<property name="jdbcUrl" value="jdbc:postgresql://localhost/xxx?useUnicode=true&#38;characterEncoding=utf8" />
		<property name="user" value="xxx" />
		<property name="password" value="xxxxxxx" />

		<property name="acquireIncrement" value="2" />
		<property name="minPoolSize" value="3" />
		<property name="maxPoolSize" value="100" />
		<property name="maxIdleTime" value="600" />
		<property name="unreturnedConnectionTimeout" value="45" />
		<property name="debugUnreturnedConnectionStackTraces" value="true" />
	</bean>
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate5.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory1" />

	</bean>

	<tx:annotation-driven transaction-manager="transactionManager" />

如有任何建议,我将不胜感激

共有1个答案

南宫凯康
2023-03-14

好吧,非常简单。

DAO方法使用了openSession,这需要显式的close。对于Spring/Hibernate事务管理持久性,它应该是getCurrentSession

 类似资料:
  • 我正在使用spring rest模板发送与apache http client 4.2.1集成的rest请求。 由于需要向多个服务器发送请求,增加了PoolingClientConnectionManager来管理连接。 当系统运行几天后,我们发现连接达到了最大每路由设置。 打印日志如下所示保持活动的总数:0;分配路线:5选5;分配总数:100个中的5个 似乎由于某种原因,连接没有被释放。但是当我

  • 我对R2DBC池有一个奇怪的行为:我们碰巧创建了大量线程并将它们发送到R2DBC池以获取DB连接。当池中的所有R2DBC连接都在使用时,我们创建的线程排队等待空闲连接可用,这发生在释放之前使用的连接时。如果我们在等待空闲连接时取消这些线程,会发生以下行为: 即使它们被取消,也有一些线程获得连接并通过其正常的DB进程 因此,一些连接不会返回到空闲状态。它们保持被获取状态,并阻止后续连接请求获取这些特

  • 问题内容: 我在Redis中存储json数据列表,并使用ServiceStack c#客户端访问它。我本质上是在管理自己的外键,在其中存储id,然后使用应用程序内部的接口从中提取ID ,然后从Redis获取基础json对象并将其打包为列表以返回其他部分我的申请。 我正在使用,因为我希望Redis可以托管在与执行代码的服务器不同的服务器上。 我正在使用MSOpenTech Redis服务器在Wind

  • 我是分析Java记忆问题的新手。所以请原谅我这个问题看起来很天真 我在运行应用程序时设置了以下JVM参数: 我正在使用visualVM监控使用情况:以下是我看到的 问题是,即使应用程序没有接收任何要处理的数据,使用的内存也不会下降。当应用程序启动时,使用的空间开始变小(大约1GB),但随着应用程序的运行而增加。然后用过的记忆永远不会消失。我的问题是,为什么即使应用程序中没有发生重大处理,使用的堆内

  • 问题内容: 我遍历了一堆URL,对于每个URL,我都在执行以下操作: 第一个查询很好,第二个查询抛出此异常: 线程“主”中的异常java.lang.IllegalStateException:无效使用SingleClientConnManager:仍然分配了连接。在分配另一个之前,请确保释放连接。在org.apache.http.impl.conn.SingleClientConnManager。

  • 我有一个问题,我的GPU内存是没有释放后关闭在Python中的tenstorflow会话。这三行足以导致问题: 在第三行之后,内存不会被释放。我在很多论坛上走来走去,尝试了各种各样的建议,但都没有效果。有关详细信息,请参见下面我的评论: https://github.com/tensorflow/tensorflow/issues/19731 在这里,我已经记录了我设法杀死进程并释放内存的方法,但