Oracle SQLcl コマンドラインで Oracle データベース接続に時間が掛かる問題の解決方法

Oracle SQLcl コマンドラインで Oracle データベース接続に時間が掛かる問題の解決方法

Oracle データベースで事実上の標準であった SQL*Plus に代わり、Oracle が SQLcl という新しい Java で開発されたコマンドラインツールをリリースしています。このコマンドラインツールを使うことで、CSV ファイルを簡単に作成できたりと、たくさんの機能が満載されています。

http://www.oracle.com/technetwork/jp/developer-tools/sqlcl/overview/index.html

とても便利なツールなのですが、SQLcl ツールを Linux や UNIX サーバーで実行して Oracle データベースに接続しようとすると、とてつもなく時間が掛かります。多くの場合、接続タイムアウトでデータベースにすら接続できません。これではどんなに高機能なツールでも使えないツールになってしまいます。

この記事では SQLcl ツールでデータベース接続する際の問題を解決するための方法を解説します。


何が原因で SQLcl でデータベースに接続できないのか

SQLcl コマンドラインツールは Java で開発されており、Linux や UNIX での Java ライブラリは乱数を生成する際に /dev/random という機能をデフォルトで使っています。

Linux や UNIX 系オペレーティングシステムでは、ある一定量の乱数が生成できるまで /dev/random が待ち状態に入るため、それによって Java を利用したプログラム側もまた処理完了まで待たされてしまいます。

/dev/random は非常にセキュアに乱数を生成してくれますが、これによりアプリケーションがとてつもなく遅くなってしまいます。よって /dev/random の代わりに /dev/urandom を使うように Java の設定を変更します。

Java の設定を変更して乱数生成に /dev/urandom を使うようにする手順

以下に実際に Java の設定を変更して /dev/random の代わりに /dev/urandom を使う方法を記載します。これにより SQLcl だけでなく、Oracle データベースに接続する様々な種類のアプリケーションの接続問題を解消できます。

1. $JAVA_HOME/jre/lib/security/java.security ファイルをテキストエディタで開きます。

2. 開いたファイルの中に "securerandom.source=file:/dev/random" という行がありますので、これを以下のように変更します。

[変更前]
securerandom.source=file:/dev/random

[変更後]
securerandom.source=file:/dev/urandom

3. 上記のように変更したらファイルを保存します。

これにより Oracle データベース接続が頻繁に失敗している、あるいは接続に時間が掛かる問題を、安全に解決できます。