JDBCチュートリアル は、DataSource
クラスを使用するのではなく、 DriverManager
オブジェクトを使用してデータベース接続を取得することをお勧めします。 データソースオブジェクトとの接続 ページを引用するには:
DataSource
オブジェクト…データソースへの接続を取得するための推奨される手段。
[〜#〜] jdbc [〜#〜] Postgresへの接続用にそのようなオブジェクトを取得するにはどうすればよいですか? JDBCドライバーを配置しています。
今のところ、 this や this のようにJNDIをいじりたくありません。
Javaアプリ内でプログラムでDataSource
をインスタンス化できますか?それとも、そのDataSource
インターフェースを自分で実装する必要がありますか?
JDBCドライバー は、 DataSource
インターフェースの実装を提供する場合があります。
この実装のオブジェクトには、データベースへの接続を確立および構成するために必要な情報が含まれています。
提供される最大3種類の実装が利用可能です。
DriverManager
の薄いラッパーです。このような実装のオブジェクトで _DataSource::getConnection
_ を呼び出すたびに、新しいデータベース接続が取得されます。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
に設定するさまざまな情報を1回のストロークで使用して文字列(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 )
を呼び出すことができます。
多くのgetterメソッドのいずれかを呼び出すことにより、このデータソースの設定を検査または検証できます。
PGSimpleDataSource
を構成した後、コードベースの残りの部分に単純に DataSource
オブジェクトとして渡すことができます。これにより、コードベースが別のDataSource
実装に変更したり、 別のJDBCドライバー に変更したりするショックから保護されます。
_DataSource dataSource = ds ; // Upcasting from concrete class to interface.
return dataSource ;
_
DataSource
の使用は、2つのメソッド、つまり getConnection
のバリエーションのペアを提供して Connection
を取得するため、非常に簡単です。 データベース作業のオブジェクト。
_Connection conn = dataSource.getConnection() ;
_
Connection
を終了したら、必ず閉じることをお勧めします。 try-with-resources構文 を使用して接続を自動的に閉じるか、明示的に接続を閉じます。
_conn.close() ;
_
DataSource
は実際にはデータソースではないことを覚えておいてください。 DataSource
は、実際にはデータベースへの接続を生成/アクセスするためのソースです。私の考えでは、これはConnectionSource
と考えるので、誤った呼び方です。 DataSource
は、ユーザー名とパスワードを使用してサインインするのに十分な時間だけデータベースと通信します。サインイン後、Connection
オブジェクトを使用してデータベースを操作します。
DataSource
の保存構成したら、そのDataSource
オブジェクトをキャッシュに残しておきます。繰り返し再構成する必要はありません。 実装はスレッドセーフになるように作成する必要があります 。いつでもどこからでもgetConnection
に電話できます。
単純な小さなJavaアプリの場合、シングルトンまたは静的グローバル変数のフィールドとして保存することをお勧めします。
Vaadin アプリなどの サーブレット ベースのアプリの場合、実装するクラスを作成しますServletContextListener
インターフェース。そのクラスでは、Webアプリの起動時にDataSource
オブジェクトを確立します。そこから、 ServletContext
に渡すことにより、オブジェクトを setAttribute
オブジェクトに格納します。 Context
は、「Webアプリ」の専門用語です。 getAttribute
を呼び出し、DataSource
にキャストして取得します。
エンタープライズシナリオでは、DataSource
は [〜#〜] jndi [〜#〜] 準拠の実装に格納される場合があります。 Apache Tomcat などの一部の サーブレットコンテナ は、JNDI実装を提供する場合があります。一部の組織では、 LDAPサーバー などのサーバーを使用しています。 DataSource
オブジェクトをJNDIに登録および取得する方法については、StackOverflowに関する他の多くの質問と回答で説明しています。