2016-08-31 9 views
0

SQL JDBCをクエリするのにSpring JDBCテンプレートを使用しています。Spring JDBCテンプレートでクエリを実行中に接続が閉じられたエラー

@Autowired 
private JdbcTemplate jdbcTemplate; 

public void importData(){ 

    try{ 
     logger.debug("Importing Data"); 
     jdbcTemplate.query(...) // Fails 
    catch(DataAccessException e){ 
     //Log the error 
    } 
} 

タスクが実行されたとき、私は以下の例外を取得しています(つまり、毎週1回):以下

org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLException: Invalid state, the Connection object is closed. 
     at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:305) 
     at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:329) 
     at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:214) 
     at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:134) 
     at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:97) 
     at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99) 
     at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660) 
     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695) 
     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727) 
     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737) 
     at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:787) 

私はスケジュールされたタスクが毎週1回実行するように構成されている、以下の実装ですドライバクラスです:

spring.datasource.driver-class-name=net.sourceforge.jtds.jdbc.Driver 

私が推測すると、Spring(またはjdbcドライバ)は設定された時間の間アイドル状態であれば接続を閉じます。 'query'メソッドの実装を見ると、新しい接続を作成しないようです。この場合、別の方法(例:execute)を使用する必要がありますか?

+0

接続プールでこれを処理する必要があります。あなたは接続プールを持っていますよね? –

+0

私はこのマニュアル(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect)に従って、JettyでSpringブートを使用しています。プロダクションデータベース)は、光接続プールを使用する必要がありますか? –

+0

あなたのクラスパスに光が含まれている場合のみ、私は信じています。それがデフォルトで何を使用しているかわかりません。 –

答えて

0

時間がなくなっても、接続を閉じるのは接続を閉じるデータベースではなく、接続を閉じるデータベースです。または、おそらくネットワークの不具合のためです。

すべての接続プールは、データソースに要求する前に接続をテストできます。一般的には、テストクエリで実行されます。

接続プールが正しく設定されているかどうかを確認してください。あなたのディスパッチャ-servlet.xmlで

+0

私は春のブートを使用しているので、それは接続プールを管理する必要がありますか?私は以下のプロパティを有効にしています: 'spring.datasource.url'、 ' spring.datasource.username'、 'spring.datasource.password'、 ' spring.datasource.driver-class-name'です。私も接続プールの種類を構成する必要があるかどうかを確認します。 –

1

次の行を追加します。あなたは、アノテーションを使用している場合は追加、

<context:mbean-export registration="ignoreExisting" /> 

か、を:あなたはserver.xmlで追加することができます

@EnableMBeanExport(registration=RegistrationPolicy.IGNORE_EXISTING) 

または、(中あなたのリソースにsingleton="false"の場合:

<GlobalNamingResources> 
    <Resource singleton="false" ..... /> 
</GlobalNamingResources> 
関連する問題