Jdbi: Документы / пример: предоставьте пример (репо), чтобы показать, как интегрировать jdbi3 в spring -boot

Созданный на 20 февр. 2018  ·  10Комментарии  ·  Источник: jdbi/jdbi

Я хотел бы интегрировать jdbi3 в spring -boot. Но сложно найти в Интернете все необходимые детали, чтобы получить полную картину.
Есть ли шанс предоставить репозиторий jdbi-examples на github, который просто демонстрирует, как настроить приложение с весенней загрузкой с помощью jdbi3?

Я был бы очень признателен за это. Большое спасибо.
/ Себ

doc help wanted improvement

Самый полезный комментарий

Я без проблем использовал следующий метод с 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);
    }

Все 10 Комментарий

В простом случае, если вам не нужна интеграция со средствами транзакций 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, заметив, что эта ветка обновила библиотеку, и все было решено.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги