2017-12-14 4 views
0

私のデータソースBeanが一定期間使用しなくても問題が発生しています。私の質問は、アプリケーションの起動時にヒットするデータソースBeanをどのようにインスタンス化できるかです。春のデータ、MySQL、接続が8時間休止した後に終了する

起動時にBeanを設定する方法は次のとおりです。

@ConfigurationProperties(prefix = "spring.datasource") 
@Bean 
public DataSource dataSource(){ 
    byte[] encryptedFile = fileRetriever.getFile(bucket, key); 
    String unencryptedJson = fileDecrypter.decryptFile(encryptedFile); 
    JSONParser parser = new JSONParser(); 
    JSONObject jsonObject = null; 
    try{ 
     jsonObject = (JSONObject) parser.parse(unencryptedJson); 
    }catch (Exception ex){ 
     log.error(ex.getMessage()); 
    } 

    String password = (String)jsonObject.get("password"); 

    DataSource ds = DataSourceBuilder 
      .create() 
      .url(url) 
      .username(userName) 
      .password(password) 
      .build(); 

    return ds; 

} 

このクラスには、@Configuration注釈もあります。

我々は、サービスが非アクティブ後にバウンスする必要があり、この問題を持っていない他のアプリケーションを持っていますが、彼らはまた、このようにデータソースを設定し、application.propertyファイルで指定されたすべての詳細を持っていません

私は30秒ごとにヒットするリポジトリを使用するカスタムヘルスチェックを追加しました。データソースBeanを有効にしておく必要がありますが、それを再構築する方法が必要になります。

ありがとうございます。

+0

までごapplication.propertiesに以下を追加することができます。そうすれば、アイドル状態の接続は常にアクティブになります。 – Sanj

+0

ベストアイデアではありませんが、データベースを5〜8時間ごとにポーリングして接続を維持できます。 – DwB

+0

ここでのアイデアは、アイドル状態の接続を維持することだと思います。頻度は、必要に応じて数分または数時間にすることができます。 – Sanj

答えて

0

プールされたデータソースコネクタと考えられます。 Apacheのdbcb2を見てください。

ここに私が持っているサンプルがあります。これは最低10アイドルを維持し、プールから必要に応じて増加します。 apacheのdbcb2ため

private static DataSource createDataSource(String url, String userName, String passwrd) throws Exception { 
    Class.forName(DRIVER).newInstance(); 

    Properties props = new Properties(); 
    props.setProperty("user", userName); 
    props.setProperty("password", passwrd); 

    //Create a connection factory that the pool will use to create connections 
    ConnectionFactory cf = new DriverManagerConnectionFactory(url, props); 
    //Create the poolable connection factory 
    PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf, null); 
    pcf.setValidationQuery("SELECT 1"); 
    pcf.setDefaultAutoCommit(true); 

    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); 
    poolConfig.setMinIdle(10); 
    poolConfig.setMaxTotal(100); 

    AbandonedConfig abandonConfig = new AbandonedConfig(); 
    abandonConfig.setRemoveAbandonedTimeout(60); 
    abandonConfig.setLogAbandoned(false); 
    abandonConfig.setRemoveAbandonedOnBorrow(true); 
    abandonConfig.setRemoveAbandonedOnMaintenance(true); 

    //Create the pool of connections 
    GenericObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(pcf, poolConfig); 
    connectionPool.setTestOnBorrow(true); 
    connectionPool.setTestWhileIdle(true); 
    connectionPool.setTimeBetweenEvictionRunsMillis(10000); 
    connectionPool.setMinEvictableIdleTimeMillis(1000); 
    connectionPool.setAbandonedConfig(abandonConfig); 
    pcf.setPool(connectionPool); 

    //Pooling data source itself 
    PoolingDataSource<PoolableConnection> dataSource = new PoolingDataSource<>(connectionPool); 
    return dataSource; 
    } 

Mavenの依存関係

 <!-- Database connection pools --> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-dbcp2</artifactId> 
      <version>2.1.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-pool2</artifactId> 
      <version>2.4.2</version> 
     </dependency> 
+0

ConnectionFactoryはどのライブラリですか? –

+0

'org.apache.commons.dbcb2'はapache dbcb2ライブラリのパッケージです。 – locus2k

0

私はそのブートがあなたのためにデータソースを構成していると仮定します。この場合、あなたはMySQLを使用しているので、あなたは真=テストしばらくアイドルで試してみてください1.3

spring.datasource.test-on-borrow=true 
spring.datasource.validationQuery=SELECT 1 
+0

パスワードがAWS KMSに保存されているため、これはうまくいきませんでした。私はBeanを設定していると思いますが、これは動作しませんあたかもapplication.propertyファイルにすべての詳細が指定されているかのように –

関連する問題