- PR -

複数のサーバーに接続する時のJDBCの選び方

1
投稿者投稿内容
kouichi
会議室デビュー日: 2003/01/04
投稿数: 17
投稿日時: 2006-08-08 17:43
サーバーAで PostgreSQL7.3
サーバーBで PostgreSQL8.0

サーバーAで運用しているアプリケーションサーバー上で
動いているWEBアプリケーションからサーバーA、サーバーB
それぞれで動いているDBに接続しようと思っているのですが
この場合クラスパスを通すJDBCは7.3用を使ったほうがよいのでしょうか?
それとも8.0のほうがよいのでしょうか?
接続ごとにJDBCを変更するようなことは可能なのか?
こういった場合の対処法がありましたら教えてください。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-08-08 18:01
どちらか片方だけ使う場合は、新しい方を使ったほうが
いいと思います。
それと、接続ごとにJDBCを変えることはできますよ。
直接JDBCを使ってもできますし、JNDIであらかじめ複数
接続先を定義するような使い方もできます。ただ、
サーバA、Bを跨ぐ形でトランザクション処理を行う
場合は、JTAなどのトランザクションマネージャーを
使う必要が出てきます。
kouichi
会議室デビュー日: 2003/01/04
投稿数: 17
投稿日時: 2006-08-08 18:23
>小僧さん
解答アリガトウございます。

>どちらか片方だけ使う場合は、新しい方を使ったほうがいいと思います。

ありゃ…自己解決しかけてたのですが
逆の答えが返ってきてしまいました。

http://www.sraoss.co.jp/PostgreSQL/7.4/changes.html
PostgreSQL(以下略)7.3⇒7.4の時にプロトコルが3.0になった
下位互換があり新しい機能は使えないが古いクライアントから
の接続は問題ないとあったので(8.0もプロトコルは3.0)

クライアントにあたるJDBCは古いほうがよいという考えはまずいでしょうか?

>それと、接続ごとにJDBCを変えることはできますよ。

できるならこれが一番ですね。
自分は普段Tomcatだとserver.xmlに以下の感じで
JDBCを指定しているのですが

<parameter>
<name>driverClassName</name>
<value>org.postgresql.Driver</value>
</parameter>

これではバージョンごとに切り替えることはできそうにありません。
どのようにすればよいのでしょうか?
恥ずかしながら自分では検索し切れなかったので
参考になるページ等ありましたら教えてください。

[ メッセージ編集済み 編集者: kouichi 編集日時 2006-08-08 18:24 ]
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-08-08 21:11
7.4じゃなくて7.3でした、これは失礼いたしました。
自己解決された内容の方がよろしいと思います。

コード:
<value>org.postgresql.Driver</value> 

恥ずかしながら自分では検索し切れなかったので 


恥ずかしいのは私の方で、クラス名が一緒だからバージョン
違いは同時に使えないですよね、失礼いたしました。

7.3用のドライバで8.0にも接続するのがよろしいかと
思います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-08-08 22:50
バージョンの違う同じクラスのドライバを混在させるためには、
別々のクラスローダで読み込む必要があります。

URLClassLoaderを使うのが一番楽かと思いますが、
URLClassLoaderは先に親クラスローダに移譲しますので、
クラスパス上にドライバのjarがあってはいけません。

ちなみに、DriverManagerの作りの問題上、
DriverManager経由では直接Connectionの取得はできません。
Driverのインスタンスを生成(不可視ならリフレクション操作が必要)して、
そのインスタンスからConnectionを生成する必要があります。

JNDI経由で利用したい場合は、独自のObjectFactoryを作成する必要があります。
org.apache.commons.dbcp.BasicDataSourceFactoryや、
org.apache.commons.dbcp.BasicDataSourceを拡張すればよいと思います。
ドライバの取得部分を上記処理で行うようにして、
いつもどおりのリソースのパラメータの指定のファクトリの指定の部分に、
上記実装クラスを指定すればOKです。

#どのみち面倒ですね・・・
kouichi
会議室デビュー日: 2003/01/04
投稿数: 17
投稿日時: 2006-08-09 12:37
>かつのり さん

解答アリガトウございます。
…勉強だけはしたけどいじった経験は無いレベルの話がイッパイです(^^;
JNDIのほうは難しそうですが、今回やりたいのはDBCPでなくてもOKなので
URLClassLoaderだけで何とかなりそうです。

…何とか頑張ってみます。
1

スキルアップ/キャリアアップ(JOB@IT)