У нас есть весеннее загрузочное веб-приложение, которое мы уже используем в 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, я просто надеюсь, что не правильно его использую.
Заранее спасибо.