2010年9月 のアーカイブ


Oracle11gをデータベースとして使用するシステムで、sqlrelayをコネクションプーリングのミドルウェアとして使用したので、メモを残してみる。

インストールするOS

データベースがOracleなので、それにあわせてOracle Enterprise Linuxを使用した。

Instant Clientのインストール

Oracleのサイトから、
Instant Client for Linux x86の

をダウンロードし、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とやり取りする部分に違いは無い。