Jboss JNDI ENC 数据源

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

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

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方式查找。

时间: 2024-10-28 00:10:19

Jboss JNDI ENC 数据源的相关文章

tomcat配置JNDI获取数据源

各个web工程可以通过工程内的xml文件配置访问数据库的数据源,这样的配置是各个工程私有的.基于JNDI为tomcat配置数据源,则可以做成全局的,各工程只需要通过便签引用数据源即可. 1.需要将数据库的连接驱动mysql-connector-java-5.1.21.jar及数据库连接池的jar包druid-0.2.9.jar放到Tomcat 6.0\lib下. 2.修改tomcat的配置文件,基于JNDI配置数据源,Tomcat 6.0\conf\context.xml改成如下即可,原文件中多

JBoss下配置数据源加密

一.JBoss下配置数据源时,如果密码直接暴露给了系统的操作员或者维护人员,显然就增加了数据库不安全的因素. MySQL Datasource配置样例 <?xml version="1.0" encoding="UTF-8"?> <!-- ===================================================================== --> <!--                      

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

一,添加数据库驱动包加入classpath. 这里我用到了oracle和mysql.所以由两个jar包:ojdbc14.jar和mysql-connector-java-5.1.13-bin.jar. (有的也说需要添加commons-dbcp-1.4.jar,commons-pool-1.5.4.jar和commons-collections.jar,我做了测试,不用的.网上查了下,DBCP使用Jakarta-Commons Database Connection Pool,它依赖以下三个包:

jboss jndi配置部分参数详解

使用的是jboss7.1.1, jndi的配置在$JBOSS_HOME/standalone/configuration/standalone.xml中进行配置.配置jndi时有很多参数,解释下用到的一些参数: jndi-name The JNDI name under which the Datasource should be bound. datasource需要绑定的JNDI名称. use-java-context Boolean value indicating whether the

Tomcat8.0配置JNDI多数据源

jndi配置 :此种配置需要在Tomcat的server.xml中和context.xml中配置数据源,在项目中引用. 需要在tomcat下加入数据库连接的jar包,相关包(ojdbc14;c3p0数据源) ① .找到Tomcat的server.xml中GlobalNamingResources节点,在节点下加一个全局数据源 1 <!-- Global JNDI resources 2 Documentation at /docs/jndi-resources-howto.html 3 -->

jndi配置数据源

jndi(java Naming and DirectoryInterface,java命名和目录接口)是一组在Java应用中访问命名和目录服务的API. 命名服务将名称和对象联系起来,使得我们可以用名称访问对象.目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性. /** * 局部配置:在项目META-INFO下面新建context.xml文件<br/> * jndi(java Naming and * DirectoryInterface,java命名和目录接口)是一组在Jav

动态配置 JBOSS ( eap 6.2 ) 数据源

操作环境 windows + jboss eap 6.2 + MyEclipse 10.0 项目用的是jboss eap 6.2,作为Red公司升级后的eap稳定版. 相比之前的 AS 系列,不管是安全性和集群的稳定性,加上天然的出厂配置上都好了非常多. 对于开发人员来讲.省去了非常多工作. 配置远程接口 <interface name="management"> <inet-address value="${jboss.bind.address.manag

JNDI 配置:JBoss + MySQL

一.JNDI 名词解释 JNDI 是Java 命名和目录接口(Java Naming and Directory Interface,JNDI)的简称.从一开始就一直是 Java 2 平台企业版(JEE)的核心技术之一.在JMS,JMail,JDBC,EJB等技术中,就大量应用的这种技术. 命名服务:它提供了为给定的数据集创建一个标准名字的能力.它允许把名称同Java对象或资源关联起来,而不必指出对象或资源的物理ID.基本的名字操作包含在Context接口中. 目录服务:目录服务是一种特殊类型的

配置JBoss数据源

配置JBoss数据源,为什么要在JBoss中配置数据源?这其实是面向对象思想的一种体现:通过容器管理对数据库的访问. 最开始我们通过JDBC访问数据库,什么Connection.Command都由我们自己创建.但每次打开关闭数据库很消耗资源,于是出现了数据库连接池,提前建立好对数据库的连接,用的时候去连接池取,用完了送回到连接池.这样虽然解决了资源消耗问题,但连接过程仍需要手动干预.后来在用Spring整合Hibernate时,出现了用Spring的IOC容器管理Hibernate对数据库的访问