Javaでのアプリケーション開発時に発生したトラブルの事例、およびその対処方法について説明します。
JDBCアプリケーション実行時に発生したトラブルの事例、およびその対処方法について説明します。
JDBCアプリケーションコンパイル時にメッセージ“シンボルを見つけられません”が出力された
シンボルを見つけられません。 シンボル: メソッド isPoolable() 場所 : java.sql.PreparedStatementのインタフェース
使用しているコンパイラがサポートしていないクラスまたはメソッドを利用している可能性があります。
使用しているコンパイラのバージョンが正しいか確認してください。
JDBCアプリケーション実行中にメッセージ java.lang.ClassNotFoundExceptionが出力された
java.lang.ClassNotFoundException: com.fujitsu.symfoware.jdbc.SYMDriver
環境変数“CLASSPATH”の設定が正しいか確認してください。
参照
環境変数の設定については、“アプリケーション開発ガイド(JDBCドライバ編)”の“Javaアプリケーションの環境設定”を参照してください。
JDBCアプリケーション実行中にメッセージ java.lang.OutOfMemoryErrorが出力された
java.lang.OutOfMemoryError
Javaでは、不要になったメモリの解放はガーベジコレクションで行われます。しかし、ガーベジコレクションは、使われなくなったオブジェクトが使用しているメモリを解放するだけです。アプリケーションが必要なメモリの解放としては、十分ではありません。 そのため、アプリケーションがメモリ不足になる場合があります。
メモリ不足が発生した場合は、以下の対処を行ってください。
Java実行環境のヒープサイズを拡張する。
System.gcメソッドを使い、強制的にメモリの解放を行う。
ただし、System.gcメソッドは実行性能に影響します。
呼び出しのタイミングなどを十分に検討した上で使用してください。
以下に、Java実行環境のヒープサイズを拡張する場合の例を示します。
初期サイズを64MByte、最大サイズを128MByteに設定します。
java -Xms64m -Xmx128m <class Name>
ローカルアクセスまたはリモートアクセス(RDB2_TCP連携)時に発生したトラブルの事例、およびその対処方法について説明します。
LDWrapperクラスがローカルデータベースアクセスをロードしていない(Solaris/Linuxの場合)
ローカルアクセスまたはリモートアクセス(RDB2_TCP連携)時に、以下のエラーが発生することがあります。
LDWrapperクラスがローカルデータベースアクセスをロードしていません
または
LDWrapper class has not been loaded for local database access
SQLState = <S1000> Code = <7002>
以下の項目について、確認してください。
以下の設定内容に誤りがある可能性があります。
環境変数“LD_LIBRARY_PATH”
参照
“アプリケーション開発ガイド(JDBCドライバ編)”の“Javaアプリケーションの環境設定”または“Interstage Application Serverを使用する場合の環境設定”を参照して、設定内容を見直してください。
JDBCデータソースを使用して、データベースに接続している場合、データソースの定義方法に誤りがある可能性があります。
以下のファイルについて、ファイル名を変更してバックアップし、再度データソースを設定してください。
./JDBCドライバインストール先ディレクトリ/fjjdbc/etc/namespace.ser
JDBCドライバが正しくインストールされているかを確認してください。
LDWrapperクラスがローカルデータベースアクセスをロードしていない(Windowsの場合)
ローカルアクセスまたはリモートアクセス(RDB2_TCP連携)時に、以下のエラーが発生することがあります。
LDWrapperクラスがローカルデータベースアクセスをロードしていません
または
LDWrapper class has not been loaded for local database access
SQLState = <S1000> Code = <7002>
以下の項目について、確認してください。
以下の設定内容に誤りがある可能性があります。
環境変数“PATH”
参照
“アプリケーション開発ガイド(JDBCドライバ編)”の“Javaアプリケーションの環境設定”または“Interstage Application Serverを使用する場合の環境設定”を参照して、設定内容を見直してください。
JDBCデータソースを使用して、データベースに接続している場合、データソースの定義方法に誤りがある可能性があります。
以下のファイルについて、ファイル名を変更してバックアップし、再度データソースを設定してください。
Symfoware Serverクライアント機能インストール先ディレクトリ\JDBC\fjjdbc\etc
JDBCドライバが正しくインストールされているかを確認してください。
データベースに接続すると、JavaVMのエラーが発生しアプリケーションが異常終了する
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x6d3ad362 Function name=JVM_ReleaseUTF Library=f:\apw\JBK3\jdk\jre\bin\hotspot\jvm.dll
JDBCドライバのモジュールが、複数混在している可能性があります。
以下の設定内容を見直してください。
Solaris/Linuxの場合
Windowsの場合
参照
“アプリケーション開発ガイド(JDBCドライバ編)”の“Javaアプリケーションの環境設定”または“Interstage Application Serverを使用する場合の環境設定”を参照して、設定内容を見直してください。
java.lang.NoSuchFieldError java.lang.StackOverflowError
JavaVMのスタック領域が不足している可能性があります。
javaコマンドのXssオプションを使用して、スタック領域を拡張して、再度確認してください。
CREATE TABLE文を実行すると、メッセージ JYP4204E が出力される
[SymfoWARE ODBC Driver][SymfoWARE Server] JYP4204E 指定されたデータベーススペース“*****”が,定義されていません.
Symfoware/RDBの仕様です。以下のどちらかの対処をしてください。
CREATE TABLE文の末尾に“ON データベーススペース名”の指定を追加
データベース名とデータベーススペース名を同じ名前で定義
データベースアクセス時に発生したトラブルの事例、およびその対処方法について説明します。
コネクションの失敗: I/Oエラーが発生しました
または
Connection failure: IOException
SQLState = <S1000> Code = <4001>
URLに指定するサーバのホスト名、ポート番号およびデータ資源名が正しいか確認してください。
JDBCデータソースを使用している場合は、情報設定画面での設定内容が正しいか確認してください。
設定内容が正しい場合には、以下の状態を確認してください。
データベースが起動されているか
RDA-SVが起動されているか(リモートアクセス(RDA-SV連携)の場合)
同時に使用できるコネクション数の最大値を超えました
または
Maximum driver connections are active
SQLState = <S1000> Code = <1024>
JDBCドライバが同時に使用できるコネクション数の最大値を超えました。
コネクションをクローズしてください。
また、JDBCデータソースを使用している場合は、オプション情報設定画面で最大コネクション数の値を増やしてください。
参照
JDBCデータソースのオプション情報設定についての詳細は、“アプリケーション開発ガイド(JDBCドライバ編)”の“データソースのオプション情報設定画面”を参照してください。
注意
オプション情報設定画面で最大コネクション数の値を増やした場合は、動作環境ファイルのMAX_CONNECT_TCPまたはMAX_CONNECT_SYSの値も変更してください。
JDBCアプリケーションを長時間操作せず、再度データベースにアクセスしたらエラーが発生した
Connection infringement - The SQL client cannot establish SQL connection
SQLState=<8001> Code=<0>
以下の項目について、確認してください。
JDBCドライバでタイムアウトが発生した可能性があります。
JDBCの接続情報に、options引数のtcptimerオプションを指定して、 アプリケーションを再度実行してください。
tcptimerオプションに0を指定した場合は、待ち時間の監視を行いません。
例
以下に、時間監視なしの場合の例を示します。
jdbc:symforda://<host>:<port>/<db_env>;tcptimer=0
JDBCデータソースを使用している場合は、オプション情報設定画面でサーバ待ち時間の値を変更してください。サーバ待ち時間に0を指定した場合は、待ち時間の監視を行いません。
RDA-SVの入力待ち時間監視機能により、コネクションが切断された可能性があります。
RDA-SVの入力待ち時間監視の値を見直し、適当な値を設定してください。
Symfoware Server、またはRDA-SVが正しく動作しているかを再度確認してください。
メッセージ Connection infringement - Connection fails が出力された
Connection infringement - Connection fails
SQLState = <08006>
URLに指定するサーバのホスト名、ポート番号およびデータ資源名が正しいか確認してください。
JDBCデータソースを使用している場合は、情報設定画面での設定内容が正しいか確認してください。
設定内容が正しい場合には、以下の状態を確認してください。
Symfoware/RDBが起動されているかどうか
環境変数の設定内容が正しいかどうか
参照
設定方法については、“アプリケーション開発ガイド(JDBCドライバ編)”の“Javaアプリケーションの環境設定”または“Interstage Application Serverを使用する場合の環境設定”を参照してください。
また、リモートアクセス(RDA-SV連携)の場合には、以下を確認してください。
RDA-SVが起動されているかどうか
データベースサーバがSolarisの場合には、RDA-SV起動時、環境変数LD_LIBRARY_PATHに/opt/FSUNrdb2b/libを指定しているかどうか
JYP1059E 不当なプロトコルが転送されました.
指定されたポート番号に誤りがある可能性があります。ポート番号に誤りがないか確認してください。
注意
RDB2_TCP連携とRDA-SV連携とで、指定するポート番号は異なります。
RDB2_TCP連携時は、RDB2_TCP通信で使用するポート番号を指定してください。
データベース接続時に発生したトラブルの事例、およびその対処方法について説明します。
メッセージ java.sql.SQLException: No suitable driver が出力された
java.sql.SQLException: No suitable driver
以下の設定内容に誤りがないか確認してください。
DriverManager.getConnectionメソッドの引数に指定するURLの記述形式
URLの記述形式については、“8.2.5 Javaで開発する(利用形態)”の“Symfoware ServerのJDBCドライバのタイプには何があるか?”を参照してください。
Class.forNameメソッドの引数に指定するJDBCドライバ名
JDBCドライバ名については、“8.2.6 Javaで開発する(開発)”の“ロードするSymfoware ServerのJDBCドライバのクラス名は?”を参照してください。
メッセージ java.lang.ClassCastException: java.lang.NoClassDefFoundError が出力された
java.lang.ClassCastException: java.lang.NoClassDefFoundError
以下の設定内容に誤りがないか確認してください。
Solaris/Linuxの場合
環境変数“LD_LIBRARY_PATH”
Windowsの場合
環境変数“PATH”
参照
設定方法については、“アプリケーション開発ガイド(JDBCドライバ編)”の“Javaアプリケーションの環境設定”を参照してください。
サーブレットから使用している場合は、“アプリケーション開発ガイド(JDBCドライバ編)”の“Interstage Application Serverを使用する場合の環境設定”を参照してください。
メッセージ javax.naming.CommunicationException:SYMNameServer isn't being started. が出力された
javax.naming.CommunicationException:SYMNameServer isn't being started.
ネーミングサービスが停止した状態でネーミングサービスを使用すると、上記のエラーメッセージが出力されます。アプリケーション実行時に上記のエラーメッセージが出力された場合、ネーミングサービスの状態を確認してください。
ネーミングサービスが起動しているか
ネーミングサービスのポート番号が正しいか
起動中のJDBCネーミングサービスが使用しているポート番号を、以下の手順で確認してください。
各コマンドは、システム管理者権限(root権限)を持つユーザが実行してください。
以下のコマンドを実行し、ネーミングサービスのプロセスIDを取得します。
ps -ef | grep fujitsu.symfoware.
以下のコマンドを実行し、ネーミングサービスの状態を表示します。
netstat -a -p | grep (ネーミングサービスのプロセスID)
表示される“Local Address”の数字がポート番号ですので確認してください。
コネクションの異常が発生した場合のトラブルの事例、およびその対処方法について説明します。
最大コネクション数を超える接続要求を行ったら、エラーが発生した
最大コネクション数を超える接続要求を行った時点で、コネクションの空きを待つのではなく、以下のエラーメッセージが返却されます。
同時に使用できるコネクション数の最大値を超えました
JDBCドライバでは、以下の2つの設定を行います。
最大コネクション数
システムのピーク時に予想される最大接続数
最大プールコネクション数
システム上、常にスタンバイしておく接続数
ある業務システムでは、平常時の運用で、30本前後のコネクション要求が発生しています。
夕方のピーク時になると、最大で45本のコネクション要求が発生すると想定されています。
このシステムでは、システム上予想される最大のコネクション数は45であるため、最大コネクション数には45を設定します。
平常時の運用では、30本前後のコネクション要求で運用されているため、最大プール数には、30を設定します。
最大プール数に30を設定することで、コネクション処理にかかる時間を短縮できるため、平常時の運用に効果的です。
31本目のコネクション要求が発生すると、プールされたコネクションの空きを待つ訳ではなく、31本目のコネクション処理を行います。
しかし、平常時の運用では31本目以上のコネクション要求は発生しないため、31本以上のコネクション資源を常にプールさせておくと、APサーバ上に不要な資源が確保されている状態になります。
そのため、JDBCドライバは、最大プールコネクション数を超えたコネクションについては、アプリケーションでクローズ要求が発生すると、プールには戻さず、コネクションを解放します。
ポイント
JDBCドライバの設定と、Symfoware/RDBの設定との優先順序について
Symfoware/RDBにも、最大コネクション数を管理する機能があります。
JDBCドライバとSymfoware/RDBの両方で最大コネクション数を設定した場合、Symfoware/RDBの設定が優先されます。
最大コネクション数の設定をする場合、Symfoware/RDBの設定に注意してください。
Interstage Application ServerのEJBサービスを使用時に、データベース上でコネクションを確認すると、コネクションが残存している
EJBサービスで、自動的にコネクションがプールされている可能性があります。
参照
EJBサービスでのコネクションプーリングの詳細は、“Interstage Application Server J2EE ユーザーズガイド”を参照してください。
JDBCドライバのネーミングサービスを起動している端末とは別の端末で、JDBCデータソース登録ツールを起動すると、メッセージが出力される
javax.naming.CommunicationException: I/O Error ocuurs when receiving the command
ネーミングサービスを起動したJDBCドライバと、データソース登録ツールを起動したJDBCドライバのバージョンレベルが異なる可能性があります。
JDBCドライバを最新のバージョンレベルに統一してください。
データソース登録ツールを起動すると日本語が化けて表示される(Linuxの場合)
RHEL-AS4(IPF)またはRHEL5(IPF)上でJDBCデータソース登録ツールを起動すると、日本語文字が化けて表示される場合があります。
出力される警告
Warning: Cannot convert string "-b&h-lucida-medium-r-normal-sans-*-140-*-*-p-*-iso8859-1" to type FontStruct Warning: Cannot convert string "-watanabe-mincho-medium-r-normal--*-140-*-*-c-*-jisx0208.1983-0" to type FontStruct
本警告は X Window System で動作するアプリケーション一般で出力されるメッセージであり、これらのフォントが参照できない状況にあることを表しています。
symjddefdsコマンドを使用してJDBCデータソースを登録してください。
参照
symjddefdsコマンドの詳細については、“コマンドリファレンス”を参照してください。
JDBCドライバの異常が発生したトラブルの事例、およびその対処方法について説明します。
JDBCデータソースを使用した接続で、メッセージ Invalid returned length value from server : connection infringement が出力される(Solaris/Linuxの場合)
Invalid returned length value from server : connection infringement
以下の手順で、JDBCドライバの動作環境を見直してください。
同一環境内に、複数のJDBCドライバがインストールされていないか確認します。複数のJDBCドライバがインストールされている場合、不要なJDBCドライバをすべて削除します。
EJBサービスやServletサービスなどを使用している場合、これらのサービスを停止します。
JDBCドライバのネーミングサービスを停止します。
以下のファイルを削除します。
/opt/FJSVsymjd/fjjdbc/etc/namespace.ser
JDBCデータソースを再設定します。
2.でサービスを停止している場合、これらのサービスを再起動します。
アプリケーションを再度実行します。
JDBCデータソースを使用した接続で、メッセージ Invalid returned length value from server : connection infringement が出力される(Windowsの場合)
Invalid returned length value from server : connection infringement
以下の手順で、JDBCドライバの動作環境を見直してください。
同一環境内に、複数のJDBCドライバがインストールされていないか確認します。複数のJDBCドライバがインストールされている場合、不要なJDBCドライバをすべて削除します。
EJBサービスやServletサービスなどを使用している場合、これらのサービスを停止します。
JDBCドライバのネーミングサービスを停止します。
以下のファイルを削除します。
Symfoware Serverクライアント機能インストール先ディレクトリ\JDBC\fjjdbc\etc\namespace.ser
JDBCデータソースを再設定します。
2.でサービスを停止している場合、これらのサービスを再起動します。
アプリケーションを再度実行します。
JDBCドライバのデータソース登録ツールを起動すると、メッセージ Exception in thread "main" java.lang.NoClassDefFoundError: javax/sql/DataSource が出力される
Exception in thread "main" java.lang.NoClassDefFoundError: javax/sql/DataSource
JDBC 2.0 Optional Package(javax.sqlパッケージ)が適用されていない可能性があります。ネーミングサービスの起動環境を見直してください。
ポイント
JDK1.4以降では、JDKにJNDIクラスライブラリやJDBC 2.0 Optional Packageが同梱されています。
システム管理者権限を持たないユーザがネーミングサービスの起動コマンドを実行すると、データソースの登録時にメッセージが出力される(Solaris/Linuxの場合)
システム管理者権限を持たないユーザがネーミングサービスの起動コマンドを実行すると、データソースの登録時に以下のメッセージが出力される場合があります。
failed to save a nameSpace file
システム管理者権限を持つユーザにより、コマンドを実行してください。