Jdbi: Dokumen / Contoh: Berikan contoh (repo) untuk menunjukkan bagaimana mengintegrasikan jdbi3 di spring-boot

Dibuat pada 20 Feb 2018  ·  10Komentar  ·  Sumber: jdbi/jdbi

Saya ingin mengintegrasikan jdbi3 ke spring-boot. Tetapi sulit untuk menemukan semua bagian yang diperlukan di internet untuk mendapatkan gambaran lengkapnya.
Apakah ada peluang untuk menyediakan repositori jdbi-examples di github, yang hanya menunjukkan cara mengatur aplikasi boot-pegas dengan jdbi3?

Saya akan sangat menghargai itu. Terima kasih banyak.
/Seb

doc help wanted improvement

Komentar yang paling membantu

Saya telah menggunakan metode berikut dengan jdbi2.x tanpa masalah. Telah mengujinya dengan jdbi3.x dan belum melihat masalah apa pun. Ini terlihat seperti cara yang lebih sederhana untuk mendapatkan pegas untuk mengelola transaksi saat menggunakan jdbi.

Pada dasarnya Anda membungkus proxy dengan TransactionAwareDataSourceProxy dan menggunakannya untuk membuat instance Jdbi. (Saya punya c/p'd dari jawaban @arteam sehingga contohnya konsisten)

    <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);
    }

Semua 10 komentar

Dalam kasus sederhana, jika Anda tidak memerlukan integrasi dengan fasilitas transaksi Spring, Anda cukup menginisialisasi Jdbi dan DAO Anda dalam konfigurasi 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);
    }

hai @bastman , @alwins0n memberikan kontribusi dukungan Spring yang lebih baik di #989 - apakah Anda ingin meninjau karyanya sejauh ini dan mengomentari apakah itu membuat integrasi Spring Anda lebih jelas, atau jika Anda meminta sesuatu yang sedikit berbeda?

Mengintegrasikan jdbi untuk musim semi boot sepele, Anda hanya perlu menyiapkan @Bean metode dijelaskan di Anda @Configuration kelas untuk mengembalikan Jdbi misalnya - seperti yang ditunjukkan oleh @arteam

Hal yang lebih sulit, seperti yang dilakukan di PR musim semi saya, adalah mengintegrasikan jdbi ke dalam manajemen transaksi musim semi. Anda pasti harus memeriksanya, jika itu yang Anda cari.

Selanjutnya, jika ini disetujui, saya mempertimbangkan untuk membuat konfigurasi otomatis/pegas-boot-starter untuk boot musim semi (2). jika itu yang anda cari. (sebenarnya ini adalah excersize yang bagus jika Anda ingin mencoba sendiri: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html )

Saya telah menggunakan metode berikut dengan jdbi2.x tanpa masalah. Telah mengujinya dengan jdbi3.x dan belum melihat masalah apa pun. Ini terlihat seperti cara yang lebih sederhana untuk mendapatkan pegas untuk mengelola transaksi saat menggunakan jdbi.

Pada dasarnya Anda membungkus proxy dengan TransactionAwareDataSourceProxy dan menggunakannya untuk membuat instance Jdbi. (Saya punya c/p'd dari jawaban @arteam sehingga contohnya konsisten)

    <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);
    }

terlihat bagus, saya tidak tahu bahwa kelas ini ada.

bisakah Anda melihat PR yang disebutkan sebelumnya? sudah ada saran yang dibuat mengenai pabrik koneksi "sadar transaksi" yang mendasari jdbi.

iirc masalahnya tetap bahwa koneksi dan pegangan tidak dalam keadaan sinkron. jadi ds ini mengembalikan koneksi (yang terikat dengan transaksi) yang ditutup pada akhir transaksi. sedangkan pegangan yang digunakan tidak ditutup dan melempar pengecualian pada upaya untuk (kembali) menggunakannya.

tapi mungkin ini bukan masalah besar dan agak menyudutkan kasus-y dan solusi Anda cocok untuk 99% kasus penggunaan.

singkatnya: dengan pendekatan Anda, sumber daya yang dikelola transaksi adalah koneksinya. dalam PR saya sumber daya yang dikelola adalah pegangannya.

Ada masalah terkait penggunaan jdbi3 dengan stringtemplate4 dan impor grup. Lihat masalah saya https://github.com/jdbi/jdbi/issues/1052
Masalah ini juga mencakup tautan ke kerangka repo yang berfungsi penuh untuk menggunakan jdbi3 di boot musim semi 2.0.0

Ketika saya menerapkan @kaandok solusi 's dengan penjelasan @Transactional Spring, saya mendapatkan berikut pengecualian karena menutup gagang ketika terdapat transaksi terbuka. Apakah ada solusi yang direkomendasikan/dapat diterapkan untuk itu?

"Penanganan transaksi yang tidak benar terdeteksi: Pegangan dengan transaksi terbuka ditutup. Transaksi harus dilakukan secara eksplisit atau dibatalkan sebelum menutup Pegangan. Jdbi telah membatalkan transaksi ini secara otomatis."

@cengha bisakah Anda memberikan beberapa kode yang menunjukkan masalah Anda?

Di bawah ini adalah kelas konfigurasi:

<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;
}

Berikut adalah lapisan layanan

    <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;
    }

Ketika komit otomatis disetel ke false, saya mendapatkan kesalahan transaksi yang disebutkan tetapi jika disetel ke true tidak ada kesalahan transaksi tetapi rollback kali ini tidak berfungsi (setelah pengecualian runtime) dan objek X disimpan ke database. Saya menggunakan pegas 2.0.3, JDBI 3.0.0-beta2 .

Masalah terpecahkan. Saya menggunakan versi JDBI yang lebih lama, setelah memperhatikan utas ini memperbarui perpustakaan dan semuanya terselesaikan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat