Spring boot: соединение с базой данных не закрывается должным образом - PullRequest
0 голосов
/ 03 сентября 2018

Я периодически выполняю запросы (по планировщику), используя мое приложение Spring Boot

application.properties

src_mssqlserver_url=jdbc:sqlserver://192.168.0.1;databaseName=Test;
src_mssqlserver_username=tester
src_mssqlserver_password=tester1
src_mssqlserver_driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

Источник данных и JdbcTemplate Bean

@Primary
    @Bean(name = "src_mssqlserver")
    @ConfigurationProperties(prefix = "spring.ds_mssqlserver")
    public DataSource srcDataSource() {

        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("src_mssqlserver_driverClassName"));
        dataSource.setUrl(env.getProperty("src_mssqlserver_url"));
        dataSource.setUsername(env.getProperty("src_mssqlserver_username"));
        dataSource.setPassword(env.getProperty("src_mssqlserver_password"));
        return dataSource;
    }

    @Bean(name = "srcJdbcTemplate")
    public JdbcTemplate srcJdbcTemplate(@Qualifier("src_mssqlserver") DataSource dsSrcSqlServer) {
        return new JdbcTemplate(dsSrcSqlServer);
    }

Использование: этот метод вызывается из планировщика со списком элементов для обработки (обычно 1000 записей), этот процесс выполняется один раз в час.

@Autowired
@Qualifier("srcJdbcTemplate")
private JdbcTemplate srcJdbcTemplate;

public void batchInsertUsers(final List<User> users) {
        String queryInsert = "INSERT INTO [User] ([Name]"
                + "     , [Created_Date]"
                + "     , [Notes])"
                + " VALUES (?, SYSDATETIMEOFFSET(), ?)";

        srcJdbcTemplate.batchUpdate(queryInsert, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                User user = users.get(i);

                ps.setString(1, user.getName());
                ps.setString(2, user.getNotes());
            }

            @Override
            public int getBatchSize() {
                return sites.size();
            }
        });

Я получаю предупреждения от администратора базы данных о том, что в моем коде слишком много открытых соединений. Пожалуйста, поделитесь каким-нибудь стандартным и работоспособным способом справиться с такой ситуацией.

Спасибо.

1 Ответ

0 голосов
/ 03 сентября 2018

DriverManagerDataSource НЕ предназначен для производства, он открывает и закрывает соединение каждый раз, когда оно требуется.

Используйте пул соединений, например c3p0DataSource.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...