Bagaimana saya bisa mengkonfigurasi dan menggunakan dua sumber data?
Sebagai contoh di sini adalah apa yang saya miliki untuk sumber data pertama:
properti aplikasi
#first db
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver
#second db ...
Kelas aplikasi
@SpringBootApplication
public class SampleApplication
{
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
Bagaimana cara saya memodifikasi application.properties
untuk menambahkan sumber data lain? Bagaimana cara autowire untuk digunakan oleh repositori yang berbeda?
java
spring
spring-boot
spring-mvc
datasource
juventus
sumber
sumber
Perbarui 2018-01-07 dengan Spring Boot 1.5.8.RELEASE
Sebagian besar jawaban tidak menyediakan cara menggunakannya (sebagai sumber data itu sendiri dan sebagai transaksi), hanya bagaimana mengonfigurasinya.
Anda dapat melihat contoh runnable dan beberapa penjelasan di https://www.surasint.com/spring-boot-with-multiple-databases-example/
Saya menyalin beberapa kode di sini.
Pertama, Anda harus mengatur properti application.prop seperti ini
Kemudian definisikan mereka sebagai penyedia (@Bean) seperti ini:
Perhatikan bahwa saya memiliki @Bean (nama = "dataource1") dan @Bean (nama = "dataource2"), maka Anda dapat menggunakannya ketika kita membutuhkan sumber data sebagai @Qualifier ("dataource1") dan @Qualifier ("dataource2"), sebagai contoh
Jika Anda peduli dengan transaksi, Anda harus mendefinisikan DataSourceTransactionManager untuk keduanya, seperti ini:
Maka Anda bisa menggunakannya seperti
atau
Ini sudah cukup. Lihat contoh dan detail di tautan di atas.
sumber
Lihat dokumentasi resmi
Membuat lebih dari satu sumber data bekerja sama dengan membuat yang pertama. Anda mungkin ingin menandai salah satunya sebagai @Primary jika Anda menggunakan konfigurasi otomatis default untuk JDBC atau JPA (maka yang akan diambil oleh suntikan @Autowired).
sumber
Saya juga harus mengatur koneksi ke 2 sumber data dari aplikasi Spring Boot, dan itu tidak mudah - solusi yang disebutkan dalam dokumentasi Spring Boot tidak berfungsi. Setelah lama menggali melalui internet saya membuatnya bekerja dan ide utama diambil dari artikel ini dan banyak tempat lainnya.
Solusi berikut ini ditulis dalam Kotlin dan bekerja dengan Spring Boot 2.1.3 dan Hibernate Core 5.3.7 . Masalah utama adalah bahwa itu tidak cukup hanya untuk mengatur konfigurasi DataSource yang berbeda , tetapi juga diperlukan untuk mengkonfigurasi EntityManagerFactory dan TransactionManager untuk kedua database.
Berikut adalah konfigurasi untuk database (Utama) pertama:
Dan ini konfigurasi untuk database kedua:
Properti untuk sumber data seperti ini:
Masalah dengan properti adalah bahwa saya harus mendefinisikan jdbc-url bukan url karena kalau tidak saya memiliki pengecualian.
ps Anda juga mungkin memiliki skema penamaan yang berbeda di database Anda, yang merupakan kasus bagi saya. Karena Hibernate 5 tidak mendukung semua skema penamaan sebelumnya, saya harus menggunakan solusi dari jawaban ini - mungkin juga akan membantu seseorang.
sumber
mapOf("hibernate.physical_naming_strategy" to "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy", "hibernate.implicit_naming_strategy" to "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy" )
Ini solusi lengkapnya
Karena kita akan mendapatkan akses dua database yang berbeda (db1, db2), kita perlu mengkonfigurasi setiap konfigurasi sumber data secara terpisah seperti:
Sumber Data Kedua:
Di sini Anda dapat menemukan Contoh lengkap di blog saya: Boot Musim Semi dengan Berbagai Konfigurasi DataSource
sumber
sumber
Saya menggunakan mybatis - springboot 2.0 tech stack, solusi:
Catatan: 1) @Primary -> @primary
2) ---. "Jdbc-url" di properti -> Setelah migrasi Spring Boot 2.0: jdbcUrl diperlukan dengan driverClassName
sumber
@ Penjelasan primer saat digunakan terhadap metode seperti di bawah ini berfungsi dengan baik jika dua sumber data berada pada lokasi / server db yang sama.
Jika sumber data ada di server yang berbeda lebih baik menggunakan @Component bersama dengan penjelasan @Primary . Cuplikan kode berikut berfungsi dengan baik pada dua sumber data yang berbeda di lokasi yang berbeda
sumber
Persyaratan saya sedikit berbeda tetapi menggunakan dua sumber data.
Saya telah menggunakan dua sumber data untuk entitas JPA yang sama dari paket yang sama. Satu untuk mengeksekusi DDL pada startup server untuk membuat / memperbarui tabel dan satu lagi untuk DML saat runtime.
Koneksi DDL harus ditutup setelah pernyataan DDL dieksekusi, untuk mencegah penggunaan lebih lanjut dari previlleges pengguna super di mana pun dalam kode.
Properti
Kelas konfigurasi sumber data
// Kelas 1 Config untuk sumber Data DDL
// Kelas Konfigurasi ke-2 untuk sumber Data DML
// Penggunaan sumber data DDL dalam kode.
// Penggunaan sumber data DML dalam kode.
sumber