春季冷冻应用

时间:2011-02-09 01:03:33

标签: java hibernate spring orm

我刚刚经历了几次特定请求后我的应用程序冻结的可怕时间。 调试显示代码在没有任何堆栈跟踪或线程终止的情况下断开,该行调用Spring bean的方法(单例):

myDaoService.getUserById(id)

我猜它是破碎而不是冻结,因为分析器显示同一个线程试图处理后续请求 无法追查导致这种情况的原因 幸运的是我发现了原因:我在事务范围之外调用了一个DAO方法,但它是以只读模式访问它。

现在,问题:

Do you have any clue why wasn't that traceable by debugger?

Why a method accessing db in read-only mode out of transaction caused such behavior?

Is there a way to completely forbid querying out of transaction scope?

无论我做错了什么,我都非常害怕这样一个事实:为了回应我的错误行为,我没有得到任何异常抛出或任何其他错误输出!

我的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>

Spring版本是3.0
Hibernate版本是3.6
Tx Manager是org.springframework.orm.hibernate3.HibernateTransactionManager

1 个答案:

答案 0 :(得分:0)

  

你有什么线索,为什么不那样   可由调试器追踪?

不,但是可能会采取线程转储告诉你。

  

为什么方法以只读方式访问db   模式退出交易造成的   行为?

我会添加一个事务上下文,然后再试一次。不要以为它没关系,因为它是只读的。由于交易是声明性的,因此成本很低。将事务管理添加到所有DAO方法,看看是否有帮助。