JDBCTM-ODBC ブリッジの拡張

ドキュメントの目次
JDBC

JDBC-ODBC ブリッジを使用すると、JavaTM プログラミング言語で作成されたアプリケーションで、JDBCTM API を、多数の既存 ODBC ドライバとともに使用できます。このブリッジ自体が、JDBC テクノロジに基づくドライバ (「JDBC ドライバ」) です。sun.jdbc.odbc.JdbcOdbcDriver クラス内に定義されています。このブリッジは、JDBC サブプロトコルの odbc を定義します。

JDBC-ODBC ブリッジの現状

JDBC-ODBC ブリッジは、暫定的なソリューションと考える必要があります。Sun Microsystems と DataDirect Technologies は、ブリッジをさらに信頼性の高い堅牢なものにする作業を続けていますが、ブリッジをサポート製品とは考えていません。Pure Java の JDBC ドライバが開発された時点で、JDBC-ODBC ブリッジは必要なくなります。

ブリッジを使う理由

ODBC を直接使う場合と比べて、JDBC-ODBC ブリッジには次のような利点があります。

ODBC を使う理由

理想的には、使用したいのは Pure Java です。Pure Java なら、ネイティブコードも、プラットフォームに依存する機能もありません。しかし、すぐにでも開発を始めなければならず、Java だけで作られた JDBC ドライバが DBMS から提供されるのを待てない場合もあります。JDBC-ODBC ブリッジのように一部だけネイティブなドライバを使えば、Pure Java のドライバが利用できるようになったときに簡単に対応できるプログラムを作ることができます。

JDBC-ODBC ブリッジの新機能

JDBC-ODBC ブリッジに追加された DataSource 実装

javax.sql.DataSource および javax.sql.ConnectionPoolDataSource の実装が利用可能になりました。どちらも sun.jdbc.odbc.ee パッケージ内に含まれています。次のコードは、DataSource のプロパティの設定方法を示したものです。最後の 2 行では、JNDI API を使って、DataSource オブジェクト ds を jdbc/OdbcDB1 にバインドしています。なお、DataSource オブジェクトのターゲットは、Oracle データベースに接続している ODBC DSN の「dsn1」であると仮定しています。
            // Establish the DataSource object instance
            sun.jdbc.odbc.ee.DataSource ds = new sun.jdbc.odbc.ee.DataSource();
            // Provide user credentials and database name
            ds.setUser("scott");
            ds.setPassword("tiger");
            ds.setDatabaseName("dsn1");
            ds.setCharSet("..."); // optional property
            ds.setLoginTimeout(100); // optional property
            // Establish initial context and bind to the datasource target
            InitialContext ic = new InitialContext();
            ic.bind("jdbc/OdbcDB1",ds);
上記のコードでは、省略可能なプロパティと必須のプロパティが混在しているので注意してください。JDBC-ODBC ブリッジの DataSource 実装には、ポート番号や役割名などのプロパティは実装されていません。というのも、それらのプロパティは ODBC パラダイムでは使用できないからです。

上記サンプルからの続きとして、次のコードでは、DataSource オブジェクトを取得するために JNDI 名 jdbc/OdbcDB1 を参照します。続いて、取得した DataSource オブジェクトを使って、追跡を有効にし、2 つの接続を作成しています。

            // Get the initial context of JNDI and lookup the datasource.
            InitialContext ic = new InitialContext();
            javax.sql.DataSource ds1 = (javax.sql.DataSource) ic.lookup("jdbc/OdbcDB1");
            // Set the optional printwriter where the trace log is to be directed.
            ds1.setLogWriter(new PrintWriter(new FileOutputStream("/tmp/datasource.log")));
            Connection con1 = ds1.getConnection();
            Connection con2 = ds1.getConnection("system","manager");
javax.sql.ConnectionPoolDataSource の実装は、基となる JDBC-ODBC 接続プールを使用します。ConnectionPoolDataSource オブジェクトを使って PooledConnection オブジェクトを作成し、さらに PooledConnection オブジェクトを使って Connection オブジェクトを作成します。ユーザの視点からは、この Connection オブジェクトはほかの接続とまったく同じに見えます。

次のコードでは、ConnectionPoolDataSource オブジェクト cpds を作成し、そのプロパティを設定しています。最後の 2 行では、JNDI API を使って cpds を jdbc/OdbcPool にバインドしています。この名前は、あとで cpds を取得する際に、メソッド InitialContext.lookup に指定します。

            // Establish ConnectionPoolDataSource instance
            sun.jdbc.odbc.ee.ConnectionPoolDataSource cpds =
                new sun.jdbc.odbc.ee.ConnectionPoolDataSource("jdbc/OdbcPool");
            // Provide user credentials and database name
            cpds.setUser("scott");
            cpds.setPassword("tiger");
            cpds.setDatabaseName("dsn1");
            cpds.setCharSet("...") // optional property
            cpds.setLoginTimeout(100); // optional property
            cpds.setMinPoolSize("10"); 
            cpds.setInitialPoolSize("15");
            cpds.setMaxPoolSize("20");
            cpds.setMaxIdleTime("300");
            cpds.setTimeoutFromPool("600");
            // Maintenance interval of the pool. A maintenance thread will remove
            // unwanted connections and cleanup the pool at the interval specified.
            // This cannot be zero.
            cpds.setMaintenanceInterval("900");
            InitialContext ic = new InitialContext();
            ic.bind("jdbc/OdbcPool",cpds);
すべての場合において、ConnectionPoolDataSource をプールされたデータソースとして機能させたい場合、プールを上記コードで示したように設定するのは、アプリケーション側の責任です。プールされたデータソースのデフォルト動作では、最小プールサイズ、初期プールサイズ、および最大プールサイズはゼロに設定されます。ConnectionPoolDataSource の JDBC-ODBC ブリッジ実装には、Statement オブジェクトのプール機能やプロパティ propertyCycle は現時点では含まれていません。

次のコードは、ConnectionPoolDataSource オブジェクトを単なる DataSource オブジェクトとして使用する方法を示したものです。具体的には、jdbc/OdbcPool の JNDI ルックアップを行い、返されたオブジェクトを、ConnectionPoolDataSource オブジェクトにキャストする代わりに DataSource オブジェクトにキャストしています。

            InitialContext ic = new InitialContext();
            javax.sql.DataSource ds1 = (javax.sql.DataSource) ic.lookup("jdbc/OdbcPool");
            // First getConnection will initializes the pool.
            Connection con1 = ds1.getConnection();
            Connection con2 = ds1.getConnection("system","manager");
            -------------
            -------------
            // An application need to close the connection explicitly. This will allow the pool to recycle the connection.
            con1.close();
            con2.close();
実装を ConnectionPoolDataSource オブジェクトとして使用する方法を示したのが、次のコード行です。PooledConnection オブジェクトを閉じると実際の物理的な接続が閉じられるのに対し、PooledConnection オブジェクトによって作成された接続を閉じても、その接続は接続プールに戻されるだけである点に注意してください。
            InitialContext ic = new InitialContext();
            javax.sql.ConnectionPoolDataSource cpds =
                (javax.sql.ConnectionPoolDataSource) ic.lookup("jdbc/OdbcPool");
            PooledConnection pc1 = cpds.getPooledConnection();
            Connection con1 = pc1.getConnection();
            PooledConnection pc2 = cpds.getPooledConnection("system","manager");
            Connection con2 = pc2.getConnection();
            -------------
            -------------
            // An application needs to close the connection explicitly. This will allow the pool to recycle the connection.
            con1.close();
            con2.close();
            Connection con3 = pc1.getConnection();
            Connection con4 = pc2.getConnection();
            -------------
            -------------
            // This will close the physical connection!
            pc1.close();
            pc2.close();
接続プールをシャットダウンする方法は、2 つあります。メソッド shutDown に引数 false を指定した場合、未使用の接続だけが閉じられます。引数に true を指定した場合、使用中かどうかに関係なく、すべての接続がすぐに閉じられます。
            // Hot shutdown
            ((sun.jdbc.odbc.ee.ConnectionPoolDataSource) cpds).shutDown(true);
            または
            // Cold shutdown
            ((sun.jdbc.odbc.ee.ConnectionPoolDataSource) cpds).shutDown(false);



Copyright © 2002 Sun Microsystems, Inc.All Rights Reserved.

コメントの送付先: jdbc-odbc@sun.com