2011-02-09 7 views
1

いくつかの特定のリクエストの後、私のアプリケーションがフリーズする恐ろしい時がありました。コードは、(シングルトン)のSpring Beanのメソッドを呼び出すライン上の任意のスタックトレースまたはスレッド終了せずに破壊されたことを示す デバッグ:私はそれが凍結しない、破壊された推測春凍結アプリケーション

myDaoService.getUserById(id) 

、プロファイラがことが示されているため同じスレッドが後続の要求を処理しようとしていました。
原因を突き止めることは不可能でした。
幸いにも私はその理由を発見しました。私はトランザクションスコープからDAOメソッドの1つを呼び出していましたが、読み取り専用モードでアクセスしていました。

さて、質問:

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?

私が間違ってやっていたものは何でも、私はその私の間違った行動に応じて、実際の本当に怖いですスローされた例外や他のエラー出力は得られませんでした。

私の休止状態設定:

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

春バージョンが3.0
Hibernateのバージョンである3.6
のTx Managerはorg.springframework.orm.hibernate3.HibernateTransactionManager

+0

だから、あなたは問題を解決するためにやったすべては、あなたのDAOのメソッドに@Transactionalのアノテーションを追加することでしたか? –

+0

@ルキアノ・フィアンデシオ、はい) – forker

答えて

0

です何か手掛かりを持っていますかなぜ はデバッガでトレーサブルではなかったのですか?

いいえ、多分スレッドダンプを取るとあなたに伝えることができます。

なぜ取引のうち、読み取り専用 モードでDBにアクセスする方法は、このような 行動を起こしましたか?

私はトランザクションコンテキストを追加してもう一度やり直します。読み取り専用なので大丈夫だと想定しないでください。トランザクションは宣言的なので、コストはほとんどかかりません。すべてのDAOメソッドにトランザクション管理を追加し、それが役立つかどうかを確認します。

+0

はい、私はそれが理由であると言いましたが、トランザクションスコープを修正することで問題が解決されました。私は主にそのことをどのように追跡するのか心配していますか? – forker

関連する問題