2017-09-14 18 views
0

非常にジョブの実行中(データベース検索で何万もの文書を索引付けする)、このエラーが発生します。 java.sql.SQLException:ORA-02399:接続時間が最大を超えました。ログオフしているJPAで接続時間を超過した場合の復旧時間

エラーがrepository.findOneコールでで発生します。

プロセスはtomcatで実行されています。私は(私が思う)実行する必要があり何

はバックのOracleにログインして、新しい接続を取得することです。しかし、JPAはすべての細部を非常に効果的に隠します。 (そしてさらに春)。どのように進めますか?

+0

どのように接続していますか?データソースを設定しましたか? – Chris

+0

はい。わたし。私はそれ以来、ゾンビ接続に問題があったため、Oracleシステム管理者が接続に4時間の制限を課していたことを発見しました。彼は今それを4日間に変更しました。 – Scaddenp

+0

これは、再接続するようにデータソースを設定しない限り、4日ごとに問題が発生することを意味します。接続が古くなり、アプリの奇妙な問題を避けるために、それまでに捨てられるように設定を追加する必要があります。 – Chris

答えて

0

あなたはこのようなタイムアウトを取得した場合、再接続はあなたの主な問題ではありません。タイムアウトを十分に長くするか、タイムアウトを引き起こさないようにトランザクションを短くする必要があります。

再接続の懸念は通常、透過あなたが最も確かに多分テストを除いてすべてのために使用すべき接続プールの世話をしています。しかし、これは、接続が閉じられ、トランザクションがロールバックされるというあなたの直ちの問題を解決するものではありません。

更新: 問題はトランザクションの持続時間ではなく、接続の継続時間と思われます。

これが本当であるならば、あなたはそれが、彼らはいくつかの特定の時間のために開かれているという理由だけで使用されている接続をクローズしても意味がありませんIMHOので、このタイムアウトを担当するDBAに相談してください。

接続を手動で終了したり再開したりすることはできません。これは接続プールのタスクです。接続プールから取得した接続を閉じると、接続プールを閉じずに接続プールに戻すことができます。

代わりに、接続を閉じて、定期的に新しいものを作成するために接続プールを設定します。これがどのように機能するかは、使用している接続プールによって異なります。

+0

私は尋ねているだけで、取引はしていません。しかし、問題はOracleのジョブが4時間以上の接続を強制終了させることでした。 – Scaddenp

+0

トランザクションなしでOracleやEntityManagerと対話することはできません。 –

+0

まあ、emとトランザクションマネージャは事実上自動的に接続され、データソースはSpringの設定で設定されます。私は唯一の対話 @Configuration @EnableJpaRepositories( basePackages = "nz.cri.gns.mapservice.repository"、 queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND、 entityManagerFactoryRef = "のEntityManagerFactory"、 transactionManagerRef = "のTransactionManager" ) リポジトリ経由で。問題は、その接続を明示的に管理する方法です。 – Scaddenp

関連する問題