2016-12-01 3 views
0

В Spring Boot, делает ли jdbcTemplate автоматическое закрытие соединения один раз после выполнения запроса? В этом случае я выполняю запрос с использованием jdbcTemplate (где он подключается к teradata), но сеанс не закрывается после выполнения запроса. Как закрыть сессию?Как закрыть соединение в Spring Boot после выполнения jdbcTemplate запроса?

Это мой дао файл -

@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

Plz share pom.xml, если вы используете maven. –

ответ

0

JdbcTemplate получает свои связи с javax.sql.DataSource реализации - который передается в конструктор link.

В DataSource s может быть основной (создает Connection объекта для каждого запроса) или пулов (имеет пул соединений и просто «заимствует» один для использования данного запроса в).

Таким образом, похоже, что соединение не закрывается, потому что вы передали некоторый источник данных объединения JdbcTemplate по имени devbJdbc. Если вы действительно хотите, чтобы закрыть все открыто соединение, чтобы сделать JdbcTemplate работу, вы можете использовать основной DataSource реализации: org.springframework.jdbc.datasource.SimpleDriverDataSource просто так:

@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 не закрывает соединение автоматически один раз после выполнения запроса?

Следует ли закрыть соединение или вернуть его в пул соединений (в случае объединения 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(); 
    } 
} 

Моста-вероятно, если экземпляр DataSource будет объединен, соединение релиз обратно для повторного использования и не закрыт.

0

Согласно загрузки документации пружинных можно выделить максимальное количество подключений к пружинному бассейна примерно так:

spring.datasource.tomcat.max-active=50 

Это, очевидно, будет работать только со встроенным веб-сервером. Если вы развертываете его на нечто вроде Jboss, вам придется настроить это свойство в конфигурационном файле сервера.

Смежные вопросы