пул соединений не освобождается после того, как используется для создания JasperReport - PullRequest
0 голосов
/ 25 мая 2018

У нас есть весеннее загрузочное веб-приложение, которое мы уже используем в prod.Недавно компания попросила подготовить некоторые отчеты по сверке EOD в виде не редактируемых PDF-файлов.

Мы скомпилировали несколько отчетов Jasper и начали генерировать отчеты с использованием следующего кода:

private void generatePdfReport(final Report report) throws SQLException, JRException {
    final JasperReport jasperReport = JASPER_REPORT_MAP.get(report);
    if (jasperReport == null) {
        throw new UnsupportedOperationException("The report is not supported: " + report.getName());
    } else {
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            final JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, dataSource.getConnection());
            final JRPdfExporter exporter = new JRPdfExporter();
            exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
            exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(report.getFormattedFilename() + Report.EXT_PDF));
            exporter.setConfiguration(reportConfig);
            exporter.setConfiguration(exportConfig);
            exporter.exportReport();
            log.info("PDF Report ({}) exported successfully!", report.getName());
        } finally {
            if (connection != null) {
                log.info("about to close db connection");
                connection.close();
                connection = null;
            }
        }
    }
}

Отчеты работают нормальноно после создания десяти отчетов мы начали получать исключения тайм-аута от источника данных Hitaki, жалуясь на то, что ему не удалось установить соединение менее чем за 30 секунд.

Размер пула соединений по умолчанию для источника данных Hitaki равен десяти, и некоторые точки останова устанавливаются вВ классах Хитаки мы могли видеть, что все десять соединений помечены как IN_USE.Изменение источника данных на commons-dbcp мало что изменило.В этот раз тайм-ауты отсутствуют, но после генерации восьми отчетов обработка блокируется на неопределенный срок.Восемь - это размер пула по умолчанию для источника данных dbcp.

Заключая, что это не проблема источника данных, мы поместили некоторые точки останова в jasper jar и заметили, что как набор результатов, так и подготовленные операторы были правильно закрыты.

Наши источники данных Hitaki / DBCP заключены в весенний экземпляр TransactionAwareDataSourceProxy.Извлечение этой упаковки ничего не изменило.

В итоге я заменил источник данных на очень простой источник данных (явно не подходящий для производства), и все работало нормально.Посмотрите код ниже, показывающий, как прокомментировано то, что мы попробовали:

    @Bean
    public DataSource dataSource() {
        final String url = env.getProperty("database.url");
        final String userName = env.getProperty("gmm.schema");
        log.info("Creating DataSource for {}@{}", userName, url);
        // final HikariDataSource dataSource = new HikariDataSource();
        // final BasicDataSource dataSource = new BasicDataSource();
        final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(userName);
        dataSource.setPassword(env.getProperty("gmm.password"));
        // dataSource.setDriverClassName(env.getProperty("database.driver"));
       dataSource.setDriverClass(oracle.jdbc.driver.OracleDriver.class);
        return dataSource;
        // return new TransactionAwareDataSourceProxy(dataSource);
    }

Теперь мой вопрос:

Что может вызвать такое поведение, и как мне исправить или расследовать дальше.Нет проблем с подключением, если мы закомментируем работу по составлению отчетов, но, с другой стороны, я не вижу, как с помощью базового источника данных это исправить.

Будучи новичком в Jasper Reports, я просто надеюсь, что не правильно его использую.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 мая 2018

Попробуйте передать созданный вами объект подключения методу fillReport.

connection = dataSource.getConnection();
final JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, dataSource.getConnection());

в

connection = dataSource.getConnection();
        final JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, connection);

Приветствия

...