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 meneleponDataSource::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.