Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确清理休眠会话_Java_Hibernate - Fatal编程技术网

Java 如何正确清理休眠会话

Java 如何正确清理休眠会话,java,hibernate,Java,Hibernate,我在我的应用程序中使用Hibernate,并注意到每当抛出Hibernate错误时,应用程序最终会因与DB相关的错误而崩溃。据我所知,问题在于Hibernate会话处于某种不可用状态,因此需要丢弃。但是,它将返回到池中,并在下一次调用时重新使用,而不是丢弃 在每个函数开始时,确保会话可用的正确方法是什么?如果不可用,确保正确丢弃会话并启动新会话的正确方法是什么 我的Hibernate配置文件包括以下内容: <property name="connection.provider_class"

我在我的应用程序中使用Hibernate,并注意到每当抛出Hibernate错误时,应用程序最终会因与DB相关的错误而崩溃。据我所知,问题在于Hibernate会话处于某种不可用状态,因此需要丢弃。但是,它将返回到池中,并在下一次调用时重新使用,而不是丢弃

在每个函数开始时,确保会话可用的正确方法是什么?如果不可用,确保正确丢弃会话并启动新会话的正确方法是什么

我的Hibernate配置文件包括以下内容:

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.timeout">60</property>
<property name="hibernate.c3p0.idle_test_period">45</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.preferredTestQuery">SELECT 1;</property>
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<property name="hibernate.c3p0.acquireRetryAttempts">3</property>

会话和事务管理有点复杂

Spring通过使用
@Transactional
注释方法实现了它


如果要手动处理该问题。您可以使用
过滤器
启动会话,或者使用一些代理和
线程本地
。最常见的是为每个请求创建会话。

最常见的方法是在DAO之上的服务层中管理事务和休眠会话。在这种情况下,您可以在同一事务中执行多个数据库操作。例如,在您的情况下,您可以在尝试创建新用户名之前显式检查具有给定用户名的用户是否已经存在。因此,您可以让Hibernate处理所有SQLException,并将它们转换为运行时异常


这通常是通过依赖项注入库注入事务管理代码来实现的。最流行的DI库是Spring。

我最后做的是在每个catch块中添加以下行:

session.clear();
根据文件记载

完全清除会话。逐出所有加载的实例并取消所有挂起的保存、更新和删除。不要关闭打开的迭代器或ScrollableResults实例

这样做的结果是会话返回到可用状态,并且同一会话的未来使用不会受到先前错误的影响

当然,这并不能解决围绕正确划分事务范围的任何问题,Olaf和Bozho正确解释的事务范围最好在任何特定DAO的范围之外处理

session.clear();