- PR -

JNDIを使用したContextのbind/lookupについて

1
投稿者投稿内容
るな
常連さん
会議室デビュー日: 2006/03/09
投稿数: 21
投稿日時: 2006-03-09 18:15
お世話になります。
JNDIを使用したContextのbind/lookupについて質問させて下さい。

当方では
public class MyDataSource implements javax.sql.DataSource
{
//省略
}
なるクラスを作成しJNDIを使用しbind/lookupを行いたいのですがどうもうまく行きません。
public class Setup_JNDI{
public static void main (String args [])
throws SQLException, NamingException
{ // Initializing the Context
Context context = null;
try {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
context = new InitialContext(env);
MyDataSource ds = new MyDataSource();
context.rebind("MyDataSource",ds);
MyDataSource ds2
= (MyDataSource)context.lookup("MyDataSource");
} catch (NamingException e){
e.printStackTrace();
}
}

エラーは
javax.naming.OperationNotSupportedException: Can only bind References or Referenceable objects
at com.sun.jndi.fscontext.RefFSContext.addObjectToBindings(RefFSContext.java:479)
at com.sun.jndi.fscontext.RefFSContext.bindObject(RefFSContext.java:337)
at com.sun.jndi.fscontext.RefFSContext.rebind(RefFSContext.java:189)
at com.sun.jndi.fscontext.FSContext.rebind(FSContext.java:194)
at javax.naming.InitialContext.rebind(Unknown Source)
at Setup_JNDI.dsBind(Setup_JNDI.java:86)
at Setup_JNDI.main(Setup_JNDI.java:69)
Exception in thread "main"
上記の通りですが過去のスレッドを調べた所「Referenceable でないから」と
ありましたが、それでは要望的に何か違うと思いました。

本来的には独自のJDBCドライバを作成しようとしていまして
Win上のサービスに対してコネクションをプールしたく
ここ数日調査した所「JNDIを使用するのが一般的」と言う所に至った次第です。
全くノウハウが無い状態からのスタートで素人同然です。
「ここでも読んで」等で構いませんので何卒ご教授願います。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-03-09 19:39
引用:

るなさんの書き込み (2006-03-09 18:15) より:
本来的には独自のJDBCドライバを作成しようとしていまして



これと

引用:

全くノウハウが無い状態からのスタートで素人同然です。



これが論理的につながらないので意味不明に見えます。
ノウハウがなくてJDBC(って何?って感じなはずなのに)を独自作成
するというのが分かりません。

(1)JDBC「作成」の素人
(2)JDBC「使用」の素人

どちらでしょう。
(1)は文章が違うと思います。JDBCを作ろうと考えるならすでに「素人」とは言いがたい。
(2)では「使用」できる程度ではJDBCを作ろうと考えるのがおかしい。

引用:

上記の通りですが過去のスレッドを調べた所「Referenceable でないから」と
ありましたが、それでは要望的に何か違うと思いました。



、、、エラーを見たところ、まさにOperationNotSupportedExceptionだと思いますが。
rebind()できるにふさわしいインターフェイスをMyDatSourceクラスが、実装していない
からでは。

いまいち、rebindしてまで独自のJDBC実装する理由がよく分からないけど。

ちなみにぐぐったら、こんなんでましたけど。

http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/jndi/spec/spi/spi-egs.frame.html

違うのかな。ちなみにJDBCを作成したことはありません。
けど、エラーまんまなので、なにを尋ねているのかと思って。


あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-03-09 19:58
引用:

るなさんの書き込み (2006-03-09 18:15) より:
上記の通りですが過去のスレッドを調べた所「Referenceable でないから」と
ありましたが、それでは要望的に何か違うと思いました。

本来的には独自のJDBCドライバを作成しようとしていまして
Win上のサービスに対してコネクションをプールしたく
ここ数日調査した所「JNDIを使用するのが一般的」と言う所に至った次第です。
全くノウハウが無い状態からのスタートで素人同然です。
「ここでも読んで」等で構いませんので何卒ご教授願います。


JNDIにbindしたいのであれば、javax.naming.Referenceが使用する
リソースファクトリを自作してbindすれば良さそうに思いますが、
Tomcat等ではWebアプリからではbindできないので注意しましょう。

このあたりの作り方はTomcatのソースが参考になると思います。
jakarta-tomcat-catalina/catalina/src/share/org/apache/naming/factory/

JDBCドライバの自作という点で考えると、アプリケーションサーバの標準の
リソース管理機構(JCA)を利用できるはずなのでJNDIは無関係だと思いますよ。
実装するとしても、ユーザーが直接使用するjavax.sql.DataSourceではなく、
javax.sql.ConnectionPoolDataSourceやjavax.sql.XADataSourceです。

この辺りはjavax.sqlパッケージにありますが、他のJ2EE APIから考えると
javax.sql.spiパッケージに分けてあった方が勘違いが少なかったと思います。
るな
常連さん
会議室デビュー日: 2006/03/09
投稿数: 21
投稿日時: 2006-03-09 21:05
お世話になります。
早速の返答、及びご指摘有難うございます。
更に、質問内容が不明確だった事をお詫びします。
元々の根っこから説明致します。

1.Win上に独自のDBサービスを構築(Win上にサービスプログラムとして登録済み)
2.java.sql準拠JDBCドライバ作成
3.javaプログラムから上記JDBCドライバを使用し接続/実行確認済み

ここでパフォーマンス等問題によりコネクションプールを実装する事になったのですが
指摘された内容で確認した所、勉強不足でして
  ・JNDIで登録されたDataSourceオブジェクトがlookup()で取得出来る
  ・その為にはまずbind()でDataSourceを登録せねば!
と間違って理解していました。
指摘の通りDataSourceオブジェクトはbind()出来ないのでエラーになっているのですね
...お恥ずかしい限りです。

ノウハウが無く素人同然と言いますのは
先日まで「JNDIって何?」と言う状態な上に
JDBCドライバとしてコネクションプールを実現する為のノウハウが全く無かったの
そう書かせて頂きました。

もう少し調査&勉強致します。
また、何かありましたらご教授願います。
1

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