是否可以以编程方式将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
有解决方法吗?
答案 0 :(得分:3)
这是不可能的,因为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数据源
答案 1 :(得分:1)
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");