複数のステップで構成されたジョブがあります。ステップの 1 つは、Pentaho の処理をアクティブにするタスクレットです。
独自に DB に接続するために必要なパラメータを Pentaho に渡すと、問題なく動作します
私が抱えている問題は、Pentaho での処理時間が長いときに始まります
Pentaho は正常に完了し、それをアクティブ化したタスクレット内のコードは正常に完了しますが、それをラップするジョブ メカニズムでは、db 内のジョブ実行テーブルを更新しようとすると、接続が既に閉じられているため、エラーが発生します。
o.s.j.s.SQLErrorCodesFactory: Error while extracting database product name - falling back to empty error codes org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:296) at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:320) at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:214) at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:141) at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:104) at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:603) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812) at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868) at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao.persistSerializedContext(JdbcExecutionContextDao.java:230) at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao.updateExecutionContext(JdbcExecutionContextDao.java:159) at org.springframework.batch.core.repository.support.SimpleJobRepository.updateExecutionContext(SimpleJobRepository.java:203) ... 14:21:37.143 UTC [ERROR] jobScheduler_Worker-2 T:b U: o.s.t.i.TransactionInterceptor: Application exception overridden by rollback exception org.springframework.dao.RecoverableDataAccessException: PreparedStatementCallback; SQL [UPDATE BAT_STEP_EXECUTION_CONTEXT SET SHORT_CONTEXT = ?, SERIALIZED_CONTEXT = ? WHERE STEP_EXECUTION_ID = ?]; Communications link failure
ジョブの開始時にジョブ リポジトリが受信した接続が破棄されたようです。新しい接続を取得するか、キープ アライブ コマンドを実行するように命令する方法があるかどうかを理解しようとしています。
次の回避策を試しました
ジョブが完了するようにジョブ リスナーのステップ ステータスを変更します - 同じ DB エラーで失敗します
この例外をスキップできるかのようにマークします - 同じ DB エラーで失敗します
<batch:no-rollback-exception-classes> <batch:include class="com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException" /> <batch:include class="org.springframework.jdbc.support.MetaDataAccessException" /> </batch:no-rollback-exception-classes>
これを回避する方法はありますか?
Pentaho ステップの次のステップからジョブを再開するジョブ リスナーを設定できますか?
追加情報
問題はここにあると思います -
org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSource)
これ
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
接続が有効であると考えます
解決策は電話することだと思いますorg.springframework.transaction.support.TransactionSynchronizationManager.unbindResource(Object)
問題は、データ ソースオブジェクトをこのメソッドに渡す方法です。
にクエリを実行して
org.springframework.transaction.support.TransactionSynchronizationManager.getResourceMap()
、どこに到達するかを確認します
運が悪い更新 - get resources マップは、データソースではなく、使用しているリポジトリのみを提供します。まだ掘ってる…
別のアップデート
私はプロセスをデバッグしていますが、問題は実際にorg.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSource)
は接続ホルダーが閉じている接続を保持しているようですが、ここのコードは接続が開いているかどうかをチェックしません。接続がnullではないかどうかのみをチェックし、それが弱い参照であった場合はここで十分だったかもしれませんが、このユースケースでは、新しい接続を要求する代わりに、閉じられた接続を続行します。