Mendapatkan DataSource
implementasi
Biasanya driver JDBC
Anda menyediakan implementasi javax.sql.DataSource
.
Untuk detail selengkapnya, lihat Jawaban saya untuk Pertanyaan serupa.
PGSimpleDataSource
Jika menggunakan driver JDBC dari jdbc.postgresql.org
, Anda dapat menggunakan org.postgresql.ds.PGSimpleDataSource
kelas sebagai DataSource
. Anda implementasi.
Buat instance objek bertipe PGSimpleDataSource
, lalu panggil metode penyetel untuk menyediakan semua info yang diperlukan untuk terhubung ke server database Anda. Halaman web di situs DigitalOcean mencantumkan semua informasi ini untuk instance database khusus Anda.
Pada dasarnya ini:
PGSimpleDataSource dataSource = new PGSimpleDataSource();
dataSource.setServerName( "your-server-address-goes-here" );
dataSource.setPortNumber( your-port-number-goes-here );
dataSource.setDatabaseName( "defaultdb" );
dataSource.setUser( "doadmin" );
dataSource.setPassword( "your-password-goes-here" );
Nama server jamak dan nomor port
Sayangnya, versi tunggal dari metode setServerName
dan setPortNumber
tidak digunakan lagi. Meskipun menjengkelkan, kita mungkin harus menggunakan versi jamak dari metode tersebut (setServerNames
&setPortNumbers
) yang masing-masing mengambil array. Kami mengisi sepasang array elemen tunggal, String[]
dan int[]
, dengan alamat server kami dan nomor port
menggunakan literal array:
- { "your-server-address-goes-here" }
- { your-port-number-goes-here }
PGSimpleDataSource dataSource = new PGSimpleDataSource();
String[] serverAddresses = { "your-server-address-goes-here" };
dataSource.setServerNames( serverAddresses );
int[] serverPortNumbers = { your-port-number-goes-here };
dataSource.setPortNumbers( serverPortNumbers );
dataSource.setDatabaseName( "defaultdb" );
dataSource.setUser( "doadmin" );
dataSource.setPassword( "your-password-goes-here" );
Enkripsi SSL/TLS
Terakhir kita perlu menambahkan info untuk enkripsi SSL/TLS yang dibahas dalam Pertanyaan.
Ironisnya, jangan jangan panggil setSsl( true )
Anda akan mengira kami akan memanggil setSsl
metode dan berikan true
. Tapi tidak. Meskipun kontra-intuitif, menyetelnya ke true akan menyebabkan upaya koneksi Anda gagal. Saya tidak tahu mengapa demikian. Tapi coba-coba membuat saya menghindari panggilan itu.
Sertifikat CA
Agar aplikasi Java sisi klien Anda memulai koneksi SSL/TLS, driver JDBC harus memiliki akses ke sertifikat CA digunakan oleh Digital Ocean. Di halaman admin Digital Ocean Anda, klik Download CA certificate
tautan untuk mengunduh file teks kecil. File itu akan diberi nama ca-certificate.crt
.
Kita perlu memasukkan teks file itu ke driver JDBC kita sebagai string. Lakukan hal berikut untuk memuat file ke dalam string teks.
// Get CA certificate used in TLS connections.
Path path = Paths.get( "/Users/basilbourque/Downloads/ca-certificate.crt" );
String cert = null;
try
{
cert = Files.readString( path , StandardCharsets.UTF_8 );
System.out.println( "cert = " + cert );
}
catch ( IOException ex )
{
throw new IllegalStateException( "Unable to load the TLS certificate needed to make database connections." );
}
Objects.requireNonNull( cert );
if ( cert.isEmpty() ) {throw new IllegalStateException( "Failed to load TLS cert." ); }
Teruskan teks sertifikat CA tersebut ke driver JDBC Anda dengan panggilan ke DataSource::setSslCert
. Perhatikan bahwa kami bukan memanggil setSslRootCert
. Jangan mencampuradukkan dua metode dengan nama yang mirip.
dataSource.setSslCert( cert );
Menguji koneksi
Terakhir, kita dapat menggunakan DataSource
yang dikonfigurasi objek untuk membuat koneksi ke database. Kode itu akan terlihat seperti ini:
// Test connection
try (
Connection conn = dataSource.getConnection() ;
// …
)
{
System.out.println( "DEBUG - Postgres connection made. " + Instant.now() );
// …
}
catch ( SQLException e )
{
e.printStackTrace();
}
Kode contoh lengkap
Menyatukan semua itu, lihat sesuatu seperti ini.
// Get CA certificate used in TLS connections.
Path path = Paths.get( "/Users/basilbourque/Downloads/ca-certificate.crt" );
String cert = null;
try
{
cert = Files.readString( path , StandardCharsets.UTF_8 );
System.out.println( "cert = " + cert );
}
catch ( IOException ex )
{
throw new IllegalStateException( "Unable to load the TLS certificate needed to make database connections." );
}
Objects.requireNonNull( cert );
if ( cert.isEmpty() ) {throw new IllegalStateException( "Failed to load TLS cert." ); }
// PGSimpleDataSource configuration
PGSimpleDataSource dataSource = new PGSimpleDataSource();
String[] serverAddresses = { "your-server-address-goes-here" };
dataSource.setServerNames( serverAddresses );
int[] serverPortNumbers = { your-port-number-goes-here };
dataSource.setPortNumbers( serverPortNumbers );
dataSource.setSslCert( cert );
dataSource.setDatabaseName( "defaultdb" );
dataSource.setUser( "doadmin" );
dataSource.setPassword( "your-password-goes-here" );
// Test connection
try (
Connection conn = dataSource.getConnection() ;
// …
)
{
System.out.println( "DEBUG - Postgres connection made. " + Instant.now() );
// …
}
catch ( SQLException e )
{
e.printStackTrace();
}
Sumber tepercaya
Saat membuat instans Postgres Anda di DigitalOcean.com, Anda akan ditawari kemampuan untuk membatasi permintaan koneksi yang masuk. Anda dapat menentukan satu alamat IP yang diharapkan oleh server Postgres, "sumber tepercaya" dalam istilah Digital Ocean. Setiap peretas yang mencoba menyambung ke server Postgres Anda akan diabaikan karena berasal dari alamat IP lain.
Tip:Klik di dalam bidang entri data untuk nomor alamat IP ini agar halaman web secara otomatis mendeteksi dan menawarkan alamat IP yang sedang digunakan oleh browser web Anda. Jika Anda menjalankan kode Java dari komputer yang sama, gunakan nomor IP yang sama sebagai satu-satunya sumber tepercaya Anda.
Jika tidak, ketik alamat IP komputer yang menjalankan kode Java JDBC Anda.
Masalah lainnya
Saya belum membahas elaborasi, seperti protokol keamanan yang tepat untuk digunakan untuk mengelola file sertifikat CA Anda, atau seperti mengeksternalkan info koneksi Anda dengan mendapatkan DataSource
objek dari JNDI
server daripada hard-coding
. Tapi semoga contoh di atas membantu Anda memulai.