18.7.8 データベース接続の実装時の注意事項
ここでは,データベース接続の実装時の注意事項について説明します。
-
SQLにエスケープシーケンスを利用しない場合,setEscapeProcessingメソッドにfalseを設定するとSQL変換をしません。このため,最適な処理速度となります。
-
PooledConnection.getConnectionメソッドで取得したConnectionオブジェクトに対して,そのConnectionオブジェクトから派生したStatementオブジェクト,PreparedStatementオブジェクト,およびCallableStatementオブジェクトの作成および実行中にConnection.closeメソッドを実行すると,これらのオブジェクトの作成および実行処理が終了するまで,Connection.closeメソッドの処理を待つことになります。そのため,これらのオブジェクトの作成および実行処理に長時間掛かっている場合は,Connection.closeメソッドの処理時間も長くなります。
-
PooledConnectionオブジェクトによって生成されたconnectionErrorOccurredイベント内で,PooledConnection.getConnectionメソッドで取得したConnectionオブジェクトに対して,Connection.closeメソッドを実行しないでください。connectionErrorOccurredイベント内でConnection.closeメソッドを実行すると,JDBCに対するすべての要求が返ってこなくなることがあります。
-
Windowsの場合に,Statement.cancelメソッドで実行中のSQLを取り消すとき,タイミングによっては実行中のSQLが取り消されないことがあります。Statement.cancelメソッドを呼び出しても,実行中のSQLが取り消されない場合は,再度,Statement.cancelメソッドを呼び出してください。また,接続するデータベースがHiRDBの場合,cancelメソッド実行後,使用中のコネクションで生成したステートメントオブジェクトをすべてクローズして,再度ステートメントオブジェクトを作成してください。
-
Windowsの場合,PreparedStatementクラスおよびCallableStatementクラスのsetObjectメソッドに,InputStreamクラスおよびReaderクラス(派生クラスも含む)のオブジェクトは指定できません。指定するとエラーになります。
-
Windowsで,HiRDBのBLOB列およびBINARY列のデータを取得する場合,データベースアクセス方法は次のどちらかになります。この指定値によっては,JavaVMでのメモリ取得の性能に大きく影響します。
-
REAL(一括でデータを取得する)
-
LOCATOR(データをBUF_SIZE(デフォルト値は64キロバイト)分で分割してデータを取得する)
「REAL」を指定すると,最大データ長分のBUF_SIZEを設定する必要があります。この場合,BLOB列およびBINARY列以外のSQL実行時にもBUF_SIZE分のメモリを取得するため,ほかのSQLの実行性能にも影響を与えます。
「LOCATOR」を指定すると,データベースへのアクセスは,ResultSet.next(),またはCallableStatment.execute()実行時と,getBytesなどのデータを取得するメソッド実行時の2回行われます。そのため,「REAL」を指定した場合に比べて性能が低下することがあります。
データベースアクセス方法は,BLOB列およびBINARY列で取得する実データの最大データ長によって設定してください。BLOB列およびBINARY列を取得し,最大データ長が1メガバイト以上のときは「LOCATOR」を設定することをお勧めします。ただし,JavaVMでのメモリ確保時の性能に大きく差が生じるため,1メガバイトでも「REAL」と設定した方が,性能が良いこともあります。
-
-
setBinaryStreamメソッドまたはsetAsciiStreamメソッドの引数※1に指定したストリームデータのデータ長L1※2と,x.availableメソッドで取得できる値L2がL1>L2の場合,setBinaryStreamメソッドはストリームデータの読み込み領域として引数lengthで指定したサイズ(単位:バイト)のメモリを確保します。
引数lengthを大きくし過ぎると,データ長L1に関係なくメモリ不足になるおそれがあります。また,「引数length>データ長L1」の場合,読み込み処理終了後に読み込み領域をデータ長L1バイトで再確保するため,性能が劣化するおそれがあります。このため,引数lengthの値は,データ長L1以下にしてください。
- 注※1
-
setBinaryStreamメソッドまたはsetAsciiStreamメソッドの引数とは,setBinaryStream(int parameterIndex,InputStream x,int length),またはsetAsciiStream(int parameterIndex,InputStream x,int length)のことです。
- 注※2
-
データ長L1は,InputStreamクラスのreadメソッドが,-1をリターンするまで読み込めるデータの長さです。