tl; dr
PGSimpleDataSource
jdbc.postgresql.orgのJDBCドライバーにバンドルされているクラスは、DataSource
を実装します。 インターフェース。 PGSimpleDataSource
でデータベース接続の詳細を構成します オブジェクト、およびDataSource
として渡します オブジェクト。
PGSimpleDataSource ds = new PGSimpleDataSource() ;
ds.setServerName( "localhost" );
ds.setDatabaseName( "your_db_name_here" );
ds.setUser( "scott" );
ds.setPassword( "tiger" );
そのオブジェクトを使用して、必要に応じてデータベースに接続します。便利なtry-with-resources構文を使用してください。
try
(
Connection conn = ds.getConnection() ;
)
{ … }
JDBCドライバーの実装
JDBCドライバーは、DataSource
の実装を提供する場合があります。 インターフェイス。
この実装のオブジェクトには、次のようなデータベースへの接続を確立および構成するために必要な情報が含まれています。
- データベースユーザーの名前とパスワード
- データベースサーバーのIPアドレスとポート番号
提供される最大3種類の実装が利用可能である可能性があります:
- 多くの場合、このような実装は
DriverManager
の薄いラッパーです。 。DataSource::getConnection
を呼び出すたびに このような実装のオブジェクトでは、新しいデータベース接続を取得します。 - あるいは、実装は、既存の接続を提供するために、下の接続プールを使用している場合があります。これらの接続は、図書館の本のように配布されてチェックインされ、繰り返し使用するためにリサイクルされます。
- 実装は、データベースやメッセージキューなどの複数のリソース間でトランザクションを調整するなどの高度なニーズに対応するために、X /OpenXAをサポートするJavaTransactionAPIをサポートする場合があります。あまり一般的に使用されていないので、ここではこのタイプを無視します。
jdbc.postgresql.orgのドライバー
jdbc.postgresql.orgのオープンソースの無料ドライバーは、3種類すべてのDataSource
を提供します。 実装。ただし、作成者は、実際に接続プールタイプを本番環境で使用することを推奨していません。プールが必要な場合は、サードパーティの接続プールライブラリを使用してください。そして、XAタイプを無視しています。
それでは、DataSource
の単純なfresh-connection-each-time実装を見てみましょう。 :org.postgresql.ds.PGSimpleDataSource
データソースオブジェクトの構成
空のオブジェクトをインスタンス化してから、一連のセッターメソッドを呼び出して、特定のデータベースシナリオ用に構成します。セッターメソッドはorg.postgresql.ds.common.BaseDataSource
から継承されます 。
インターフェースDataSource
にはまだアップキャストしていません 、さまざまなセッターメソッドを呼び出すことができるようにします。データソースと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?
通常、私はこれらの個別のセッターメソッドを使用します。または、DataSource
に設定するさまざまな情報を使用して、文字列、URLを作成します。 一気に。そのルートに行きたい場合は、setUrl
を呼び出してください 。
それは基本をカバーしています。しかし、他のセッターが必要な場合もあります。これらのほとんどは、サーバーにPostgresプロパティ値を設定しています。すべてのプロパティにはスマートなデフォルトがありますが、特別な状況ではオーバーライドすることをお勧めします。
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.
TLS(以前はSSLと呼ばれていました)を使用してデータベース接続を暗号化し、盗聴や悪意のある操作から保護する場合は、そのためにいくつかのセッターを使用します。
特定のsetterメソッドのないPostgresプロパティの場合は、setProperty( PGProperty property, String value )
を呼び出すことができます。 。
多くのゲッターメソッドのいずれかを呼び出すことで、このデータソースの設定を検査または確認できます。
PGSimpleDataSource
を構成した後 、コードベースの残りの部分に単にDataSource
として渡すことができます 物体。これにより、コードベースが別のDataSource
に変更するショックから保護されます。 実装または別のJDBCドライバーへの変更。
DataSource dataSource = ds ; // Upcasting from concrete class to interface.
return dataSource ;
データソースの使用
DataSource
の使用 getConnection
のバリエーションのペアである2つのメソッドのみを提供するため、非常にシンプルです。 Connection
を取得するには データベース作業用のオブジェクト。
Connection conn = dataSource.getConnection() ;
Connection
が終了したら 、ベストプラクティスは、必ず閉じることです。 try-with-resources構文を使用して接続を自動的に閉じるか、明示的に接続を閉じます。
conn.close() ;
DataSource
実際にはデータソースではありません。 DataSource
実際には、データベースへの接続を生成/アクセスするためのソースです。私の考えでは、これはConnectionSource
と考えるので、誤った呼び方です。 。 DataSource
ユーザー名とパスワードでサインインするのに十分な時間だけデータベースと通信します。サインイン後、Connection
を使用します データベースと対話するオブジェクト。
DataSource
の保存
構成したら、そのDataSource
を保持します 周りのオブジェクト、キャッシュされます。繰り返し再構成する必要はありません。実装はスレッドセーフになるように作成する必要があります。 getConnection
を呼び出すことができます いつでもどこからでも。
単純な小さなJavaアプリの場合、シングルトンまたは静的グローバル変数のフィールドとして保存することをお勧めします。
Vaadinなどのサーブレットベースのアプリの場合 アプリでは、ServletContextListener
を実装するクラスを作成します インターフェース。そのクラスでは、DataSource
を確立します Webアプリの起動時にオブジェクト。そこから、オブジェクトをServletContext
に保存します setAttribute
に渡すことでオブジェクト 。 Context
「ウェブアプリ」の専門用語です。 getAttribute
を呼び出して取得します DataSource
にキャストします 。
エンタープライズシナリオでは、DataSource
JNDI準拠の実装に格納できます。 Apache Tomcatなどの一部のサーブレットコンテナは、JNDI実装を提供する場合があります。一部の組織では、LDAPサーバーなどのサーバーを使用しています。 DataSource
の登録と取得 JNDIを使用するオブジェクトは、スタックオーバーフローに関する他の多くの質問と回答でカバーされています。