PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tạo đối tượng `DataSource` cho Postgres JDBC, theo chương trình

tl; dr

PGSimpleDataSource lớp đi kèm với trình điều khiển JDBC từ jdbc.postgresql.org triển khai DataSource giao diện. Định cấu hình chi tiết kết nối cơ sở dữ liệu của bạn trong PGSimpleDataSource và chuyển xung quanh dưới dạng DataSource đối tượng.

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

Sử dụng đối tượng đó để tạo kết nối với cơ sở dữ liệu khi cần thiết. Sử dụng cú pháp try-with-resources tiện lợi.

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

Triển khai trình điều khiển JDBC

Trình điều khiển JDBC của bạn có thể cung cấp cho bạn việc triển khai DataSource giao diện.

Một đối tượng của triển khai này chứa thông tin cần thiết để tạo và định cấu hình kết nối với cơ sở dữ liệu, chẳng hạn như:

  • Tên và mật khẩu của người dùng cơ sở dữ liệu
  • Địa chỉ IP và số cổng của máy chủ cơ sở dữ liệu

Có thể có tới ba loại triển khai được cung cấp:

  • Thường thì việc triển khai như vậy là một lớp bao bọc mỏng xung quanh DriverManager . Mỗi lần bạn gọi DataSource::getConnection trên đối tượng của việc triển khai như vậy, bạn sẽ có được một kết nối cơ sở dữ liệu mới.
  • Ngoài ra, một triển khai có thể đang sử dụng nhóm kết nối bên dưới để cung cấp các kết nối đã có. Những kết nối này được trao đi và kiểm tra lại, chẳng hạn như sách trong thư viện, sẽ được tái chế để sử dụng nhiều lần.
  • Việc triển khai có thể hỗ trợ API giao dịch Java, hỗ trợ X / Open XA, cho các nhu cầu phức tạp như điều phối các giao dịch trên nhiều tài nguyên như cơ sở dữ liệu và hàng đợi tin nhắn. Không được sử dụng phổ biến, vì vậy tôi bỏ qua loại này ở đây.

Trình điều khiển từ jdbc.postgresql.org

Trình điều khiển miễn phí mã nguồn mở từ jdbc.postgresql.org cung cấp cả ba loại DataSource thực hiện. Nhưng các tác giả không khuyến khích thực sự sử dụng loại nhóm kết nối của họ trong sản xuất; nếu bạn muốn gộp, hãy sử dụng thư viện gộp kết nối của bên thứ ba. Và chúng tôi đang bỏ qua loại XA.

Vì vậy, chúng ta hãy xem xét việc triển khai kết nối mới mỗi lần đơn giản của DataSource :org.postgresql.ds.PGSimpleDataSource

Định cấu hình đối tượng nguồn dữ liệu

Khởi tạo một đối tượng trống, sau đó gọi một loạt các phương thức setter để cấu hình cho kịch bản cơ sở dữ liệu cụ thể của bạn. Các phương thức setter được kế thừa từ org.postgresql.ds.common.BaseDataSource .

Chúng tôi chưa cập nhật giao diện DataSource , để chúng ta có thể gọi các phương thức setter khác nhau. Xem mã ví dụ và thảo luận trên trang Nguồn dữ liệu và 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?

Nói chung, tôi sẽ sử dụng các phương pháp setter riêng biệt này. Ngoài ra, bạn tạo một Chuỗi, một URL, với các phần thông tin khác nhau được đặt trên DataSource trong một lần đột quỵ. Nếu bạn muốn đi tuyến đường đó, hãy gọi setUrl .

Điều đó bao gồm những điều cơ bản. Nhưng bạn có thể muốn hoặc cần một số thiết lập khác. Hầu hết trong số này là thiết lập các giá trị thuộc tính Postgres trên máy chủ. Tất cả các thuộc tính đều có mặc định thông minh, nhưng bạn có thể muốn ghi đè cho các tình huống đặc biệt.

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.

Nếu sử dụng TLS (trước đây gọi là SSL) để mã hóa kết nối cơ sở dữ liệu nhằm bảo vệ khỏi bị nghe trộm hoặc thao túng ác ý, hãy sử dụng một số bộ thiết lập cho điều đó.

Đối với bất kỳ thuộc tính Postgres nào không có phương thức setter cụ thể, bạn có thể gọi setProperty( PGProperty property, String value ) .

Bạn có thể kiểm tra hoặc xác minh cài đặt trên nguồn dữ liệu này bằng cách gọi bất kỳ phương thức getter nào trong số nhiều phương thức.

Sau khi định cấu hình PGSimpleDataSource của bạn , bạn có thể chuyển đến phần còn lại của cơ sở mã của mình dưới dạng DataSource vật. Điều này cách ly cơ sở mã của bạn khỏi cú sốc khi chuyển sang một DataSource khác triển khai hoặc thay đổi sang trình điều khiển JDBC khác.

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

Sử dụng nguồn dữ liệu

Sử dụng DataSource hoàn toàn đơn giản vì nó chỉ cung cấp hai phương pháp, một cặp biến thể trên getConnection để có được một Connection đối tượng để cơ sở dữ liệu của bạn hoạt động.

Connection conn = dataSource.getConnection() ; 

Khi hoàn tất với Connection của bạn , cách tốt nhất là đảm bảo đóng nó. Sử dụng cú pháp try-with-resources để tự động đóng kết nối hoặc đóng nó một cách rõ ràng.

conn.close() ;

Hãy nhớ rõ rằng một DataSource không thực sự là một nguồn dữ liệu. Một DataSource thực sự là một nguồn để tạo / truy cập các kết nối đến cơ sở dữ liệu. Theo suy nghĩ của tôi, đây là một từ nhầm lẫn, khi tôi nghĩ về nó là ConnectionSource . DataSource chỉ nói chuyện với cơ sở dữ liệu của bạn đủ lâu để đăng nhập bằng tên người dùng và mật khẩu. Sau lần đăng nhập đó, bạn sử dụng Connection đối tượng tương tác với cơ sở dữ liệu.

Lưu trữ DataSource của bạn

Sau khi được định cấu hình, bạn muốn giữ lại DataSource đó đối tượng xung quanh, được lưu trong bộ nhớ cache. Không cần phải cấu hình lại nhiều lần. Việc triển khai phải được viết là an toàn theo luồng. Bạn có thể gọi getConnection mọi lúc, mọi nơi.

Đối với một ứng dụng Java nhỏ đơn giản, bạn có thể muốn lưu trữ nó dưới dạng một trường trên một singleton hoặc trong một biến toàn cục tĩnh.

Đối với ứng dụng dựa trên Servlet, chẳng hạn như Vaadin ứng dụng, bạn sẽ tạo một lớp triển khai ServletContextListener giao diện. Trong lớp đó, bạn sẽ thiết lập DataSource của mình đối tượng khi ứng dụng web của bạn đang khởi chạy. Từ đó, bạn sẽ lưu trữ đối tượng trong ServletContext đối tượng bằng cách chuyển tới setAttribute . Context là thuật ngữ kỹ thuật cho 'ứng dụng web'. Truy xuất bằng cách gọi getAttribute và truyền tới DataSource .

Trong trường hợp doanh nghiệp, DataSource có thể được lưu trữ trong một triển khai tuân thủ JNDI. Một số vùng chứa Servlet như Apache Tomcat có thể cung cấp triển khai JNDI. Một số tổ chức sử dụng máy chủ như máy chủ LDAP. Đăng ký và truy xuất DataSource của bạn đối tượng với JNDI được đề cập trong nhiều Câu hỏi &Trả lời khác trên 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. Một bảng gian lận hiệu suất cho PostgreSQL

  2. Sử dụng thời gian hiện tại theo giờ UTC làm giá trị mặc định trong PostgreSQL

  3. Các công cụ GUI hàng đầu cho PostgreSQL

  4. Tên múi giờ có các thuộc tính giống hệt nhau mang lại kết quả khác khi áp dụng cho dấu thời gian

  5. Làm cách nào để tôi có thể Chèn đối tượng JSON vào Postgres bằng Java readyStatement?