2010年9月 のアーカイブ
perl + sqlrelayを使用したOracle11gとのコネクションプーリング
Oracle11gをデータベースとして使用するシステムで、sqlrelayをコネクションプーリングのミドルウェアとして使用したので、メモを残してみる。
インストールするOS
データベースがOracleなので、それにあわせてOracle Enterprise Linuxを使用した。
Instant Clientのインストール
Oracleのサイトから、
Instant Client for Linux x86の
- Instant Clientパッケージ – Basic
- Instant Clientパッケージ – SDK
- Instant Clientパッケージ – SQL*Plus
をダウンロードし、rpmでインストール。
.bash_profile tnsnames.oraの設定
Oracleと接続する基本設定を実施し、SQL*Plusで接続できることを確認。
sqlrelayのインストール
http://sqlrelay.sourceforge.net/から、バージョン0.39.4 をダウンロード。
(0.40以降では、インストール後、うまくデーモンが立ち上がってくれなかった。)
ソース解凍後、configureの以下の2箇所を編集する。
if ( test -z "$ORACLELIBS" ) then for version in `cd /usr/lib/oracle 2> /dev/null; ls -d * 2> /dev/null` do if ( test -r "/usr/lib/oracle/$version/client/lib/libclntsh.$SOSUFFIX" -a -r "/usr/include/oracle/$version/client/oci.h" ) then ORACLEVERSION="10g" → 11g に変更 ORACLELIBSPATH="/usr/lib/oracle/$version/client/lib" ORACLELIBS="-L/usr/lib/oracle/$version/client/lib -lclntsh -lnnz10" → lnnz11 に変更 ORACLEINCLUDES="-I/usr/include/oracle/$version/client" fi done fi
configureを実行。上記の変更がなされていないと、Oracleを発見できずにconfigureは失敗する。
./configure \ --disable-mysql \ --disable-msql \ --disable-postgresql \ --disable-sqlite \ --disable-freetds \ --disable-sybase \ --disable-odbc \ --disable-db2 \ --disable-interbase \ --disable-mdbtools \ --disable-python \ --disable-zope \ --disable-ruby \ --disable-java \ --disable-php \ --disable-tcl \ --disable-gtk \ --with-oracle-instantclient-prefix=/usr/include/oracle/11.2/client/
configureが成功すれば、その後はmake、make installでインストールを完了。
sqlrelay.confの設定
/usr/local/firstworks/etc/sqlrelay.conf.example に設定ファイルのサンプルがあるので、それを /usr/local/firstworks/etc/sqlrelay.conf にコピーし設定する。
設定内容は、http://sqlrelay.sourceforge.net/sqlrelay/configuring.htmlを参照。
環境変数の設定
PATH に /usr/local/firstworks/bin
LD_LIBRARY_PATH に /usr/local/firstworks/lib
を追加。
デフォルト起動インスタンスIDの設定
sqlrelay.confに設定した内容でデフォルト起動となるインスタンスIDを /etc/sysconfig/sqlrelay に記述。
ここまでで各種設定は完了。
> service sqlrelay start
で、デーモンが開始される。
perlからsqlrelay経由でのOracleへの接続
DBIを使用した以下のようなコードで接続できる。
#!/usr/bin/perl use DBI; my $dbh = DBI->connect('DBI:SQLRelay:host=localhost;port=sqlrelay.confで設定したポート;socket=',"接続ID","接続パスワード"); my $sth = $dbh->prepare("select * from emp"); $sth->execute; while ( my @row = $sth->fetchrow_array ) { print "$row[0]\n"; } $sth->finish; exit;
接続先がsqlrelayに変わるだけで、その他に関してはDBI経由でOracleとやり取りする部分に違いは無い。