在tomcat中绑定JNDI数据源?
Posted
技术标签:
【中文标题】在tomcat中绑定JNDI数据源?【英文标题】:Bind JNDI datasource in tomcat? 【发布时间】:2012-11-23 22:30:02 【问题描述】:是否可以通过编程方式将 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
有解决办法吗?
【问题讨论】:
您可以发布您的<Resource
配置吗?
@mindas 你好,我现在没有,因为我不会放任何东西(一切都将被动态创建)。我应该创建一个假的吗?
我会尝试创建一个占位符,然后修改其中的条目。无论哪种情况,这听起来都是一个好习惯。让我们知道这是否有帮助。
我现在开始关注code.google.com/p/osjava/wiki/SimpleJNDI。
最后我们使用了 SimpleJNDI,但我们必须重写 close()
方法,因为我丢失了所有信息并且无法真正控制何时调用它。
【参考方案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 的上下文是共享的,因此可以通过以下方式从应用程序的任何位置检索数据源:
Context ctx = new InitialContext()
DataSource ds = (DataSource)ctx.lookup("any_name/any_sub_name/myDataSource");
【讨论】:
【参考方案2】:这是不可能的,因为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中绑定JNDI数据源?的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式将数据源添加到嵌入式 tomcat 7 中的 JNDI 上下文
Tomcat 8,axis2 webservices aar,spring jndi未绑定在上下文中
带有纯 JDBC-JNDI:javax.naming.NameNotFoundException 的 Tomcat 8.5:名称 [jdbc/KDB] 未绑定在此上下文中。找不到 [jdbc]