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

    JNDI(Java Naming Dependency Injection)是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。JNDI通过绑定的概念将对象和名称联系起来。 举例说明一下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.close();
}
catch(Exception e) {
 e.printStackTrace();
}
finally {
 if(conn!=null) {
   try {
     conn.close();
   } catch(SQLException e) {}
 }
}
   这种传统的做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序!
   没有JNDI的做法存在的问题:
   1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
   2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
   3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;
   解决办法:
   程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对JDBC驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。由此,就有了JNDI。
   
   用了JNDI之后的做法:
   首先,在在J2EE容器中配置JNDI参数,定义一个数据源,也就是JDBC引用参数,给这个数据源设置一个名称;然后在程序中,通过数据源名称引用数据源从而访问后台数据库。具体的做法如下:
   1、配置数据源(以Jboss为例)
   在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();
 ......
 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避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。
   
   Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
   JTA是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。
  JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC驱动程序的JTA支持极大地增强了数据访问能力。
  如果计划用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnections 是参与JTA事务的 JDBC 连接。
  您将需要用应用服务器的管理工具设置 XADataSource。(从应用服务器和 JDBC 驱动程序的文档中可以了解到相关的指导)
  J2EE应用程序用 JNDI 查询数据源。一旦应用程序找到了数据源对象,它就调用 javax.sql.DataSource.getConnection()以获得到数据库的连接。
  XA 连接与非 XA 连接不同。一定要记住 XA 连接参与了 JTA 事务。这意味着 XA 连接不支持 JDBC的自动提交功能。同时,应用程序一定不要对 XA 连接调用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback()。
   相反,应用程序应该使用 UserTransaction.begin()、 UserTransaction.commit() 和 UserTransaction.rollback()。
   
   三种Java事务差异:
   1、JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
   2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
   3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
   




该贴被tongfei.liao编辑于2017-2-24 15:57:33


既然选着了远方,便只顾风雨兼程!


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