﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-学历代表过去，能力代表现在，学习力代表未来！-文章分类-DataBase</title><link>http://www.blogjava.net/ljc-java/category/50294.html</link><description>模仿中成长，在创新中成功！</description><language>zh-cn</language><lastBuildDate>Mon, 05 Dec 2011 07:31:56 GMT</lastBuildDate><pubDate>Mon, 05 Dec 2011 07:31:56 GMT</pubDate><ttl>60</ttl><item><title>JAVA事务,JTA,JDBC,JDO,DAO,JNDI概念(转载) </title><link>http://www.blogjava.net/ljc-java/articles/365595.html</link><dc:creator>小罗</dc:creator><author>小罗</author><pubDate>Mon, 05 Dec 2011 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/ljc-java/articles/365595.html</guid><wfw:comment>http://www.blogjava.net/ljc-java/comments/365595.html</wfw:comment><comments>http://www.blogjava.net/ljc-java/articles/365595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljc-java/comments/commentRss/365595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljc-java/services/trackbacks/365595.html</trackback:ping><description><![CDATA[<strong style="font-weight: bold"><span style="font-size: small">一、什么是</span></strong><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">Java</span></strong></span><strong style="font-weight: bold"><span style="font-size: small">事务</span></strong><div> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">通常的观念认为，事务仅与数据库相关。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br /></span></span><span style="font-size: small">事务必须服从</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">ISO/IEC</span></span><span style="font-size: small">所制定的</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">ACID</span></span><span style="font-size: small">原则。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">ACID</span></span><span style="font-size: small">是原子性（</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">atomicity</span></span><span style="font-size: small">）、一致性（</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">consistency</span></span><span style="font-size: small">）、隔离性（</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">isolation</span></span><span style="font-size: small">）和持久性（</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">durability</span></span><span style="font-size: small">）的缩写。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">一致性表示当事务执行失败时，所有被该事务影响的数据都应该恢复到事务执行前的状态。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">隔离性表示在事务执行过程中对数据的修改，在事务提交之前对其他事务不可见。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">持久性表示已提交的数据在事务执行失败时，数据的状态都应该正确。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-family: 'Times New Roman', serif"><span style="font-size: small"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: small">通俗的理解，事务是一组原子操作单元，从数据库角度说，就是一组</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">SQL</span></span><span style="font-size: small">指令，要么全部执行成功，若因为某个原因其中一条指令执行有错误，则撤销先前执行过的所有指令。更简答的说就是：要么全部执行成功，要么撤销不执行。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-family: 'Times New Roman', serif"><span style="font-size: small"><br /></span></span><span style="font-size: small">既然事务的概念从数据库而来，那</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">Java</span></span><span style="font-size: small">事务是什么？之间有什么联系？</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;&nbsp;</span></span><span style="font-size: small">实际上，一个</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">Java</span></span><span style="font-size: small">应用系统，如果要操作数据库，则通过</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JDBC</span></span><span style="font-size: small">来实现的。增加、修改、删除都是通过相应方法间接来实现的，事务的控制也相应转移到</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">Java</span></span><span style="font-size: small">程序代码中。因此，数据库操作的事务习惯上就称为</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">Java</span></span><span style="font-size: small">事务。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong style="font-weight: bold"><span style="font-size: small">二、为什么需要事务</span></strong></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">事务是为解决数据安全操作提出的，事务控制实际上就是控制数据的安全访问。具一个简单例子：比如银行转帐业务，账户</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">A</span></span><span style="font-size: small">要将自己账户上的</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">1000&nbsp;</span></span><span style="font-size: small">元转到</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">B</span></span><span style="font-size: small">账户下面，</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">A</span></span><span style="font-size: small">账户余额首先要减去</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">1000</span></span><span style="font-size: small">元，然后</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">B</span></span><span style="font-size: small">账户要增加</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">1000</span></span><span style="font-size: small">元。假如在中间网络出现了问题，</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">A</span></span><span style="font-size: small">账户减去</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">1000</span></span><span style="font-size: small">元已经结束，</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">B</span></span><span style="font-size: small">因为网络中断而操作失败，那么整个业务失败，必须做出控制，要求</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">A</span></span><span style="font-size: small">账户转帐业务撤销。这才能保证业务的正确性，完成这个操走就需要事务，将</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">A</span></span><span style="font-size: small">账户资金减少和</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">B</span></span><span style="font-size: small">账户资金增加方到一个事务里面，要么全部执行成功，要么操作全部撤销，这样就保持了数据的安全性。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-family: 'Times New Roman', serif"><span style="font-size: small"><br /></span><strong style="font-weight: bold"><span style="font-size: small">三、</span></strong></span><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">Java</span></strong></span><strong style="font-weight: bold"><span style="font-size: small">事务的类型</span></strong><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">&nbsp;</span></strong><span style="font-size: small"><br />&nbsp;&nbsp;&nbsp; Java&nbsp;</span></span><span style="font-size: small">事务的类型有三种：</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JDBC</span></span><span style="font-size: small">事务、</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JTA(Java Transaction API)</span></span><span style="font-size: small">事务、容器事务。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br /></span><strong style="font-weight: bold"><span style="font-size: small">1</span></strong></span><strong style="font-weight: bold"><span style="font-size: small">、</span></strong><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">JDBC</span></strong></span><strong style="font-weight: bold"><span style="font-size: small">事务</span></strong><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">&nbsp;</span></strong><span style="font-size: small"><br />JDBC&nbsp;</span></span><span style="font-size: small">事务是用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;Connection&nbsp;</span></span><span style="font-size: small">对象控制的。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JDBC Connection&nbsp;</span></span><span style="font-size: small">接口</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">( java.sql.Connection )</span></span><span style="font-size: small">提供了两种事务模式：自动提交和手工提交。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;java.sql.Connection&nbsp;</span></span><span style="font-size: small">提供了以下控制事务的方法：</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">public void setAutoCommit(boolean)&nbsp;<br />public boolean getAutoCommit()&nbsp;<br />public void commit()&nbsp;<br />public void rollback()&nbsp;<br /></span><span style="font-size: small">使用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JDBC&nbsp;</span></span><span style="font-size: small">事务界定时，您可以将多个</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;SQL&nbsp;</span></span><span style="font-size: small">语句结合到一个事务中。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JDBC&nbsp;</span></span><span style="font-size: small">事务的一个缺点是事务的范围局限于一个数据库连接。一个</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JDBC&nbsp;</span></span><span style="font-size: small">事务不能跨越多个数据库。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br /></span><strong style="font-weight: bold"><span style="font-size: small">2</span></strong></span><strong style="font-weight: bold"><span style="font-size: small">、</span></strong></span><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">JTA(Java Transaction  API)</span></strong></span><strong style="font-weight: bold"><span style="font-size: small">事务</span></strong><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br />&nbsp;&nbsp;&nbsp;  JTA&nbsp;</span></span><span style="font-size: small">是一种高层的，与实现无关的，与协议无关的</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">API</span></span><span style="font-size: small">，应用程序和应用服务器可以使用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JTA</span></span><span style="font-size: small">来访问事务。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br />JTA</span></span><span style="font-size: small">允许应用程序执行分布式事务处理</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">--</span></span><span style="font-size: small">在两个或多个网络计算机资源上访问并且更新数据，这些数据可以分布在多个数据库上。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JDBC</span></span><span style="font-size: small">驱动程序的</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JTA</span></span><span style="font-size: small">支持极大地增强了数据访问能力。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br /></span></span><span style="font-size: small">如果计划用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JTA&nbsp;</span></span><span style="font-size: small">界定事务，那么就需要有一个实现</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;javax.sql.XADataSource&nbsp;</span></span><span style="font-size: small">、</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;javax.sql.XAConnection&nbsp;</span></span><span style="font-size: small">和</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;javax.sql.XAResource</span></span><span style="font-size: small">接口的</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JDBC&nbsp;</span></span><span style="font-size: small">驱动程序。一个实现了这些接口的驱动程序将可以参与</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JTA&nbsp;</span></span><span style="font-size: small">事务。一个</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;XADataSource&nbsp;</span></span><span style="font-size: small">对象就是一个</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">XAConnection&nbsp;</span></span><span style="font-size: small">对象的工厂。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;XAConnection  s&nbsp;</span></span><span style="font-size: small">是参与</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JTA&nbsp;</span></span><span style="font-size: small">事务的</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JDBC&nbsp;</span></span><span style="font-size: small">连接。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br /></span></span><span style="font-size: small">您将需要用应用服务器的管理工具设置</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;XADataSource&nbsp;</span></span><span style="font-size: small">。从应用服务器和</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JDBC&nbsp;</span></span><span style="font-size: small">驱动程序的文档中可以了解到相关的指导。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br />J2EE&nbsp;</span></span><span style="font-size: small">应用程序用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JNDI&nbsp;</span></span><span style="font-size: small">查询数据源。一旦应用程序找到了数据源对象，它就调用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;javax.sql.DataSource.getConnection()&nbsp;</span></span><span style="font-size: small">以获得到数据库的连接。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;  XA&nbsp;</span></span><span style="font-size: small">连接与非</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;XA&nbsp;</span></span><span style="font-size: small">连接不同。一定要记住</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;XA&nbsp;</span></span><span style="font-size: small">连接参与了</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JTA&nbsp;</span></span><span style="font-size: small">事务。这意味着</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;XA&nbsp;</span></span><span style="font-size: small">连接不支持</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;JDBC&nbsp;</span></span><span style="font-size: small">的自动提交功能。同时，应用程序一定不要对</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;XA&nbsp;</span></span><span style="font-size: small">连接调用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;java.sql.Connection.commit()&nbsp;</span></span><span style="font-size: small">或者</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;java.sql.Connection.rollback()&nbsp;</span></span><span style="font-size: small">。相反，应用程序应该使用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;UserTransaction.begin()</span></span><span style="font-size: small">、</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;UserTransaction.commit()&nbsp;</span></span><span style="font-size: small">和</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;serTransaction.rollback()&nbsp;</span></span><span style="font-size: small">。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">3</span></strong></span><strong style="font-weight: bold"><span style="font-size: small">、容器事务</span></strong><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">&nbsp;</span></strong><span style="font-size: small"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: small">容器事务主要是</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">J2EE</span></span><span style="font-size: small">应用服务器提供的，容器事务大多是基于</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JTA</span></span><span style="font-size: small">完成，这是一个基于</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JNDI</span></span><span style="font-size: small">的，相当复杂的</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">API</span></span><span style="font-size: small">实现。相对编码实现</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JTA&nbsp;</span></span><span style="font-size: small">事务管理，我们可以通过</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">EJB</span></span><span style="font-size: small">容器提供的容器事务管理机制（</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">CMT</span></span><span style="font-size: small">）完成同一个功能，这项功能由</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">J2EE</span></span><span style="font-size: small">应用服务器提供。这使得我们可以简单的指定将哪个方法加入事务，一旦指定，容器将负责事务管理任务。这是我们土建的解决方式，因为通过这种方式我们可以将事务代码排除在逻辑编码之外，同时将所有困难交给</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;J2EE</span></span><span style="font-size: small">容器去解决。使用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">EJB CMT</span></span><span style="font-size: small">的另外一个好处就是程序员无需关心</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JTA API</span></span><span style="font-size: small">的编码，不过，理论上我们必须使用</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">EJB</span></span><span style="font-size: small">。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br /></span></span><strong style="font-weight: bold"><span style="font-size: small">四、三种事务差异</span></strong><span style="font-family: 'Times New Roman', serif"><strong style="font-weight: bold"><span style="font-size: small">&nbsp;</span></strong><span style="font-size: small"><br />1</span></span><span style="font-size: small">、</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JDBC</span></span><span style="font-size: small">事务控制的局限性在一个数据库连接内，但是其使用简单。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br />2</span></span><span style="font-size: small">、</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">JTA</span></span><span style="font-size: small">事务的功能强大，事务可以跨越多个数据库或多个</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">DAO</span></span><span style="font-size: small">，使用也比较复杂。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br />3</span></span><span style="font-size: small">、容器事务，主要指的是</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">J2EE</span></span><span style="font-size: small">应用服务器提供的事务管理，局限于</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">EJB</span></span><span style="font-size: small">应用使用。</span><span style="font-family: 'Times New Roman', serif"><span style="font-size: small">&nbsp;<br /></span></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong style="font-weight: bold"><span style="color: #0000ff"><span style="font-size: small">JTA</span></span></strong></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span><span style="font-size: small">Java事务API（JTA；Java Transaction  API）和它的同胞Java事务服务(JTS；Java Transaction  Service)，为J2EE平台提供了分布式事务服务。一个分布式事务（distributed transaction）包括一个事务管理器（transaction  manager）和一个或多个资源管理器(resource manager)。一个资源管理器（resource  manager）是任意类型的持久化数据存储。事务管理器（transaction  manager）承担着所有事务参与单元者的相互通讯的责任。下图显示了事务管理器和资源管理的间的关系。</span></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者，而一个JDBC事务则被限定在一个单一的数据库连接。</span><span style="font-size: small">下列任一个Java平台的组件都可以参与到一个JTA事务中：</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">JDBC连接</span></p> <ul style="padding-bottom: 0px; margin: 0px 0px 1.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px"><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">JDO PersistenceManager 对象</span>  </li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">JMS 队列</span>  </li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">JMS 主题</span>  </li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">企业JavaBeans（EJB）</span>  </li><li style="padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">一个用J2EE Connector Architecture 规范编译的资源分配器。</span>  </li></ul> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="color: #0000ff"><strong style="font-weight: bold"><span style="font-size: small">DAO</span></strong></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span><span style="font-size: small">DAO是Data Access  Object数据访问接口，数据访问：顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。对数据库进行CURD（增删查改操作）。</span></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">　　在核心</span><a style="color: #136ec2; text-decoration: underline" href="http://baike.baidu.com/view/1507.htm" target="_blank"><span style="font-size: small">J2EE</span></a><span style="font-size: small">模式中是这样介绍DAO模式的：为了建立一个健壮的J2EE应用，应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说，就是建立一个接口，接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中，当需要和数据源进行交互的时候则使用这个接口，并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="color: #0000ff"><strong style="font-weight: bold"><span style="font-size: small">JDBC</span></strong></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span><span style="font-size: small">JDBC（Java Data Base  Connectivity,java数据库连接）是一种用于执行SQL语句的Java  API，可以为多种关系数据库提供统一访问，它由一组用Java语言编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API，据此可以构建更高级的工具和接口，使数据库开发人员能够用纯  Java API 编写数据库应用程序，同时，JDBC也是个商标名。</span></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">有了JDBC，向各种关系数据发送SQL语句就是一件很容易的事。换言之，有了JDBC  API，就不必为访问Sybase数据库专门写一个程序，为访问Oracle数据库又专门写一个程序，或为访问Informix数据库又编写另一个程序等等，程序员只需用JDBC  API写一个程序就够了，它可向相应数据库发送SQL调用。同时，将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序，只须写一遍程序就可以让它在任何平台上运行，这也是Java语言&#8220;编写一次，处处运行&#8221;的优势。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span><span style="font-size: small">简单地说，JDBC 可做三件事：与数据库建立连接、发送  操作数据库的语句并处理结果。</span></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="color: #0000ff"><strong style="font-weight: bold"><span style="font-size: small">JDO</span></strong></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span><span style="font-size: small">JDO(Java Data Object  )是一个JAVA用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储，因此对开发人员来说，存储数据对象完全不需要额外的代码（如JDBC  API的使用）。这些繁琐的例行工作已经转移到JDO产品提供商身上，使开发人员解脱出来，从而集中时间和精力在业务逻辑上。另外，JDO很灵活，因为它可以在任何数据底层上运行。JDBC只是面向关系数据库（RDBMS）JDO更通用，提供到任何数据底层的存储功能，比如关系数据库、文件、XML以及对象数据库（ODBMS）等等，使得应用可移植性更强。</span></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong style="font-weight: bold"><span style="color: #0000ff"><span style="font-size: small">JNDI</span></span></strong></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span><span style="font-size: small">英文全称是:Java Naming and Directory  Interface</span></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">术语解释：一组帮助做多个命名和目录服务接口的API。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">JNDI(Java Naming and Directory  Interface)是SUN公司提供的一种标准的Java命名系统接口，JNDI提供统一的客户端API，通过不同的访问提供者接口JNDI  SPI的实现，由管理者将JNDI  API映射为特定的命名服务和目录系统，使得Java应用程序可以和这些命名服务和目录服务之间进行交互。集群JNDI实现了高可靠性JNDI[8]，通过服务器的集群，保证了JNDI的负载平衡和错误恢复。在全局共享的方式下，集群中的一个应用服务器保证本地JNDI树的独立性，并拥有全局的JNDI树。每个应用服务器在把部署的服务对象绑定到自己本地的JNDI树的同时，还绑定到一个共享的全局JNDI树，实现全局JNDI和自身JNDI的联系。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p>&nbsp;</p> <div style="line-height: 14px; height: 14px; font-size: 12px"><span style="line-height: normal; font-size: small">JNDI(Java Naming and Directory  Interface)是一个应用程序设计的API，为开发人员提供了查找和访问各种</span></div> <p>&nbsp;</p> <div style="line-height: 14px; height: 14px; font-size: 12px"><span style="line-height: normal; font-size: small">命名和目录服务的通用、统一的接口，类似JDBC都是构建在抽象层上。</span></div> <p>&nbsp;</p> <div style="line-height: 14px; height: 14px; font-size: 12px"><span style="line-height: normal; font-size: small">JNDI可访问的现有的目录及服务有：DNS、XNam  、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、  CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、<div><span style="line-height: normal; font-size: small"><span style="line-height: normal; font-size: small">DSML v1&amp;v2、NIS。</span></span></div></span></div> <p>&nbsp;</p> <div style="line-height: 14px; height: 14px; font-size: 12px"></div><p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><br /></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small"><strong style="font-weight: bold">JNDI与JDBC</strong></span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">JNDI提供了一种统一的方式，可以用在网络上查找和访问服务。通过指定一个资源名称，该名称对应于数据库或命名服务中的一个记录，同时返回数据库连接建立所必须的信息。</span></p> <p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-size: small">JNDI主要有两部分组成：应用程序编辑接口和服务供应商接口。应用程序编程接口提供了Java应用程序访问各种命名和目录服务的功能，服务供应商接口提供了任意一种服务的供应商使用的功能。</span></p></div><img src ="http://www.blogjava.net/ljc-java/aggbug/365595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljc-java/" target="_blank">小罗</a> 2011-12-05 15:17 <a href="http://www.blogjava.net/ljc-java/articles/365595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>