是否有JNDI命名空间约定?
我已经下载了JBoss EAP 6.1,我将添加一个新的数据源。 我必须将数据源绑定到JNDI名称。 通过读取示例数据源的JNDI名称,该名称是:
java:jboss/datasources/ExampleDS
我看到他们在java:jboss
之后使用了datasources
。 这只是一个命名约定 – 我无法在任何地方找到 – 或者使用java:jboss/bananaboat/MyDS
是不是很好java:jboss/bananaboat/MyDS
?
下面列出的第一部分是正确的 – 例如java:comp
是范围而其余部分只是普通的层次结构组织?
java:comp/ - The namespace is scoped to the current component (ie EJB) java:module/ - Scoped to the current module java:app/ - Scoped to the current application java:global/ - Scoped to the application server
https://docs.jboss.org/author/display/AS71/JNDI+Reference
我不得不自己回答同样的问题并将这些链接拉到一起。
简而言之, JNDI命名策略可以是任何一个,但JEE定义了自己的:
JNDI的定义独立于任何特定的命名和目录服务实现。
但是,确定使用JNDI的一组有限命名策略的一个重要平台是…… JEE 。
这将是数据源的最常规名称:
企业名称空间根植于
java
URL方案的URL上下文。例如,JDBC
Salary
数据库可能具有名称“java:comp/env/jdbc/Salary
”。
- …
comp
与为组件相关的绑定保留的子树绑定。- …
env
绑定到为组件的环境相关绑定保留的子树,由其部署描述符定义。- 资源工厂引用放在由其资源管理器类型区分的子树中。
- …用于JDBC DataSource引用的
jdbc
。
JEE 7教程还详细介绍了在32.4.1.1 Portable JNDI语法中引用EJB的命名策略。
请注意,注入DataSource
@Resource
注释通常指定相对于java:comp/env
JNDI名称java:comp/env
– 对于可移植和可部署的解决方案,请参阅此答案或此答案 。
正如您在更新的链接中所提到的, java:jboss
namespace是仅由WildFly / JBoss提供的自定义扩展。
要回答这个问题,标准命名空间下的子树只是普通的层次结构 。 显然,只有应用服务器,文档,进程等(广泛地)识别这些子树才有意义。否则,我猜几乎平坦的键值或随机bananaboat/MyDS
很好但仍然必须“挂载”在受支持的命名空间下,如java:jboss
。
这完全来自记忆(不久前我被其他团队成员告知):
java:前缀是JBoss / EE标准。 它应该为所有非可序列化资源加上前缀,这意味着它们是jvm的本地资源。 之后,您可以命名任何您喜欢的名称,以形成“目录”之类的结构。 例如,如果您使用JNDI来获取绑定“java:jboss / datasources”,您将获得该名称下列出的所有资源的子树。 它将包含ExampleDS和可能的其他DataSource。
回答你的问题:你不必在java:jboss之后命名数据源。 但将它命名为有意义的东西是有意义的。
- 轻松启动独立JNDI服务器(并注册一些资源)
- 用于MS SQL Server的JBoss AS 5数据库连接池重新连接例程
- Oracle getConnection运行缓慢
- 带有mysql DataSource的javax.naming.NoInitialContextException
- 如何从Web容器外部查找JNDI数据源?
- 使用javamail API发送带附件的电子邮件
- 属性’dataSource’是必需的java(Spring)错误
- MyBatis-guice 3.3 +多个数据源+属性+ scriptrunner
- 防止JBoss 7上的JNDI数据源的Oracle连接自动提交(Jeeves DBMS)