WebLogic jDriver for SQL Server ガイド (非推奨)
![]() |
![]() |
![]() |
![]() |
注意 : WebLogic jDriver for Microsoft SQL Server は非推奨になりました。BEA では、BEA WebLogic Type 4 JDBC MS SQL Server ドライバの使用をお勧めします。詳細については、『WebLogic Type 4 JDBC ドライバ ガイド』を参照してください。
この章では、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 などの例外が発生する場合があります。
WebLogic jDriver for Microsoft SQL Server を使用して WebLogic Server 経由でデータベース接続を取得するよう、次の手順に従ってアプリケーションを設定します。
手順 1 と 3 では、JDBC ドライバを記述します。手順 1 では、ドライバの完全パッケージ名を、ドット区切りで指定します。手順 3 では、URL (コロンで区切ります) を使ってドライバを識別します。URL には、weblogic:jdbc:mssqlserver4
という文字列が入っていなければなりません。このほかに、サーバのホスト名やデータベース名などの情報を入れてもかまいません。
Driver myDriver = (java.sql.Driver)Class.forName
("weblogic.jdbc.mssqlserver4.Driver").newInstance();
java.util.Properties
オブジェクトを作成します。このオブジェクトは、ユーザ名、パスワード、データベース名、サーバ名、およびポート番号などの情報が入った名前と値の組み合わせを格納します。次に例を示します。
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.connect()
メソッドを呼び出すことで、JDBC の操作で不可欠となる JDBC 接続オブジェクトを作成します。このメソッドは、パラメータとしてドライバの URL と手順 2 で作成した java.util.Properties
オブジェクトを取ります。次に例を示します。
Connection conn =
myDriver.connect("jdbc:weblogic:mssqlserver4", props);
次のサンプル コードは、myHost
という名前のサーバ上に myDB
というデータベースに接続するには Properties オブジェクトをどのように使用するかを示します。
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 に渡され、sysprocesses
テーブルで program_name
と hostname
というカラム名で表示されます。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 の多層コンフィグレーションで、アプリケーションから 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 =
pstmt.setString(1, "12345");
"insert into emp(empid, name, dept) values (?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(inssql);
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 = ?";
pstmt3.setString(1, "12345");
PreparedStatement pstmt3 = conn.prepareStatement(delsql);
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);
// Register out parameters
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()
メソッドを使ってストアド プロシージャから返された ResultSet をすべて処理してからでないと、OUT
パラメータと戻りステータスは使用可能になりません。
String sql = "{ ?= call sp_getmessage(?, ?)}";
CallableStatement stmt = conn.prepareCall(sql);
stmt.registerOutParameter(1, java.sql.Types.INTEGER);
stmt.setInt(2, 18000); // msgno 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) // no more results
break;
if (rs != null) {
// Process the ResultSet until it is empty
while (rs.next()) {
System.out.println
("Get first col by id:" + rs.getString(1));
}
} else {
// we have an update count
System.out.println("Update count = " +
stmt.getUpdateCount());
}
stmt.getMoreResults();
}
接続を閉じる前に、commit()
メソッドを呼び出してデータ ベースに対して行った変更をコミットできます。
自動コミットが true (デフォルトの JDBC トランザクション モード) に設定されている場合、各 SQL 文がそれぞれトランザクションになります。しかし、このサンプルでは、Connection を作成した後に、自動コミットを false に設定しました。このモードでは、常に接続に関連付けられた暗黙のトランザクションを有しており、 rollback()
や commit()
メソッドを呼び出すと、現在のトランザクションを完了し、新しいトランザクションを開始します。close()
の前に commit()
を呼び出すと、Connection を閉じる前にすべてのトランザクションが必ず完了します。
作業が終了して Statement、PreparedStatement、および CallableStatement を閉じる前に、アプリケーションの最後のクリーンアップとして、接続の close()
メソッドを finally {}
ブロック内で必ず呼び出します。例外を捕捉して適切な処理を行います。このサンプルの最後の 2 行には、commit
および接続の close
の呼び出しが含まれています。
conn.commit();
conn.close();
Java アプリケーションとして、WebLogic jDriver for Microsoft SQL Server は文字列を Unicode 文字列として扱います。異なるコードセットを使って動作するデータベースと文字列をやりとりするために、このドライバは、データベースのコードセットを検出して、JDK がサポートしている文字セットを使って Unicode 文字列に変換します。データベースのコードセットと JDK に付属する文字セットの間に直接のマッピングがない場合は、最も適切な Java 文字セットに weblogic.codeset
接続プロパティを設定することができます。たとえば、次のサンプル コードのように、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 拡張は 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 と区別するために中括弧 ({}
) で囲ってあります。コメントは 2 つのハイフンで始まり、改行コード (\n
) で終わっています。コメント、SQL、および拡張 SQL を含む拡張 SQL のシーケンス全体は、二重引用符で囲み、Statement オブジェクトの execute()
メソッドに渡します。
CallableStatement の一部に拡張 SQL を使った例を次に示します。
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 に関連するメタデータのみ利用することができます。
WebLogic jDriver for Microsoft SQL Server では、複数のスレッドが 1 つの Connection オプションを共有するアプリケーションを作成できます。各スレッドには、アクティブな Statement オブジェクトを持つことができます。ただし、1 つのスレッドに Statement.cancel()
を呼び出すと、SQL サーバが別のスレッドの文をキャンセルする可能性があります。キャンセルされる実際の 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 は、この制限に左右されない独自の日付クラスを使用します。
チェーン化されたトランザクション モードを有効化または無効化するには、true または false 引数の Connection.setAutoCommit()
を呼び出します。autoCommit
が false
の場合、WebLogic jDriver for Microsoft SQL Server ドライバは、以前のトランザクションがコミットまたはロールバックされるたびに、トランザクションを開始します。トランザクションは、明示的にコミットまたはロールバックで終了させる必要があります。setAutoCommit()
の呼び出し時にコミットしていないトランザクションがある場合は、ドライバはモードを変更する前にトランザクションをロールバックするので、このメソッドを呼び出す前に変更をコミットする必要があります。
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()
拡張をサポートできません。
ストリームを使ってテキスト データおよび画像データを読み書きするには、以下のメソッドを使用します。
prepareStatement.setAsciiStream()
prepareStatement.setBinaryStream()
ResultSet.getAsciiStream()
ResultSet.getBinaryStream()
この節では、BEA WebLogic jDriver for Microsoft SQL Server を使用する場合に参考となるドキュメントおよびサンプル コードを示します。
![]() |
![]() |
![]() |