10分ごとに実行されるSpringBatchアプリケーションがあります。REST APIからデータを取得し、これらのデータをデータベースに保存します。
さて、私の問題は今どこにありますか?
データベース(Oracle)が再起動したり、オフラインになったりすることがあります(実際にはわかりません)。しかし、アプリケーションはデータベースに再接続していないようです。アイドルモードのままです。
Spring Boot:2.1.2.RELEASE
application.ymlは次のようになります。
app:
database:
jdbc-url: jdbc:oracle:thin:@<host>:<port>:<db>
username: <username>
password: <password>
driver-class-name: oracle.jdbc.OracleDriver
options:
show-sql: true
ddl-auto: none
dialect: org.hibernate.dialect.Oracle12cDialect
次に、データソースを次のように構成します。
public DataSource dataSource() {
HikariConfig configuration = new HikariConfig();
configuration.setJdbcUrl(properties.getJdbcUrl());
configuration.setUsername(properties.getUsername());
configuration.setPassword(properties.getPassword());
configuration.setDriverClassName(properties.getDriverClassName());
configuration.setLeakDetectionThreshold(60 * 1000);
return new HikariDataSource(configuration);
}
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("xxx.xxx.xx");
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
Properties additionalProperties = properties();
em.setJpaProperties(additionalProperties);
return em;
}
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
private Properties properties() {
Properties additionalProperties = new Properties();
additionalProperties.setProperty("hibernate.hbm2ddl.auto", properties.getOptions().getDdlAuto());
additionalProperties.setProperty("hibernate.dialect", properties.getOptions().getDialect());
additionalProperties.setProperty("hibernate.show_sql", properties.getOptions().getShowSql());
return additionalProperties;
}
正直なところ、ここで構成に何か問題があったかどうかはわかりません。
ありがとうございました!
setMaxLifetimeでmaxLifetimeを30分間設定する必要があります
configuration.setMaxLifetime(108000);
プロパティは、プール内の接続の最大存続期間を制御します。接続がこのタイムアウトに達すると、最近使用された場合でも、プールからリタイアされます。使用中の接続がリタイアすることはなく、アイドル状態のときにのみ削除されます。
この値を設定することを強くお勧めします。この値は、データベースまたはインフラストラクチャに課せられた接続時間制限よりも少なくとも30秒短くする必要があります。
デフォルトでは、Oracleは接続の最大存続期間を強制しません
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加