PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Hasilkan objek `DataSource` untuk Postgres JDBC, secara terprogram

tl;dr

PGSimpleDataSource kelas yang dibundel dengan driver JDBC dari jdbc.postgresql.org mengimplementasikan DataSource antarmuka. Konfigurasikan detail koneksi database Anda di PGSimpleDataSource objek, dan menyebarkannya sebagai DataSource objek.

PGSimpleDataSource ds = new PGSimpleDataSource() ;  
ds.setServerName( "localhost" );  
ds.setDatabaseName( "your_db_name_here" );   
ds.setUser( "scott" );       
ds.setPassword( "tiger" );   

Gunakan objek itu untuk membuat koneksi ke database sesuai kebutuhan. Gunakan sintaks try-with-resources yang nyaman.

try
(
    Connection conn = ds.getConnection() ;
) 
{ … }

Implementasi driver JDBC

Driver JDBC Anda mungkin menyediakan implementasi DataSource antarmuka.

Objek implementasi ini berisi informasi yang diperlukan untuk membuat dan mengkonfigurasi koneksi ke database, seperti:

  • Nama &kata sandi pengguna basis data
  • Alamat IP &nomor port server basis data

Hingga tiga jenis implementasi yang tersedia mungkin tersedia:

  • Seringkali implementasi seperti itu adalah pembungkus tipis di sekitar DriverManager . Setiap kali Anda menelepon DataSource::getConnection pada objek implementasi seperti itu, Anda mendapatkan koneksi database baru.
  • Atau, implementasi mungkin menggunakan kumpulan koneksi di bawahnya untuk memasok koneksi yang sudah ada. Sambungan ini dibagikan dan diperiksa kembali, seperti buku di perpustakaan, untuk didaur ulang untuk penggunaan berulang.
  • Sebuah implementasi dapat mendukung Java Transaction API, mendukung X/Open XA, untuk kebutuhan canggih seperti mengoordinasikan transaksi di berbagai sumber daya seperti database dan antrian pesan. Tidak seperti yang biasa digunakan, jadi saya mengabaikan jenis ini di sini.

Driver dari jdbc.postgresql.org

Driver bebas biaya open-source dari jdbc.postgresql.org menyediakan ketiga jenis DataSource penerapan. Tetapi penulis tidak menyarankan untuk benar-benar menggunakan tipe kumpulan koneksi mereka dalam produksi; jika Anda ingin penyatuan, gunakan perpustakaan penyatuan koneksi pihak ketiga. Dan kami mengabaikan tipe XA.

Jadi mari kita lihat implementasi DataSource koneksi baru yang sederhana setiap kali :org.postgresql.ds.PGSimpleDataSource

Mengonfigurasi objek sumber data

Buat instance objek kosong, lalu panggil serangkaian metode penyetel untuk mengonfigurasi skenario database khusus Anda. Metode penyetel diwarisi dari org.postgresql.ds.common.BaseDataSource .

Kami belum memperbarui ke antarmuka DataSource , sehingga kita dapat memanggil berbagai metode penyetel. Lihat contoh kode dan pembahasan di halaman Sumber Data dan JNDI.

PGSimpleDataSource ds = new PGSimpleDataSource() ;  // Empty instance.
ds.setServerName( "localhost" );  // The value `localhost` means the Postgres cluster running locally on the same machine.
ds.setDatabaseName( "testdb" );   // A connection to Postgres must be made to a specific database rather than to the server as a whole. You likely have an initial database created named `public`.
ds.setUser( "testuser" );         // Or use the super-user 'postgres' for user name if you installed Postgres with defaults and have not yet created user(s) for your application.
ds.setPassword( "password" );     // You would not really use 'password' as a password, would you?

Umumnya saya akan menggunakan metode setter terpisah ini. Atau, Anda membuat String, URL, dengan berbagai informasi yang akan disetel di DataSource dalam satu pukulan. Jika Anda ingin pergi ke rute itu, panggil setUrl .

Itu mencakup dasar-dasarnya. Tetapi Anda mungkin ingin atau membutuhkan beberapa setter lainnya. Sebagian besar mengatur nilai properti Postgres di server. Semua properti memiliki default cerdas, tetapi Anda mungkin ingin menggantinya untuk situasi khusus.

ds.setPortNumber( 6787 ) ;  // If not using the default '5432'.
ds.setApplicationName( "whatever" ) ;   // Identify the application making this connection to the database. Also a clever way to back-door some information to the Postgres server, as you can encode small values into this string for later parsing. 
ds.setConnectTimeout( … ) ;  // The timeout value used for socket connect operations, in whole seconds. If connecting to the server takes longer than this value, the connection is broken.
ds.setSocketTimeout( … ) ;  // The timeout value used for socket read operations. If reading from the server takes longer than this value, the connection is closed. This can be used as both a brute force global query timeout and a method of detecting network problems.
ds.setReadOnly( boolean ) ;  // Puts this connection in read-only mode.

Jika menggunakan TLS (sebelumnya dikenal sebagai SSL) untuk mengenkripsi koneksi database guna melindungi dari penyadapan atau manipulasi jahat, gunakan beberapa penyetel untuk itu.

Untuk properti Postgres apa pun tanpa metode penyetel tertentu, Anda dapat memanggil setProperty( PGProperty property, String value ) .

Anda dapat memeriksa atau memverifikasi setelan pada sumber data ini dengan memanggil salah satu dari banyak metode pengambil.

Setelah mengonfigurasi PGSimpleDataSource , Anda dapat meneruskan ke seluruh basis kode Anda hanya sebagai DataSource obyek. Ini melindungi basis kode Anda dari kejutan perubahan ke DataSource lain implementasi atau perubahan ke driver JDBC lain.

DataSource dataSource = ds ;  // Upcasting from concrete class to interface.
return dataSource ; 

Menggunakan sumber data

Menggunakan DataSource sangat sederhana karena hanya menyediakan dua metode, sepasang variasi pada getConnection untuk mendapatkan Connection objek untuk pekerjaan database Anda.

Connection conn = dataSource.getConnection() ; 

Setelah selesai dengan Connection , praktik terbaik adalah memastikan untuk menutupnya. Gunakan sintaks try-with-resources untuk menutup koneksi secara otomatis, atau menutupnya secara eksplisit.

conn.close() ;

Ingatlah bahwa DataSource sebenarnya bukan sumber data. Sebuah DataSource benar-benar merupakan sumber untuk menghasilkan/mengakses koneksi ke database. Menurut saya, ini keliru, karena saya menganggapnya sebagai ConnectionSource . DataSource berbicara ke database Anda hanya cukup lama untuk masuk dengan nama pengguna dan kata sandi. Setelah masuk itu, Anda menggunakan Connection objek untuk berinteraksi dengan database.

Menyimpan DataSource

Setelah dikonfigurasi, Anda ingin menyimpan DataSource itu objek di sekitar, di-cache. Tidak perlu mengkonfigurasi ulang berulang kali. Implementasinya harus ditulis agar thread-safe. Anda dapat menghubungi getConnection kapan saja dari mana saja.

Untuk aplikasi Java kecil yang sederhana, Anda mungkin ingin menyimpannya sebagai bidang pada satu atau dalam variabel global statis.

Untuk aplikasi berbasis Servlet seperti Vaadin app, Anda akan membuat kelas yang mengimplementasikan ServletContextListener antarmuka. Di kelas itu Anda akan membuat DataSource . Anda objek saat aplikasi web Anda diluncurkan. Dari sana Anda akan menyimpan objek di ServletContext objek dengan meneruskan ke setAttribute . Context adalah istilah teknis untuk 'aplikasi web'. Ambil dengan memanggil getAttribute dan casting ke DataSource .

Dalam skenario perusahaan, DataSource dapat disimpan dalam implementasi yang sesuai dengan JNDI. Beberapa wadah Servlet seperti Apache Tomcat dapat menyediakan implementasi JNDI. Beberapa organisasi menggunakan server seperti server LDAP. Mendaftarkan &mengambil DataSource Anda objek dengan JNDI tercakup dalam banyak Pertanyaan &Jawaban lainnya di Stack Overflow.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. instalasi instace tunggal postgresql

  2. Bagaimana cara mengatur ulang urutan di postgres dan mengisi kolom id dengan data baru?

  3. Kesalahan intarray postgresql:simbol tidak terdefinisi:pfree

  4. Memasukkan array menggunakan permata Sekuel di PostgreSQL

  5. Cara menyimpan array atau beberapa nilai dalam satu kolom