- - PR -
JNDIを使用したContextのbind/lookupについて
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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を使用するのが一般的」と言う所に至った次第です。 全くノウハウが無い状態からのスタートで素人同然です。 「ここでも読んで」等で構いませんので何卒ご教授願います。 | ||||||||||||
|
投稿日時: 2006-03-09 19:39
これと
これが論理的につながらないので意味不明に見えます。 ノウハウがなくてJDBC(って何?って感じなはずなのに)を独自作成 するというのが分かりません。 (1)JDBC「作成」の素人 (2)JDBC「使用」の素人 どちらでしょう。 (1)は文章が違うと思います。JDBCを作ろうと考えるならすでに「素人」とは言いがたい。 (2)では「使用」できる程度ではJDBCを作ろうと考えるのがおかしい。
、、、エラーを見たところ、まさに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を作成したことはありません。 けど、エラーまんまなので、なにを尋ねているのかと思って。 | ||||||||||||
|
投稿日時: 2006-03-09 19:58
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:05
お世話になります。
早速の返答、及びご指摘有難うございます。 更に、質問内容が不明確だった事をお詫びします。 元々の根っこから説明致します。 1.Win上に独自のDBサービスを構築(Win上にサービスプログラムとして登録済み) 2.java.sql準拠JDBCドライバ作成 3.javaプログラムから上記JDBCドライバを使用し接続/実行確認済み ここでパフォーマンス等問題によりコネクションプールを実装する事になったのですが 指摘された内容で確認した所、勉強不足でして ・JNDIで登録されたDataSourceオブジェクトがlookup()で取得出来る ・その為にはまずbind()でDataSourceを登録せねば! と間違って理解していました。 指摘の通りDataSourceオブジェクトはbind()出来ないのでエラーになっているのですね ...お恥ずかしい限りです。 ノウハウが無く素人同然と言いますのは 先日まで「JNDIって何?」と言う状態な上に JDBCドライバとしてコネクションプールを実現する為のノウハウが全く無かったの そう書かせて頂きました。 もう少し調査&勉強致します。 また、何かありましたらご教授願います。 |
1