[原创]熟练JNDI和JTA的相关内容_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2144 | 回复: 0   主题: [原创]熟练JNDI和JTA的相关内容        下一篇 
jun.wu
注册用户
等级:上尉
经验:535
发帖:24
精华:0
注册:1970-1-1
状态:离线
发送短消息息给jun.wu 加好友    发送短消息息给jun.wu 发消息
发表于: IP:您无权察看 2017-4-20 9:10:12 | [全部帖] [楼主帖] 楼主

JNDI相关内容

JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。现在JNDI已经成为J2EE的标准之一,所有的J2EE容器都必须提供一个JNDI的服务。


  开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。


不使用JNDI连接数据库的操作:

Connection conn=null;

try {

  Class.forName("com.mysql.jdbc.Driver",

                true, Thread.currentThread().getContextClassLoader());

  conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");

  /* 使用conn并进行SQL操作 */

  ......

  conn.close();

catch(Exception e) {

  e.printStackTrace();

finally {

  if(conn!=null) {

    try {

      conn.close();

    } catch(SQLException e) {}

  }

}

没有JNDI的做法存在的问题:

1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;

2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;

3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;


解决办法:

程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。由此,就有了JNDI。


用了JNDI之后的做法:

首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后,在程序中,通过数据源名称引用数据源从而访问后台数据库。

具体操作如下(以JBoss为例):

1、配置数据源

在JBoss的 D:/jboss420GA/docs/examples/jca 文件夹下面,有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下,如 D:/jboss420GA/server/default/deploy。

修改 mysql-ds.xml 文件的内容,使之能通过JDBC正确访问你的MySQL数据库,如下:

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

<datasources>

<local-tx-datasource>

    <jndi-name>MySqlDS</jndi-name>

    <connection-url>jdbc:mysql://localhost:3306/lw</connection-url>

    <driver-class>com.mysql.jdbc.Driver</driver-class>

    <user-name>root</user-name>

    <password>rootpassword</password>

<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>

    <metadata>

       <type-mapping>mySQL</type-mapping>

    </metadata>

</local-tx-datasource>

</datasources>


这里,定义了一个名为MySqlDS的数据源,其参数包括JDBC的URL,驱动类名,用户名及密码等。


2、在程序中引用数据源:

Connection conn=null;

try {

  Context ctx=new InitialContext();

  Object datasourceRef=ctx.lookup("java:MySqlDS"); //引用数据源

  DataSource ds=(Datasource)datasourceRef;

  conn=ds.getConnection();

  /* 使用conn进行数据库SQL操作 */

  ......

  c.close();

catch(Exception e) {

  e.printStackTrace();

finally {

  if(conn!=null) {

    try {

      conn.close();

    } catch(SQLException e) { }

  }

}

直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。

在系统部署后,如果数据库的相关参数变更,只需要重新配置 mysql-ds.xml 修改其中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。



JTA介绍


JTA 也叫Java事物API和Java事物服务为 J2EE 平台提供了分布式事务服务,它隔离了事务与底层的资源,实现了透明的事务管理方式。

一个分布式事务(distributed transaction)包括一个事务管理器(transaction manager)和一个或多个资源管理器(resource manager)。


一个资源管理器(resource manager)是任意类型的持久化数据存储。


用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。XAConnection s 是参与 JTA 事务的 JDBC 连接。


XA连接区别于非XA连接。XA连接是一个JTA事务中的参与者。这就意味着XA连接不支持JDBC的自动提交特性。也就是说应用程序不必在XA连接上调用java.sql.Connection.commit()或java.sql.Connection.rollback()。相反,应用程序应该使用UserTransaction.begin()、UserTransaction.commit()和UserTransaction.rollback().

事务管理器(transaction manager)承担着所有事务参与单元者的相互通讯的责任。





赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论