@Resource---------------JAVA:COMP/ENV

本文介绍了在Java EE环境中通过JNDI和环境命名上下文(ENC)获取数据源的方法,解释了两者之间的区别及其应用场景,并展示了如何在部署描述符文件中配置资源引用。
关于获取数据源的语法,大体有(javax.sql.DataSource) ctx.lookup ("java:comp/env/XXX")和(javax.sql.DataSource) ctx.lookup("XXX")两种写法,好多人以为这两种写法是相同的,以为都是通过JNDI来获取数据源。其实java:comp/env和 JNDI是不同的,java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。ENC是一个引用,引用是用于定位企业应用程序的外部资源的逻辑名。引用是在应用程序部署描述符文件中定义的。在部署时,引用被绑定到目标可操作环境中资源的物理位置(JNDI名)。使用ENC是把对其它资源的JNDI查找的硬编码解脱出来,通过配置这个引用可以在不修改代码的情况下,将引用指向不同的EJB(JNDI)。 在J2EE中的引用常用的有:
---------JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明
---------JMS 连接工厂在java:comp/env/jms 子上下文中声明
---------JavaMail 连接工厂在java:comp/env/mail 子上下文中声明
---------URL 连接工厂在 java:comp/env/url子上下文中声明

假如你写了一个EJB,获取datasource如:dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/DBPool");

 

*****补充:当然我们也可以使用resource注解来注入数据缘,:如

 

 @Resource(name="jdbc/xxxx")----映射的jndi是java:comp/env/jdbc/XXX

  private javax.sql.DataSource dataSource;

 

如果没有写name,那么默认是使用类的权限定名称/被注解的字段或者属性;


那么在配置文件中进行资源映射时,在ejb-jar.xml中,
     <resource-ref>
       <res-ref-name>jdbc/DBPool</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
     </resource-ref>
在weblogic-ejb-jar.xml中,
   <reference-descriptor>
     <resource-description>
       <res-ref-name>jdbc/DBPool</res-ref-name>
       <jndi-name>OraDataSource</jndi-name>
     </resource-description>
   </reference-descriptor>
//转者注:如果是在jboss则在jboss.xml中做如下修改
   <resource-managers>
       <resource-manager>
           <res-name>jdbc/DBPool</res-name>
           <res-jndi-name>OraDataSource</res-jndi-name>
       </resource-manager>
   </resource-managers>
实际服务器中的JNDI名字是OraDataSource,逻辑名jdbc/DBPool只是用来和它作映射的,这样做的好处是为了提高可移植性,移植的时候只需要把配置文件改一下就可以,而应用程序可不用改动。

假如你写了一个一般的应用程序,想直接通过JNDI来获取数据源,那么直接lookup(“mytest”)就可以了(假如服务器上的JNDI为mytest),用第一种写法反而会报错的。
### 在web.xml中配置mysql-connector-javaJava Web应用程序中,`web.xml` 文件用于定义应用程序的部署描述符。尽管 `web.xml` 本身并不直接与 MySQL 驱动程序(如 `mysql-connector-java`)进行集成,但它可以通过 JNDI 数据源的方式间接配置数据库连接资源。以下是关于如何通过 `web.xml` 和 Tomcat 的 `context.xml` 或 `server.xml` 配置文件来实现 MySQL 数据库连接的具体方法。 #### 1. 配置 Tomcat 的数据源 首先需要在 Tomcat 中配置一个 JNDI 数据源。这通常通过编辑 `context.xml` 或 `server.xml` 文件完成。以下是一个示例配置: ```xml <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC" username="root" password="password" /> ``` 上述代码片段定义了一个名为 `jdbc/test` 的 JNDI 数据源[^3]。确保将驱动程序类名设置为 `com.mysql.cj.jdbc.Driver`,这是 MySQL Connector/J 8.x 的默认驱动程序类名。 #### 2. 将 MySQL 驱动添加到 Tomcat 为了使 Tomcat 能够识别 MySQL 驱动程序,必须将 `mysql-connector-java` 的 JAR 文件放置在 Tomcat 的全局类路径中。具体位置通常是 `Tomcat/lib` 目录下[^2]。如果将驱动程序放置在 Web 应用程序的 `WEB-INF/lib` 目录下,则可能导致某些情况下无法正确加载驱动程序。 #### 3. 配置 web.xml 接下来,在 `web.xml` 文件中声明对 JNDI 数据源的引用。以下是一个示例配置: ```xml <resource-env-ref> <description>DB Connection</description> <resource-env-ref-name>jdbc/test</resource-env-ref-name> <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` 此配置告诉容器应用程序需要使用名为 `jdbc/test` 的 JNDI 数据源[^4]。注意,`resource-env-ref-name` 的值应与 Tomcat 中定义的数据源名称一致。 #### 4. 使用数据源 在 Java 代码中,可以通过以下方式获取数据源实例: ```java Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup("java:/comp/env"); DataSource ds = (DataSource) envContext.lookup("jdbc/test"); Connection conn = ds.getConnection(); ``` 上述代码展示了如何通过 JNDI 查找数据源并获取数据库连接[^1]。 ### 注意事项 - 确保 `mysql-connector-java` 的版本与使用的 MySQL 数据库版本兼容。 - 如果遇到 `Name jdbc is not bound in this Context` 错误,请检查 Tomcat 的配置文件是否正确加载了数据源。 - 如果使用的是较新的 Tomcat 版本(如 Tomcat 9),请确保 URL 参数中的 `serverTimezone` 设置为正确的时区。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值