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);このコードでは、プロパティに省略可能なものも必須のものもあることに留意してください。ポート番号やロール名などのプロパティは、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);
コメントの送付先: jdbc-odbc@sun.com