Я хотел бы интегрировать jdbi3 в spring -boot. Но сложно найти в Интернете все необходимые детали, чтобы получить полную картину.
Есть ли шанс предоставить репозиторий jdbi-examples на github, который просто демонстрирует, как настроить приложение с весенней загрузкой с помощью jdbi3?
Я был бы очень признателен за это. Большое спасибо.
/ Себ
В простом случае, если вам не нужна интеграция со средствами транзакций Spring, вы можете просто инициализировать Jdbi
и свои DAO в конфигурации Spring:
<strong i="7">@Bean</strong>
public DataSource dataSource() {
// From Spring Boot's connection pool configuration;
}
<strong i="8">@Bean</strong>
public Jdbi createJdbi(DataSource dataSource) {
return Jdbi.create(dataSource);
}
<strong i="9">@Bean</strong>
public UserDao userDao(Jdbi jdbi) {
return jdbi.onDemand(UserDao.class);
}
привет @bastman , @ alwins0n обеспечивает лучшую поддержку Spring в # 989 - не хотели бы вы просмотреть его работу до сих пор и прокомментировать, делает ли она вашу интеграцию Spring более понятной или вы просите чего-то немного другого?
Интеграция jdbi в весеннюю загрузку тривиальна, вам просто нужно настроить аннотированный метод @Bean
в своем классе @Configuration
для возврата экземпляра Jdbi - как показано @arteam
Более сложная вещь, как было сделано в моем весеннем PR, - это интегрировать jdbi в управление весенними транзакциями. Вы должны обязательно проверить это, если это то, что вы ищете.
Кроме того, если это будет одобрено, я рассматриваю возможность создания автоконфигурации / spring-boot-starter для весенней загрузки (2). если это то, что вы ищете. (на самом деле это хорошее упражнение, если вы хотите попробовать себя: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html)
Я без проблем использовал следующий метод с jdbi2.x. Тестировали его с помощью jdbi3.x и не видели никаких проблем. Это похоже на более простой способ заставить Spring управлять транзакциями при использовании jdbi.
Обычно вы оборачиваете прокси-сервер TransactionAwareDataSourceProxy и используете его для создания экземпляра Jdbi. (У меня есть c / p'd из ответа @arteam , чтобы примеры были последовательными)
<strong i="8">@Bean</strong>
public DataSource dataSource() {
// From Spring Boot's connection pool configuration;
}
<strong i="9">@Bean</strong>
public TransactionAwareDataSourceProxy txDataSource(DataSource dataSource) {
return new TransactionAwareDataSourceProxy(dataSource);
}
<strong i="10">@Bean</strong>
public PlatformTransactionManager transactionManager(DataSource dataSource) {
//not sure if this is needed
return new DataSourceTransactionManager(dataSource);
}
<strong i="11">@Bean</strong>
public Jdbi createJdbi(TransactionAwareDataSourceProxy dataSource) {
//note that parameter is TransactionAwareDataSourceProxy instead of plain DataSource
return Jdbi.create(dataSource);
}
<strong i="12">@Bean</strong>
public UserDao userDao(Jdbi jdbi) {
return jdbi.onDemand(UserDao.class);
}
выглядит хорошо, я не знал, что этот класс существует.
не могли бы вы заглянуть в упомянутый ранее PR? уже было внесено предложение относительно фабрики соединений с поддержкой транзакций, лежащей в основе jdbi.
Проблема остается в том, что соединение и дескриптор не синхронизированы по состоянию. поэтому этот ds возвращает соединение (которое привязано к транзакции), которое закрывается по окончании транзакции. тогда как используемый дескриптор не закрывается и выдает исключения при попытке (повторно) использовать его.
но, возможно, это не такая уж большая проблема и скорее угловой случай, и ваше решение подходит для 99% случаев использования.
Короче говоря: с вашим подходом управляемый транзакцией ресурс - это соединение. в моем PR управляемые ресурсы - это ручка.
Возникают проблемы, связанные с использованием jdbi3 со строковым шаблоном4 и групповым импортом. См. Мою проблему https://github.com/jdbi/jdbi/issues/1052
В этом выпуске также есть ссылка на полностью рабочий каркас репо для использования jdbi3 в весенней загрузке 2.0.0.
Когда я реализовать @kaandok решения «s с аннотацией @Transactional Спринга, я получаю следующее исключение из - за закрытием ручки , когда существует открытые транзакции. Есть ли какое-либо рекомендуемое / применимое решение для этого?
«Обнаружена неправильная обработка транзакции: дескриптор с открытой транзакцией был закрыт. Транзакции должны быть явно зафиксированы или откатаны перед закрытием дескриптора. Jdbi автоматически откатил эту транзакцию».
@cengha, не могли бы вы предоставить код, демонстрирующий вашу проблему?
Ниже приведен класс конфигурации:
<strong i="6">@Bean</strong>
public HikariDataSource hikariDataSource() {
HikariConfig dataSourceConfig = new HikariConfig();
dataSourceConfig.setDriverClassName(driverClassName);
dataSourceConfig.setJdbcUrl(jdbcUrl);
dataSourceConfig.setUsername(username);
dataSourceConfig.setPassword(password);
dataSourceConfig.setAutoCommit(true);
return new HikariDataSource(dataSourceConfig);
}
<strong i="7">@Bean</strong>
public TransactionAwareDataSourceProxy transactionAwareDataSourceProxy(HikariDataSource dataSource) {
return new TransactionAwareDataSourceProxy(dataSource);
}
<strong i="8">@Bean</strong>
public PlatformTransactionManager platformTransactionManager(HikariDataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
<strong i="9">@Bean</strong>
public Jdbi jdbi(TransactionAwareDataSourceProxy transactionAwareDataSourceProxy) {
Jdbi jdbi = Jdbi.create(transactionAwareDataSourceProxy);
jdbi.installPlugin(new SqlObjectPlugin());
return jdbi;
}
Вот сервисный слой
<strong i="13">@Override</strong>
<strong i="14">@Transactional</strong>
public Long createX(X x) {
Long aLong = XDao.insertX(x);
if(true) throw new RuntimeException();
return aLong;
}
Когда для автоматической фиксации установлено значение false, я получил упомянутую ошибку транзакции, но если для нее установлено значение true, ошибок транзакции нет, но на этот раз откат не работает (после исключения времени выполнения), и поэтому объект X сохраняется в базе данных. Я использую spring 2.0.3, JDBI 3.0.0-beta2.
Задача решена. Я использовал более старую версию JDBI, заметив, что эта ветка обновила библиотеку, и все было решено.
Самый полезный комментарий
Я без проблем использовал следующий метод с jdbi2.x. Тестировали его с помощью jdbi3.x и не видели никаких проблем. Это похоже на более простой способ заставить Spring управлять транзакциями при использовании jdbi.
Обычно вы оборачиваете прокси-сервер TransactionAwareDataSourceProxy и используете его для создания экземпляра Jdbi. (У меня есть c / p'd из ответа @arteam , чтобы примеры были последовательными)