BEA ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Server > WebLogic jDriver for Microsoft SQL Server のコンフィグレーションと使い方(非推奨) > WebLogic jDriver for Microsoft SQL Server の使い方 |
WebLogic jDriver for Microsoft SQL Server のコンフィグレーションと使い方(非推奨)
|
WebLogic jDriver for Microsoft SQL Server の使い方
WebLogic jDriver for Microsoft SQL Server の設定方法と使い方について以下の節で説明します。
WebLogic jDriver for Microsoft SQL Server とは
WebLogic jDriver for Microsoft SQL Server は、Type 4 の pure-Java 2 層 JDBC ドライバで、接続プールに物理データベース接続を作成するのに使用します。通信フォーマット レベルで独自のベンダ プロトコルを使用してデータベースに接続するので、クライアント サイド ライブラリは必要ありません。
Type 4 ドライバはそれ以外の多くの点で Type 2 ドライバと似ています。Type 2 も Type 4 も 2 層ドライバです。つまり、クライアントがデータベースと接続するためには、それぞれにドライバをメモリにコピーする必要があります。JDBC ドライバのタイプの詳細については、「WebLogic JDBC の概要」を参照してください。
WebLogic Server 環境内では、WebLogic Server とデータベースの接続に Type 2 または Type 4 の 2 層ドライバを使用します。そして、WebLogic の多層ドライバ、RMI、JTS、または Pool のいずれかを使用します。クライアントと WebLogic Server との接続には、pure-Java Type 3 多層 JDBC ドライバを使用します。
このドライバが準拠している JDBC の API リファレンスは、JavaSoft からオンラインで入手できます。
WebLogic jDriver for Microsoft SQL Server を使用して WebLogic Server をデータベースに接続する方法について、以下の節で説明します。
Microsoft SQL Server データベースで英語以外の言語を使用する場合は、language プロパティを指定して使用する言語を反映させる必要があります。たとえば、フランス語を指定する場合は、接続時に次のプロパティを追加します。
props.put("language","francais")
このプロパティを設定しないと、「Primary Key Constraint Violation」などの例外が発生する場合があります。
2 層コンフィグレーションの WebLogic Server を使用したデータベースへの接続
WebLogic jDriver for Microsoft SQL Server を使用して WebLogic Server 経由でデータベースに接続するよう、次の手順に従ってアプリケーションを設定します。
手順 1 と 3 では、JDBC ドライバを記述します。手順 1 では、ドライバの完全パッケージ名を、ドット区切りで指定します。手順 3 では、URL (コロンで区切ります) を使ってドライバを識別します。URL には、weblogic:jdbc:mssqlserver4 という文字列を入れなければなりません。このほかに、サーバのホスト名やデータベース名などの情報を入れてもかまいません。
Properties props = new Properties();
props.put("user", "scott");
props.put("password", "secret");
props.put("db", B"myDB");
props.put("server", "myHost");
props.put("port", "8659");
Connection conn =
myDriver.connect("jdbc:weblogic:mssqlserver4", props);
次のサンプル コードは、Properties オブジェクトを使って myHost というサーバ上の myDB というデータベースに接続する方法を示します。
Properties props = new Properties();
props.put("user", "scott");
props.put("password", "secret");
props.put("db", "myDB");
props.put("server", "myHost");
props.put("port", "8659");
Driver myDriver = (Driver)
Class.forName("weblogic.jdbc.mssqlserver4.Driver").newInstance();
Connection conn =
myDriver.connect("jdbc:weblogic:mssqlserver4", props);
次のサンプルのように、db、server、および port プロパティを server プロパティにまとめることができます。
Properties props = new Properties();
props.put("user", "scott");
props.put("password", "secret");
props.put("server", "myDB@myHost:8659");
// props.put("appname", "MyApplication");
// props.put("hostname", "MyHostName");
最後の 2 つのプロパティ、appname および hostname は省略可能で、Microsoft SQL server へ渡され、program_name および hostname というカラム名で、sysprocesses テーブル内に読み込まれます。hostname の値は、WebLogic によって前に付加されます。
Driver myDriver = (java.sql.Driver)
Class.forName
("weblogic.jdbc.mssqlserver4.Driver").newInstance();
Connection conn =
myDriver.connect("jdbc:weblogic:mssqlserver4", props);
URL 内または Properties オブジェクト内に情報を提供する方法はさまざまです。ドライバの URL 内に渡される情報は、Properties オブジェクトに含まれている必要はありません。
接続 URL の終わりに接続オプションを追加することもできます。次のサンプルのように、接続オプションと URL を分けるために疑問符(?)を用い、オプションどうしを分けるためにアンパサンド(&)を用います。
String myUrl =
"jdbc:weblogic:mssqlserver4:db@myhost:myport?
user=sa&password=";
URL オプションの詳細については、実行時に Driver.getPropertyInfo() を使用して調べることができます。
多層コンフィグレーションの WebLogic Server を使用した接続
WebLogic Server の多層コンフィグレーションで、アプリケーションから SQL Server DBMS に接続するには、次の手順を実行します。
try {
Context ctx = new InitialContext();
javax.sql.DataSource ds
= (javax.sql.DataSource) ctx.lookup ("myDataSource");
} catch (NamingException ex) {
// ルックアップに失敗
}
try {
java.sql.Connection conn = ds.getConnection();
} catch (SQLException ex) {
// 接続の取得に失敗
}
詳細については、「DataSource のコンフィグレーションと使い方」を参照してください。
この節では、JDBC を使ったデータ操作の概要と、アプリケーションで以下の基本作業を実装するための手順について説明します。
詳細については、Microsoft SQL Server のマニュアルと JDBC に関する Java 指向のドキュメントを参照してください。
注意: WebLogic jDriver for Microsoft SQL Server では、テーブル名またはカラム名で疑問符(?)を処理できません。エラーを回避するために、データベースのテーブル名およびカラム名では疑問符を使用しないでください。
データベース アクセスにおける最も基本的な作業は、データを検索することです。WebLogic jDriver for Microsoft SQL Server では、次の 3 段階の手順に従ってデータを取り出せます。
Statement stmt = conn.createStatement();
stmt.execute("select * from emp");
ResultSet rs = stmt.getResultSet();
while (rs.next()) {
System.out.println(rs.getString("empid") + " - " +
rs.getString("name") + " - " +
rs.getString("dept"));
}
ResultSetMetaData md = rs.getMetaData();
System.out.println("Number of columns: " +
md.getColumnCount());
stmt.close();
この節では、データベースのテーブルへのレコードの挿入、更新、テーブルからの削除という、データベースに関する 3 つの一般的な作業の方法を示します。これらの処理には、JDBC PreparedStatement を使います。まず、PreparedStatement を作成してから、それを実行し、閉じます。
PreparedStatement (JDBC Statement のサブクラス) を使用すると、同じ SQL を値を変えて何度でも実行できます。
次のサンプル コードでは、PreparedStatement を作成します。? 構文を使用しています。
String inssql =
"insert into emp(empid, name, dept) values (?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(inssql);
pstmt.setString(1, "12345");
pstmt.setString(2, "gumby");
pstmt.setString(3, "Cartoons");
次に、PreparedStatement を使用してレコードを更新します。次のサンプルでは、カウンタ i の値を dept フィールドの現在の値に追加します。
String updsql =
"update emp set dept = dept + ? where empid = ?";
PreparedStatement pstmt2 = conn.prepareStatement(updsql);
pstmt2.setString(1, "Cartoons");
pstmt2.setString(2, "12345);
最後に、PreparedStatement を使用して、先ほど追加および更新されたレコードを削除します。
String delsql = "delete from emp where empid = ?";
PreparedStatement pstmt3 = conn.prepareStatement(delsql);
pstmt3.setString(1, "12345");
WebLogic jDriver for Microsoft SQL Server を使用して、ストアド プロシージャとストアド関数の作成、使用、および削除が行えます。
次のサンプル コードでは、一連の文を実行して、ストアド プロシージャとストアド関数をデータベースから削除します。
Statement stmt = conn.createStatement();
try {stmt.execute("drop procedure proc_squareInt");}
catch (SQLException e) {;}
try {stmt.execute("drop procedure func_squareInt");}
catch (SQLException e) {;}
try {stmt.execute("drop procedure proc_getresults");}
catch (SQLException e) {;}
stmt.close();
JDBC Statement を使用してストアド プロシージャまたはストアド関数を作成してから、JDBC の ? 構文で JDBC CallableStatement (Statement のサブクラス) を使用して、IN および OUT パラメータを設定します。
ストアド プロシージャの入力パラメータは、JDBC の IN パラメータにマップされており、setInt() などの CallableStatement.setXXX() メソッドと JDBC PreparedStatement ? 構文で使われます。ストアド プロシージャの出力パラメータは、JDBC の OUT パラメータにマップされており、CallableStatement.registerOutParameter() メソッドと JDBC PreparedStatement ? 構文で使われます。パラメータを IN と OUT の両方に設定することもできます。その場合、setXXX() と registerOutParameter() の呼び出しが両方とも同じパラメータ番号に対して行われる必要があります。
次のサンプルでは、JDBC Statement を使用して ストアド プロシージャを 1 つ作成してから、そのプロシージャを CallableStatement. を使用して実行しています。registerOutParameter() メソッドを使用して、2 乗された値を入れるための出力パラメータを設定しています。
Statement stmt1 = conn.createStatement();
stmt1.execute
("CREATE OR REPLACE PROCEDURE proc_squareInt " +
"(field1 IN OUT INTEGER, field2 OUT INTEGER) IS " +
"BEGIN field2 := field1 * field1; field1 := " +
"field1 * field1; END proc_squareInt;");
stmt1.close();
String sql = "{call proc_squareInt(?, ?)}";
CallableStatement cstmt1 = conn.prepareCall(sql);
// 出力パラメータを登録する
cstmt1.registerOutParameter(2, java.sql.Types.INTEGER);
次のサンプルでは、同様のコードを使用して、整数を 2 乗するストアド関数を作成して実行します。
Statement stmt2 = conn.createStatement();
stmt2.execute("CREATE OR REPLACE FUNCTION func_squareInt " +
"(field1 IN INTEGER) RETURN INTEGER IS " +
"BEGIN return field1 * field1; " +
"END func_squareInt;");
stmt2.close();
sql = "{ ? = call func_squareInt(?)}";
CallableStatement cstmt2 = conn.prepareCall(sql);
cstmt2.registerOutParameter(1, Types.INTEGER);
次のサンプルでは、sp_getmessages (このストアド プロシージャのコードはこのサンプルには含まれていません) というストアド プロシージャを使用します。sp_getmessages は、入力パラメータとしてメッセージ番号を取り、メッセージ テキストを出力パラメータ ResultSet に格納して返します。Statement.execute() および Statement.getResult() メソッドを使ってストアド プロシージャから返された ResultSets を処理してからでないと、OUT パラメータと戻りステータスは使用可能になりません。
String sql = "{ ? = call sp_getmessage(?, ?)}";
CallableStatement stmt = conn.prepareCall(sql);
stmt.registerOutParameter(1, java.sql.Types.INTEGER);
stmt.setInt(2, 18000); // メッセージ番号 18000
stmt.registerOutParameter(3, java.sql.Types.VARCHAR);
まず、CallableStatement に対する 3 つのパラメータを設定します。
次に、ストアド プロシージャを実行し、戻り値をチェックして、ResultSet が空かどうかを調べます。空でない場合は、ループを使用して、その内容を取り出して表示するという処理を繰り返します。
boolean hasResultSet = stmt.execute();
while (true)
{
ResultSet rs = stmt.getResultSet();
int updateCount = stmt.getUpdateCount();
if (rs == null && updateCount == -1) // 他に結果がない場合
break;
if (rs != null) {
// 空になるまで ResultSet オブジェクトを処理する
while (rs.next()) {
System.out.println
("Get first col by id:" + rs.getString(1));
}
} else {
// 更新件数がある
System.out.println("Update count = " +
stmt.getUpdateCount());
}
stmt.getMoreResults();
}
接続を閉じる前に、データベースに対する変更をコミットするために、commit() メソッドを呼び出すと便利な場合もあります。
自動コミットが true(デフォルトの JDBC トランザクション モード)に設定されている場合、各 SQL 文がそれぞれトランザクションになります。しかし、このサンプルでは、Connection を作成した後に、自動コミットを false に設定しました。このモードでは、Connection は関連する暗黙的なトランザクションを常に持っており、rollback() または commit() メソッドを呼び出すと、現在のトランザクションが終了し、新しいトランザクションが開始されます。close() の前に commit() を呼び出すと、Connection を閉じる前にすべてのトランザクションが必ず完了します。
Statement、PreparedStatement、および CallableStatement を使う作業が終了したときにこれらのオブジェクトを閉じるように、アプリケーションの最後のクリーンアップとして、Connection オブジェクトの close() メソッドを finally {} ブロック内で必ず呼び出すようにします。例外を捕捉して適切な処理を行います。このサンプルの最後の 2 行では、commit を呼び出してから接続を close します。
conn.commit();
conn.close();
Java アプリケーションとして、WebLogic jDriver for Microsoft SQL Server は文字列を Unicode 文字列として扱います。異なるコードセットを使って動作するデータベースと文字列をやりとりするために、このドライバは、データベースのコードセットを検出して、JDK がサポートしている文字セットを使って Unicode 文字列に変換します。ユーザのデータベースのコードセットと JDK が提供した文字セットが直接対応しない場合は、weblogic.codeset 接続プロパティを最も適切な Java 文字セットに設定することができます。たとえば、次のサンプル コードのように、cp932 コードセットを使用するには、Driver.connect() を呼び出す前に、Properties オブジェクトを作成し、weblogic.codeset プロパティを設定します。
java.util.Properties props = new java.util.Properties();
props.put("weblogic.codeset", "cp932");
props.put("user", "sa");
props.put("password", "");
String connectUrl = "jdbc:weblogic:mssqlserver4:myhost:1433";
Driver myDriver = (Driver)Class.forName
("weblogic.jdbc.mssqlserver4.Driver").newInstance();
Connection conn = myDriver.connect(connectUrl, props);
JDBC 仕様には、SQL 拡張が含まれています。これは SQL Escape 構文とも呼ばれます。WebLogic jDriver for Microsoft SQL Server は、拡張 SQL をサポートしています。拡張 SQL によって、DBMS 間で移植可能な共通の SQL 拡張機能にアクセスできます。
たとえば、日付から曜日を取り出す関数は、SQL 標準では定義されていません。Oracle の SQL では次のようになります。
select to_char(date_column, 'DAY') from table_with_dates
拡張 SQL を使うと、Oracle と SQL Server のどちらの DBMS に対しても、次のようにして曜日を取り出すことができます。
select {fn dayname(date_column)} from table_with_dates
次のサンプル コードは、拡張 SQL の機能のいくつかを示します。
String query =
"-- This SQL includes comments and " +
"JDBC extended SQL syntax.¥n" +
"select into date_table values( ¥n" +
" {fn now()}, -- current time ¥n" +
" {d '1997-05-24'}, -- a date ¥n" +
" {t '10:30:29' }, -- a time ¥n" +
" {ts '1997-05-24 10:30:29.123'}, -- a timestamp¥n" +
" '{string data with { or } will not be altered}'¥n" +
"-- Also note that you can safely include" +
" { and } in comments or¥n" +
"-- string data.";
Statement stmt = conn.createStatement();
stmt.executeUpdate(query);
拡張 SQL は、一般の SQL と区別するために中括弧({})で囲ってあります。コメントはダブルハイフンで始まり、改行コード(¥n)で終わっています。コメント、SQL、および拡張 SQL を含む拡張 SQL のシーケンス全体は、二重引用符で囲み、Statement オブジェクトの execute() メソッドに渡します。
次のサンプル コードは、拡張 SQL を CallableStatement の一部として使用する方法を示します。
CallableStatement cstmt =
conn.prepareCall("{ ? = call func_squareInt(?)}");
次のサンプルは、拡張 SQL 式をネストする方法を示します。
select {fn dayname({fn now()})}
サポートされている拡張 SQL 関数の一覧は、DatabaseMetaData オブジェクトから取り出すことができます。次のサンプルは、JDBC ドライバがサポートしているすべての関数をリストする方法を示します。
DatabaseMetaData md = conn.getMetaData();
System.out.println("Numeric functions: " +
md.getNumericFunctions());
System.out.println("¥nString functions: " +
md.getStringFunctions());
System.out.println("¥nTime/date functions: " +
md.getTimeDateFunctions());
System.out.println("¥nSystem functions: " +
md.getSystemFunctions());
conn.close();
拡張 SQL の記述については、JDBC 1.2 仕様の第 11 章を参照してください。
メタデータのクエリは、現在のデータベースに対してのみ行うことができます。metadata メソッドは、対応する SQL Server のストアド プロシージャを呼び出します。これらのプロシージャは、現在のデータベースでのみ動作します。たとえば、現在のデータベースが master の場合、その接続では master に関連するメタデータのみ利用することができます。
マルチスレッド アプリケーション間での Connection オブジェクトの共有
WebLogic jDriver for Microsoft SQL Server では、複数のスレッドが 1 つの Connection オプションを共有するアプリケーションを作成できます。各スレッドには、アクティブな Statement オブジェクトを持つことができます。ただし、あるスレッドで Statement.cancel() を呼び出すと、SQL Server は別のスレッドの Statement をキャンセルすることがあります。キャンセルされる実際の Statement は、SQL Server のタイミングの問題によって異なります。予期しないキャンセルを回避するために、各スレッドが別々の Connection オプションを持つようにすることをお勧めします。
Transact-SQL 機能を使うと、ストアド プロシージャがバッチの最初のコマンドである場合に、EXECUTE キーワードを省略できます。しかし、ストアド プロシージャにパラメータがある場合、WebLogic jDriver for Microsoft SQL Server は、プロシージャ の呼び出しの前に、(JDBC 実装に固有の)変数宣言を追加します。このため、ストアド プロシージャには EXECUTE キーワードを使用することをお勧めします。EXECUTE キーワードを含まない JDBC 拡張 SQL のストアド プロシージャ構文には、この問題は影響しません。
cursorName() メソッドはサポートされていません。
JDK の java.sql.TimeStamp クラスは、1970 以降の日付に制限されます。それ以前の日付では例外となります。ただし、getString() を使って日付を取り出す場合には、WebLogic jDriver for Microsoft SQL Server は独自の date クラスを使って、この制限を乗り越えます。
Connection.setAutoCommit() に true または false 引数を付けて呼び出すと、連鎖トランザクション モードを有効または無効にできます。autoCommit が false の場合、WebLogic jDriver for Microsoft SQL Server ドライバは、前回のトランザクションがコミットまたはロールバックされると、必ずトランザクションを開始します。トランザクションは、明示的にコミットまたはロールバックで終了させる必要があります。setAutoCommit() を呼び出したときにコミットされていないトランザクションがあった場合、ドライバはそのトランザクションをロールバックしてからモードを切り換えるので、このメソッドを呼び出す前に、変更があれば必ずコミットしてください。
Statement.executeWriteText( ) メソッドの非サポート
WebLogic Type 2 JDBC ドライバの拡張機能として、テキストまたは画像データを、テキスト ポインタを使用せずに、SQL INSERT または UPDATE 文の一部として、1 行に書き込めるようにしています。この拡張機能 Statement.exexecuteWriteText() は、DB-Library ネイティブ ライブラリを必要とします。WebLogic jDriver for Microsoft SQL Server は Type 4 JDBC ドライバなので、データベースとの通信に DB-Library ネイティブ ライブラリを使用せず、したがって Statement.exexecuteWriteText() 拡張機能はサポートされません。
ストリームを使ってテキスト データおよび画像データを読み書きするには、以下のメソッドを使用します。
この節では、BEA WebLogic jDriver for Microsoft SQL Server を使用する場合に参考となるドキュメントおよびサンプル コードを示します。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |