sql >> データベース >  >> RDS >> PostgreSQL

プログラムでPostgresJDBCの`DataSource`オブジェクトを生成します

    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を使用するオブジェクトは、スタックオーバーフローに関する他の多くの質問と回答でカバーされています。




    1. MySQLリモートアクセス用のSSHトンネルを作成する

    2. postgreSQLでアクセントを削除する関数

    3. SQLServerの再帰的自己結合

    4. T-SQLのバグ、落とし穴、およびベストプラクティス–決定論