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的上下文在启动后变成了只读的。

所以我们所做的是使用 SimpleJNDI,它是一个内存上下文(更像是一个美化的 HashMap),它对我们有用。

它需要一个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 admin 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 回答