在tomcat的绑定JNDI数据源?(Bind JNDI datasource in tomcat?

2019-07-04 15:15发布

是否有可能以编程方式绑定一个DataSource到Tomcat的6 JNDI?

我想动态创建一个数据源,然后使其可通过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

有没有解决办法?

Answer 1:

很好,因为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管理API,我们创造仅仅使用jndiname型JNDI的CF数据源



Answer 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");


文章来源: Bind JNDI datasource in tomcat?