结合最近两天在网上看的各种帖子,昨天自己实际试了下,下面以问题的方式,对自己之前的困惑做个回答。

首先说一下,要用到的几个文件。

1)Jboss数据源配置文件,这儿是oracle数据源,数据源后缀名必须以-ds.xml结束,放到部署目录下。

<?xml version="1.0" encoding="UTF-8"?>

<datasources>
<local-tx-datasource>
<jndi-name>jdbc/asap002</jndi-name>
<connection-url>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=off)(ADDRESS=(PROTOCOL=TCP)(HOST=xx.xx.xx.xx)(PORT=1523))(ADDRESS=(PROTOCOL=TCP)(HOST=xx.xx.xx.xx)(PORT=1523))) (CONNECT_DATA=(SERVICE_NAME=asap002)))</connection-url>
<use-java-context>true</use-java-context>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<min-pool-size>5</min-pool-size>
<max-pool-size>20</max-pool-size>
<user-name>asap002</user-name>
<password>xxx</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>Oracle9i</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>

本文关注重点<jndi-name>jdbc/asap002</jndi-name>和<use-java-context>true</use-java-context>两个节点。为后续叙述方便,jndi-name的值(这里是jdbc/asap002),我们称为ds-jndi-name。use-java-context的值(这里是true),我们称为use-java-context。

2)第二文件是jboss-web.xml文件,同web.xml一同放在web工程的WEB-INF目录下。

<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd"> <jboss-web>
<class-loading java2ClassLoadingCompliance='false'>
<loader-repository>
com.example:loader=react
<loader-repository-config>
java2ParentDelegaton=false
</loader-repository-config>
</loader-repository>
</class-loading> <resource-ref>
<res-ref-name>jdbc/asap002</res-ref-name>
<jndi-name>java:jdbc/asap002</jndi-name>
</resource-ref>
</jboss-web>

这儿重点关注 <resource-ref>    <res-ref-name>jdbc/asap002</res-ref-name>   <jndi-name>java:jdbc/asap002</jndi-name>  </resource-ref>节点。<resource-ref>节点我们称为jboss-resource-ref;res-ref-name的值(jdbc/asap002)我们称为jboss-res-ref-name;jndi-name的值(java:jdbc/asap002)我们称为jboss-jndi-name。

3)第三文件是web.xml文件。

<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>TumsQRevceive</display-name> <servlet>
<servlet-name>TumsQRevceive</servlet-name>
<servlet-class>com.travelsky.react.servlet.TumsReceiveServlet</servlet-class>
<load-on-startup>99</load-on-startup>
</servlet> <servlet>
<servlet-name>ForRequestReceive</servlet-name>
<servlet-class>com.travelsky.react.servlet.ForRequestReceive</servlet-class>
</servlet> <servlet>
<servlet-name>First</servlet-name>
<servlet-class>test.servlet.First</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ForRequestReceive</servlet-name>
<url-pattern>/ForRequestReceive</url-pattern>
</servlet-mapping> <servlet-mapping>
<servlet-name>First</servlet-name>
<url-pattern>/First</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/asap002</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>

这个文件重点关注<resource-ref>节点及其子节点<res-ref-name>jdbc/asap002</res-ref-name>。<resource-ref>节点我们称为web-resource-ref;res-ref-name的值(jdbc/asap002)我们称为web-res-ref-name。

4)因为使用Hibernate连接数据库,第四个文件是Hibernate主配置文件Hibernate.cfg.xml。

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory>
<property name="hibernate.connection.datasource">
java:comp/env/jdbc/asap002
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="tables/EspBaseServiceauth.hbm.xml" />
<mapping resource="tables/EspBaseUser.hbm.xml" />
<mapping resource="tables/EspBaseConfig.hbm.xml" />
<mapping resource="tables/EspSeatFare.hbm.xml" />
<mapping resource="tables/EspBaseAirportcity.hbm.xml" />
<mapping resource="tables/EspBaseOptionalsubcodes.hbm.xml" />
<mapping resource="tables/EspBaseIbeconfig.hbm.xml" />
<mapping resource="tables/EspGdsbsprevaOffice.hbm.xml" />
<mapping resource="tables/EspBaseAirline.hbm.xml" />
</session-factory>
</hibernate-configuration>

这个文件重点关注<property name="hibernate.connection.datasource">java:comp/env/jdbc/asap002</property>这个节点。我们称属性值java:comp/env/jdbc/asap002为hibernate.connection.datasource。

下面列出我之前的疑问并解答,相信有些也是其他人的困惑。

1)ds-jndi-name和jboss-jndi-name有什么关系?

这取决于use-java-context,如果use-java-context=false,也就是不使用java上下文,两者应该配成相同值;如果use-java-context=true,jboss-jndi-name应该在ds-jndi-name前面加‘java:’,即jboss-jndi-name=java:ds-jndi-name.对于数据源,建议将use-java-context配成true。

2)jboss-resource-ref和web-resource-ref有什么关系?

必须一样。而且当web-resource-ref存在时,jboss-resource-ref必须存在;

当jboss-resource-ref存在时,web-resource-ref可以省略。

3)web-resource-ref和hibernate.connection.datasource有什么关系?

这取决于hibernate采用JNDI(Java Naming and Directory Interface)还是ENC(Enterprise Naming Context)查找数据源。

如果直接采用JNDI,hibernate.connection.datasource应该等于数据源JNDI名称,即jboss-jndi-name,此时jboss-web.xml中的jboss-resource-ref节点和web.xml中的web-resource-ref节点可以同时省略;

如果采用ENC,hibernate.connection.datasource应该等于java:comp/env/web-resource-ref.此时,jboss-web.xml中的jboss-resource-ref节点必须存在,而web-resource-ref节点可以省略。

上面两种方式都可以成功使用数据源,建议采用ENC,因为这样应用不会直接依赖JNDI名字,移植性更好,比如将应用移植到其他服务器时,如果数据源JNDI名字有改变,仅需要在jboss-web.xml中更改,而不需要修改hibernate配置文件或代码。另外,像Tomcat不支持JNDI的中间件,只能采用ENC方式查找。

Jboss JNDI ENC 数据源的更多相关文章

  1. tomcat配置JNDI获取数据源

    各个web工程可以通过工程内的xml文件配置访问数据库的数据源,这样的配置是各个工程私有的.基于JNDI为tomcat配置数据源,则可以做成全局的,各工程只需要通过便签引用数据源即可. 1.需要将数据 ...

  2. JNDI数据源(在Tomcat下配置JNDI多数据源实例)

    一,添加数据库驱动包加入classpath. 这里我用到了oracle和mysql.所以由两个jar包:ojdbc14.jar和mysql-connector-java-5.1.13-bin.jar. ...

  3. jboss jndi配置部分参数详解

    使用的是jboss7.1.1, jndi的配置在$JBOSS_HOME/standalone/configuration/standalone.xml中进行配置.配置jndi时有很多参数,解释下用到的 ...

  4. [JBoss] JNDI与JBossNS

    JNDI的作用 JNDI是 Java 命名与目录接口(Java Naming and Directory Interface). 随着分布式应用的发展,远程访问对象访问成为常用的方法.虽然说通过Soc ...

  5. Jboss配置之数据源密码配置密文--EncryptingDataSourcePasswords

    local-tx-datasource:最常用的数据源配置,该连接池的连接管理器是LocalTxConnectionManager,只支持本地事务,不适合做分布式事务.以mssql为例如下:如果密码按 ...

  6. Tomcat8.0配置JNDI多数据源

    jndi配置 :此种配置需要在Tomcat的server.xml中和context.xml中配置数据源,在项目中引用. 需要在tomcat下加入数据库连接的jar包,相关包(ojdbc14;c3p0数 ...

  7. jndi配置数据源

    jndi(java Naming and DirectoryInterface,java命名和目录接口)是一组在Java应用中访问命名和目录服务的API. 命名服务将名称和对象联系起来,使得我们可以用 ...

  8. 在tomcat中用jndi配置数据源启动java web程序

    1.在web.xml中添加: <resource-ref>    <res-ref-name>jdbc/MTSDB</res-ref-name>    <re ...

  9. JNDI 配置:JBoss + MySQL

    一.JNDI 名词解释 JNDI 是Java 命名和目录接口(Java Naming and Directory Interface,JNDI)的简称.从一开始就一直是 Java 2 平台企业版(JE ...

随机推荐

  1. Taro -- 文字左右滚动公告效果

    文字左右滚动公告效果 设置公告的左移距离,不断减小,当左移距离大于公告长度(即公告已移出屏幕),重新循环. <View className='scroll-wrap'> <View ...

  2. Python列表(list)的方法调用

    #list# n = [12,34,"yue"]# v = n.append(27) #增加元素,注意是在尾部增加,由于列表是可修改的,所以是在原列表中增加,与字符串存在区别# p ...

  3. 基于ldap+sentry+rbac的hive数据库权限测试

    1.rbac系统简介 2.sentry系统简介 3.ldap系统简介 4.整个待测系统简介 user-role=group-role user-role是用户在rbac系统创建项目以及把项目成员以及给 ...

  4. Set 的合集 并集 差集

    合集 ,,,,,,]; ,,]; function union() { //先将数组去重 let s1 = new Set(arr1); let s2 = new Set(arr2); //[...s ...

  5. Spring Security初识

    Spring Security与Spring Boot集成 添加依赖: <dependency> <groupId>org.springframework.boot</g ...

  6. Python---协程---重写多进程

    一. # 匹配一行文字中所有开头的字母import re s = 'i love you but you don\'t love me' # \b\m findallcontent = re.find ...

  7. 数列前n项和

    等差数列 等比数列 常见的前n项和

  8. c++ string去除左右空格

    res.substr(res.find_first_not_of(' '),res.find_last_not_of(' ') + 1)

  9. mysql分组排序加序号(不用存储过程,就简简单单sql语句哦)

    做前端好长时间了,好久没动sql了.在追一个喜欢的女孩,做测试的,有这么个需求求助与本屌丝,机会难得,开始折腾起来,配置mysql,建库,建表.... 一 建表 CREATE TABLE `my_te ...

  10. 6398. 【NOIP2018模拟10.30】Generator(树状数组区间修改)

    题目描述 Description Input Output 输出 q 行,第 i 行表示数据 Di 的答案. Sample Input 4 3 2 1 1 2 4 2 1 2 1 1 3 5 2 2 ...