Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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_Spring_Orm - Fatal编程技术网

Java 春季冷冻应用

Java 春季冷冻应用,java,hibernate,spring,orm,Java,Hibernate,Spring,Orm,我刚刚经历了一段可怕的时间,在几个特定的请求之后,我的应用程序被冻结了。 调试表明,代码在调用Springbean(singleton)方法的行上没有任何stacktrace或线程终止: 我猜它正在中断,而不是冻结,因为探查器显示同一线程正在尝试处理后续请求。 无法追踪是什么原因造成的。 幸运的是,我发现了原因:我在事务范围外调用了一个DAO方法,但它是以只读模式访问的 现在,问题是: 你知道为什么调试器无法跟踪它吗? 为什么在事务外以只读模式访问数据库的方法会导致这种行为? 有没有一种方法可以

我刚刚经历了一段可怕的时间,在几个特定的请求之后,我的应用程序被冻结了。 调试表明,代码在调用Springbean(singleton)方法的行上没有任何stacktrace或线程终止:

我猜它正在中断,而不是冻结,因为探查器显示同一线程正在尝试处理后续请求。
无法追踪是什么原因造成的。
幸运的是,我发现了原因:我在事务范围外调用了一个DAO方法,但它是以只读模式访问的

现在,问题是:

你知道为什么调试器无法跟踪它吗?

为什么在事务外以只读模式访问数据库的方法会导致这种行为?

有没有一种方法可以完全禁止在事务范围外查询?

无论我做错了什么,我真的很害怕这样一个事实:在对我的错误操作做出响应时,我没有得到任何异常抛出或任何其他错误输出

我的Hibernate配置:

<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.connection.pool_size">32</property>
<property name="hibernate.jdbc.batch_size">20</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.connection.url">jdbc:postgresql://192.168.1.1/db_test</property>
<property name="hibernate.connection.password">xxxxxx</property>
<property name="hibernate.connection.username">xxxxxx</property>
org.hibernate.dialent.PostgreSqlDialent
org.postgresql.Driver
线
32
20
真的
jdbc:postgresql://192.168.1.1/db_test
xxxxxx
xxxxxx
Spring版本是3.0
Hibernate版本是3.6
Tx管理器是org.springframework.orm.hibernate3.HibernateTransactionManager

你知道为什么没有 可由调试器跟踪

不,但也许通过线程转储可以告诉你

为什么要使用只读方式访问数据库 交易模式失效导致了这种情况 行为


我将添加一个事务上下文,然后重试。不要因为它是只读的就认为它没问题。因为事务是声明性的,所以成本很低。将事务管理添加到所有DAO方法中,看看这是否有帮助。

是的,正如我所说的,这就是原因——修复事务范围解决了问题。我最关心的是如何找到它?所以,你所做的一切就是在DAO的方法中添加@Transactional注释(是的,Luciano Fiandesio)
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.connection.pool_size">32</property>
<property name="hibernate.jdbc.batch_size">20</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.connection.url">jdbc:postgresql://192.168.1.1/db_test</property>
<property name="hibernate.connection.password">xxxxxx</property>
<property name="hibernate.connection.username">xxxxxx</property>