2016-12-01 10 views
0

Springブートでは、jdbcTemplateはクエリを実行した後に一度も自動的に接続を閉じませんか? この場合、jdbcTemplate(teradataに接続する)を使用してクエリを実行していますが、クエリの実行後にセッションが終了していません。どのようにしてセッションを閉じることができますか?jdbcTemplateがクエリを実行した後、Spring Bootで接続を閉じる方法は?

これは私のDAOファイルです - そのコンストラクタlinkに渡される -

@Component 
public class DDLReviewDao { 

    @Autowired 
    @Qualifier("devbJdbc") 
    private JdbcTemplate jdbcTemplate; 

    public static final Logger logger = LogManager.getLogger(DDLReviewDao.class); 

    public List<DDLObject> getDDLReviewData(DDLQuery ddlQuery) { 

     String selectSql = MacroGenerator.generateMacro(ddlQuery);     
     List<DDLObject> ddlObject = jdbcTemplate.query(selectSql, new DDLMapper());     
     logger.info(ddlObject); 
     return ddlObject; 
    } 

} 
+0

あなたがmavenを使用している場合、Plzはpom.xmlを共有します。 –

答えて

0

JdbcTemplatejavax.sql.DataSource実装からの接続を取得します。

DataSource sが基本はをプールまたはConnection要求ごとにオブジェクトを作成)(接続のプールがあり、単に特定の要求の使用のための1つの「借り」)とすることができます。

devbJdbcというJdbcTemplateにいくつかのプーリングデータソースを渡したため、接続が終了していないようです。

@Configuration 
class DevbConfig { 

    @Bean(name = "devbDataSource") 
    DataSource devbDataSource() { 
     try { 
      return new SimpleDriverDataSource(DriverManager.getDriver("jdbc:..."), "jdbc:...", "username", "password"); 
     } catch (SQLException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @Bean(name = "devbJdbc") 
    JdbcTemplate devbJdbc(@Qualifier("devbDataSource") DataSource dataSource) { 
     return new JdbcTemplate(dataSource); 
    } 

} 
春ブーツで
0

は、jdbcTemplateが接続 を自動的に一度閉じない:org.springframework.jdbc.datasource.SimpleDriverDataSourceちょうどそのような:あなたは本当にJdbcTemplate仕事をするために開かれたすべての接続をクローズする場合は、基本的なDataSource実装を使用することができますそれはクエリを実行した後?

接続を閉じるか、接続プールに戻す必要がありますか(データソースがプールされている場合)?

あなたはそれがに沸くhttp://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-jdbc/4.1.7.RELEASE/org/springframework/jdbc/core/JdbcTemplate.java#JdbcTemplate.execute%28org.springframework.jdbc.core.StatementCallback%29でソースコードを読む場合:

public static void doReleaseConnection(Connection con, DataSource dataSource) throws SQLException { 
    if (con == null) { 
     return; 
    } 
    if (dataSource != null) { 
     ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); 
     if (conHolder != null && connectionEquals(conHolder, con)) { 
      // It's the transactional Connection: Don't close it. 
      conHolder.released(); 
      return; 
     } 
    } 
    logger.debug("Returning JDBC Connection to DataSource"); 
    doCloseConnection(con, dataSource); 
} 

public static void doCloseConnection(Connection con, DataSource dataSource) throws SQLException { 
    if (!(dataSource instanceof SmartDataSource) || ((SmartDataSource) dataSource).shouldClose(con)) { 
     con.close(); 
    } 
} 

最も可能性の高いデータソースのインスタンスがプールされている場合、接続が再利用のために戻ってリリースされ、閉じていない。

0

春ブーツのドキュメントによると、次のような春のプールに接続の最大数を割り当てることができますので:

spring.datasource.tomcat.max-active=50 

これは明らかにのみ埋め込まれたWebサーバで動作します。 Jbossのようなものにデプロイする場合は、サーバーの設定ファイルでそのプロパティを設定する必要があります。

関連する問題