当前位置: 首页 > 面试题库 >

即使使用C3P0 +显式session.close(),休眠连接也不会关闭

宗政卓
2023-03-14
问题内容

与MySQL的Hibernate连接未关闭。在大约10秒钟内单击10次后,我从MySQL
Workbench(在我的开发机中。我是唯一的用户)获得此连接统计信息。MySQL Workbench
Server状态

我已经准备好了

  • C3P0并正在运行(从log4j中检查,与C3P0相关的问题没有问题,似乎正在运行)
  • 一个ServletReqestListener,它检查是否存在打开的会话,并在requestDestroyed()方法中将其关闭。
  • Hibernate Session对象保留在ThreadLocal中,因此每个请求只有一个连接,该连接在第一个查询时打开,在ServletRequestListener中关闭。
  • 每次我打开一个会话并关闭一个会话时,都会向System.out输出“ Session Opened”和“ Session Closed”,如代码示例中所示。在每次请求时,每次刷新页面时, 我分别得到“会话打开”和“会话关闭”之后 。所以我的小逻辑行得通。但是连接不会关闭。

我的hibernate.cfg.xml

<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.password">officenic</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/officenic</property>
<property name="hibernate.connection.username">officenic</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

<!-- configuration pool via c3p0 -->
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">100</property> <!-- seconds -->
<property name="hibernate.c3p0.max_size">5</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.timeout">100</property> <!-- seconds -->

每当我想关闭会话时,我都会调用该代码块。

if (session == null)
    return;

if (session.isOpen()) {

      if (session.isDirty())
         session.flush();

    session.close();
    System.out.println("Session closed");
}

我想念什么吗?


问题答案:

好吧,似乎我每次都在创建SessionFactory。链接上有一个不错的类,使SessionFactory静态解决了该问题。http://docs.jboss.org/hibernate/core/3.3/reference/en/html/tutorial.html#tutorial-
firstapp-
helpers



 类似资料:
  • 问题内容: 一个只有一个数据库的hibernate会话将保持多少个连接? 问题答案: 在给定的时间,给定的会话将仅保留一个连接,您可以使用connect()方法进行访问。 使用reconnect()方法可以更改所使用的连接。

  • 问题内容: 如您所见,我没有调用,它已经被注释掉了,因为我先是干运行这段代码。但是,事实证明它不是很干。检查数据库后,我发现数据已更改(幸运的是,这是一个测试数据库)。 显然,我对Hibernate / JPA的理解是有缺陷的。并非总是需要打电话来更改数据吗?如果没有,保存什么东西的规则 是 什么? 问题答案: 是的,如果检测到任何更改,则在完成刷新(也使用提交完成刷新)后保存托管实体,这称为脏检

  • 问题内容: 在我的项目中,我开始将c3p0与hibernate一起用于重新连接到数据库,因为在数据库故障时hibernate不会恢复连接。 我正在使用休眠版本: postgresql驱动程序是: c3p0的配置是: 但我不断收到此错误: 我必须注意,我不是在自称自己! 那么,为了在Tomcat 7启动期间摆脱此错误,我该改变谁呢?我还从tomcat的lib目录中删除了PostgreSQL驱动程序。

  • 我正在收听一个Activemq队列。 我的配置如下: 从控制台日志中,我可以看到尝试重新连接到该服务器。 [2014-08-20 08:57:43,303]INFO 236[ActiveMQ Task-1]-org.apache.activemq.transport.failover.FailoverTransport.doReconnect(FailoverTransport.java:1030

  • 问题内容: 我最近开始在应用程序中使用hibernate和c3p0作为ORM。但是,当我关闭会话工厂时,连接池不会自行关闭!这是我的应用程序中 唯一 可以进行会话操作的地方。 这是我的配置文件 请注意,空闲连接非常短的原因是它是我尚未通过集成测试的唯一方法。他们经常打开和关闭会话工厂,因此我总是用尽所有连接。正如我们在项目开始时一样,从长远来看,我认为这不是一个非常可持续的策略。 需要注意的“有趣

  • 问题内容: 我在spring使用Hibernate。 我有这样的模型班。 它通常可以正常工作,但是Category不会延迟加载,而是在ForumEntry加载后急切加载。 `` 完全没有将getter称为ForumCategory是在ForumTopic之后立即加载的。 这个问题出现在我所有的@ManyToOne关联中。但是,@OneToMany关联会延迟加载。 我正在使用maven2进行构建。这