在tomcat中绑定JNDI数据源?

在tomcat中绑定JNDI数据源?,tomcat,coldfusion,datasource,tomcat6,jndi,Tomcat,Coldfusion,Datasource,Tomcat6,Jndi,可以通过编程将数据源绑定到Tomcat的6JNDI吗 我想动态地创建一个数据源,然后通过JNDI(例如ColdFusion)使其可用 这就是我所拥有的: public void bindToConext(DataSource dataSource) throws NamingException, SQLException { Context initContext = new InitialContext(); Context envContext = (Context)ini

可以通过编程将数据源绑定到Tomcat的6JNDI吗

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

有解决办法吗?

这是不可能的,因为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数据源,Tomcat的工作上下文是java:comp/env。此上下文是只读的。但您可以使用Tomcat的JNDI实现创建自己的上下文,只要您不使用“java:comp/env”

默认情况下,Tomcat的上下文是共享的,因此可以通过以下方式从应用程序中的任何位置检索数据源:

Context ctx = new InitialContext()
DataSource ds = (DataSource)ctx.lookup("any_name/any_sub_name/myDataSource");

你能发布你的
@mindas吗?你好,我现在没有,因为我不会把任何东西放在那里(所有东西都会被动态创建)。我应该创建一个假的吗?我会尝试创建一个占位符,然后修改其中的条目。在这两种情况下,这听起来都是一种很好的做法。让我们知道这是否有帮助。我现在开始看。最后我们使用了SimpleJNDI,但我们必须重写
close()
方法,因为我丢失了所有信息,无法真正控制何时调用它。
Context ctx = new InitialContext()
DataSource ds = (DataSource)ctx.lookup("any_name/any_sub_name/myDataSource");