7

プログラムで DataSource を Tomcat の 6 JNDI にバインドすることは可能ですか?

その場で DataSource を作成し、JNDI を介して (たとえば ColdFusion に) 利用できるようにしたいと考えています。

これは私が持っているものです:

public void bindToConext(DataSource dataSource) throws NamingException, SQLException {
    Context initContext = new InitialContext();
    Context envContext  = (Context)initContext.lookup("java:/comp/env");
    envContext.bind("jdbc/mydatasource", dataSource);
}

しかし、私はこの例外を受けています:

javax.naming.OperationNotSupportedException: Context is read only

回避策はありますか?

4

2 に答える 2

4

Tomcat のコンテキストは起動後に読み取り専用になるため、それはできませんでした。

そこで私たちがしたことは、インメモリ コンテキスト (栄光化された HashMap のようなもの) である SimpleJNDI を使用することでした。

jndi.propertiesクラスパスにある必要があり、リソースを探すディレクトリと初期コンテキストファクトリを定義するファイルが必要です

java.naming.factory.initial=org.osjava.sj.SimpleContextFactory
org.osjava.sj.root=some/relative/path
org.osjava.jndi.delimiter=/
org.osjava.sj.jndi.shared=true

ColdFusion とのバインディングを作成するには、まずプログラムでデータ ソースを作成し、それをコンテキストにバインドします。

DataSource ds = ...
Context c = new InitialContext();
c.bind( "jdbc/my/blah/"+var , ds );
...

次に、CF 管理 API を使用して、jndiname だけを使用して JNDI タイプの CF データソースを作成します。

于 2012-12-18T15:42:09.510 に答える
2

Tomcat の作業コンテキストは java:comp/env です。このコンテキストは読み取り専用です。ただし、Tomcat の JNDI 実装を使用して独自のコンテキストを作成することはできますが、"java:comp/env" から離れている必要があります。

Context ctx = new InitialContext()
ctx.createSubcontext("any_name").createSubcontext("any_sub_name");
ctx.bind("any_name/any_sub_name/myDataSource", myDataSource);

デフォルトでは、Tomcat のコンテキストは共有されるため、DataSource はアプリのどこからでも次の方法で取得できます。

Context ctx = new InitialContext()
DataSource ds = (DataSource)ctx.lookup("any_name/any_sub_name/myDataSource");
于 2017-06-27T14:55:41.613 に答える