JDBCTM-ODBC ブリッジの拡張 |
ドキュメントの目次 JDBC |
JDBC-ODBC ブリッジを使用すると、JavaTM プログラミング言語で作成されたアプリケーションで、JDBCTM API を、多数の既存 ODBC ドライバとともに使用できます。このブリッジ自体が、JDBC テクノロジに基づくドライバ (「JDBC ドライバ」) です。sun.jdbc.odbc.JdbcOdbcDriver クラス内に定義されています。このブリッジは、JDBC サブプロトコルの odbc を定義します。
// Load the JDBC-ODBC bridge driver Class.forName(sun.jdbc.odbc.JdbcOdbcDriver) ; // setup the properties java.util.Properties prop = new java.util.Properties(); prop.put("charSet", "Big5"); prop.put("user", username); prop.put("password", password); // Connect to the database con = DriverManager.getConnection(url, prop);
// 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);
コメントの送付先: jdbc-odbc@sun.com