Java ロゴ

JDBCTM-ODBC ブリッジの拡張

ドキュメントの目次
JDBC

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

JDBC-ODBC ブリッジの現状

JDBC-ODBC ブリッジは、暫定的なソリューションと考える必要があります。米国 Sun Microsystems, Inc. と 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);
このコードでは、プロパティに省略可能なものも必須のものもあることに留意してください。ポート番号やロール名などのプロパティは、ODBC パラダイムに適さないため、JDBC-ODBC ブリッジ DataSource に実装されていません。

前の例に続いて、次のコードでは、JNDI 名 "jdbc/OdbcDB1" を検索して DataSource オブジェクトを取得する例を示します。取得される 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" にバインドします。後でこのバインドをメソッド InitialContext.lookup に渡すと、cpds を取得できます。

            // 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);
            or
            // Cold shutdown
            ((sun.jdbc.odbc.ee.ConnectionPoolDataSource) cpds).shutDown(false);



Java ロゴ Copyright ©  2002 Sun Microsystems, Inc.All Rights Reserved.

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