<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>北京广元顺天科技咨询中心</title>
	<atom:link href="http://www.nonetsky.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.nonetsky.com</link>
	<description>秉承专业技能，汇聚业界精英，致力于提供专业IT行业软件服务、企业信息化咨询以及信息安全服务</description>
	<pubDate>Sun, 31 Jan 2010 01:20:33 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.2</generator>
	<language>en</language>
			<item>
		<title>Oracle调优(入门与提高)</title>
		<link>http://www.nonetsky.com/course/oracle-database/oracletuning.html</link>
		<comments>http://www.nonetsky.com/course/oracle-database/oracletuning.html#comments</comments>
		<pubDate>Sun, 31 Jan 2010 01:20:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Oracle数据库]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/?p=212</guid>
		<description><![CDATA[         在过去的十年中， Oracle 已经成为世界上最专业的数据库之一。对于 IT 专家来说，就是要确保利用 Oracle 的强大特性来提高他们公司的生产力。最有效的方法之一是通过 Oracle 调优... ]]></description>
			<content:encoded><![CDATA[<p>         在过去的十年中， Oracle 已经成为世界上最专业的数据库之一。对于 IT 专家来说，就是要确保利用 Oracle 的强大特性来提高他们公司的生产力。最有效的方法之一是通过 Oracle 调优。它有大量的调整参数和<span class="t_tag" onclick="tagshow(event)">技术</span>来改进你的 Oracle 数据库的性能。<br />
Oracle 调优是一个复杂的主题。关于调优可以写整整一本书，不过，为了改善 Oracle 数据库的性能，有一些基本的概念是每个 Oracle DBA 都应该遵从的。<br />
　　 在这篇简介中，我们将简要地介绍以下的 Oracle 主题：<br />
　　&#8211; 外部调整：我们应该记住 Oracle 并不是单独运行的。因此我们将查看一下通过调整 Oracle 服务器以得到高的性能。<br />
　　&#8211;Row re-sequencing 以减少磁盘 I/O ：我们应该懂得 Oracle 调优最重要的目标是减少 I/O 。<br />
　　&#8211;Oracle SQL 调整。 Oracle SQL 调整是 Oracle 调整中最重要的领域之一，只要通过一些简单的 SQL 调优规则就可以大幅度地提升 SQL 语句的性能，这是一点都不奇怪的。<br />
　　&#8211; 调整 Oracle 排序：排序对于 Oracle 性能也是有很大影响的。<br />
　　&#8211; 调整 Oracle 的竞争：表和索引的参数设置对于 UPDATE 和 INSERT 的性能有很大的影响。</p>
<p>　　 我们首先从调整 Oracle 外部的环境开始。如果内存和 CPU 的资源不足的话，任何的 Oracle 调整都是没有帮助的。</p>
<p>　　外部的性能问题<br />
　　<br />
　　Oracle 并不是单独运行的。 Oracle 数据库的性能和外部的环境有很大的关系。这些外部的条件包括有：<br />
　　 ． CPU&#8211;CPU 资源的不足令查询变慢。当查询超过了 Oracle 服务器的 CPU 性能时，你的数据库性能就受到 CPU 的限制。<br />
　　 ．内存 &#8212; 可用于 Oralce 的内存数量也会影响 SQL 的性能，特别是在数据缓冲和内存排序方面。<br />
　　 ．<span class="t_tag" onclick="tagshow(event)">网络</span> &#8212; 大量的 Net8 通信令 SQL 的性能变慢。<br />
　　 许多新手都错误的认为应该首先调整 Oracle 数据库，而不是先确认外部资源是否足够。实际上，如果外部环境出现瓶颈，再多的 Oracle 调整都是没有帮助的。<br />
　　 在检查 Oracle 的外部环境时，有两个方面是需要注意的：<br />
　　1 、当运行队列的数目超过服务器的 CPU 数量时，服务器的性能就会受到 CPU 的限制。补救的方法是为服务器增加额外的 CPU 或者关闭需要很多处理资源的组件，例如 Oracle Parallel Query 。<br />
　　2 、内存分页。当内存分页时，内存容量已经不足，而内存页是与磁盘上的交换区进行交互的。补救的方法是增加更多的内存，减少 Oracle SGA 的大小，或者关闭 Oracle 的多线程服务器。<br />
　　 可以使用各种标准的服务器<span class="t_tag" onclick="tagshow(event)">工具</span>来得到服务器的统计数据，例如 vmstat,glance,top 和 sar 。 DBA 的目标是确保数据库服务器拥有足够的 CPU 和内存资源来处理 Oracle 的请求。<br />
　　 以下让我们来看一下 Oracle 的 row-resequencing 是如何能够极大地减少磁盘 I/O 的。</p>
<p>　　Row-resequencing （行的重新排序）<br />
　　<br />
　　就象我们上面提到的，有经验的 Oracle DBA 都知道 I/O 是响应时间的最大组成部分。其中磁盘 I/O 特别厉害，因为当 Oracle 由磁盘上的一个数据<span class="t_tag" onclick="tagshow(event)">文件</span>得到一个数据块时，读的进程就必须等待物理 I/O 操作完成。磁盘操作要比数据缓冲慢 10,000 倍。因此，如果可以令 I/O 最小化，或者减少由于磁盘上的文件竞争而带来的瓶颈，就可以大大地改善 Oracle 数据库的性能。<br />
　　 如果<span class="t_tag" onclick="tagshow(event)">系统</span>响应很慢，通过减少磁盘 I/O 就可以有一个很快的改善。如果在一个事务中通过按一定的范围搜索 primary-key 索引来访问表，那么重新以 CTAS 的方法组织表将是你减少 I/O 的首要策略。通过在物理上将行排序为和 primary-key 索引一样的顺序，就可以加快获得数据的速度。<br />
　　 就象磁盘的负载平衡一样，行的重新排序也是很简单的，而且也很快。通过与其它的 DBA <span class="t_tag" onclick="tagshow(event)">管理</span><span class="t_tag" onclick="tagshow(event)">技巧</span>一起使用，就可以在高 I/O 的系统中大大地减少响应的时间。<br />
　　 在高容量的在线事务处理环境中（ online transaction processing ， OLTP ），数据是由一个 primary 索引得到的，重新排序表格的行就可以令连续块的顺序和它们的 primary 索引一样，这样就可以在索引驱动的表格查询中，减少物理 I/O 并且改善响应时间。这个技巧仅在应用选择多行的时候有用，或者在使用索引范围搜索和应用发出多个查询来得到连续的 key 时有效。对于随机的唯一 primary-key （主键）的访问将不会由行重新排序中得到好处。<br />
　　 让我们看一下它是如何工作的。考虑以下的一个 SQL 的查询，它使用一个索引来得到 100 行：<br />
selectsalaryfromemployeewherelast_name like &#8216;B%&#8217;;<br />
这个查询将会使用 last_name_index ，搜索其中的每一行来得到目标行。这个查询将会至少使用 100 次物理磁盘的读取，因为 employee 的行存放在不同的数据块中。<br />
　　 不过，如果表中的行已经重新排序为和 last_name_index 的一样，同样的查询又会怎样处理呢？我们可以看到这个查询只需要三次的磁盘 I/O 就读完全部 100 个员工的<span class="t_tag" onclick="tagshow(event)">资料</span>（一次用作索引的读取，两次用作数据块的读取），减少了 97 次的块读取。<br />
　　 重新排序带来的性能改善的程度在于在你开始的时候行的乱序性如何，以及你需要由序列中访问多少行。至于一个表中的行与索引的排序键的匹配程度，可以查看数据字典中的 dba_indexes 和 dba_tables 视图得到。<br />
　　 在 dba_indexes 的视图中，查看 clustering_factor 列。如果 clustering_factor 的值和表中的块数目大致一样，那么你的表和索引的顺序是一样的。不过，如果 clustering_factor 的值接近表中的行数目，那就表明表格中的行和索引的顺序是不一样的。<br />
　　 行重新排序的作用是不可以小看的。在需要进行大范围的索引搜索的大表中，行重新排序可以令查询的性能提高三倍。<br />
　　 一旦你已经决定重新排序表中的行，你可以使用以下的工具之一来重新组织表格。<br />
　　. 使用 Oracle 的 Create Table As Select (CTAS) 语法来拷贝表格<br />
　　. Oracle9i 自带的表格重新组织工具<br />
　　<br />
　　 以下，我们来看以下 SQL 语句的调优。</p>
<p>　　SQL 调优<br />
　　Oracle 的 SQL 调优是一个复杂的主题，甚至是需要整本书来介绍 Oracle SQL 调优的细微差别。不过有一些基本的规则是每个 Oracle DBA 都需要跟从的，这些规则可以改善他们系统的性能。 SQL 调优的目标是简单的：<br />
　　. 消除不必要的大表全表搜索：不必要的全表搜索导致大量不必要的 I/O ，从而拖慢整个数据库的性能。调优专家首先会根据查询返回的行数目来评价 SQL 。在一个有序的表中，如果查询返回少于 40% 的行，或者在一个无序的表中，返回少于 7% 的行，那么这个查询都可以调整为使用一个索引来代替全表搜索。对于不必要的全表搜索来说，最常见的调优方法是增加索引。可以在表中加入标准的 B 树索引，也可以加入 bitmap 和基于函数的索引。要决定是否消除一个全表搜索，你可以仔细检查索引搜索的 I/O 开销和全表搜索的开销，它们的开销和数据块的读取和可能的并行执行有关，并将两者作对比。在一些情况下，一些不必要的全表搜索的消除可以通过强制使用一个 index 来达到，只需要在 SQL 语句中加入一个索引的提示就可以了。<br />
　　. 在全表搜索是一个最快的访问方法时，将小表的全表搜索放到缓存中，调优专家应该确保有一个专门的数据缓冲用作行缓冲。在 Oracle7 中，你可以使用 alter table xxx cache 语句，在 Oracle8 或以上，小表可以被强制为放到 KEEP 池中缓冲。<br />
　　. 确保最优的索引使用 ：对于改善查询的速度，这是特别重要的。有时 Oracle 可以选择多个索引来进行查询，调优专家必须检查每个索引并且确保 Oracle 使用正确的索引。它还包括 bitmap 和基于函数的索引的使用。<br />
　　. 确保最优的 JOIN 操作：有些查询使用 NESTED LOOP join 快一些，有些则是 HASH join 快一些，另外一些则是 sort-merge join 更快。<br />
　　 这些规则看来简单，不过它们占 SQL 调优任务的 90% ，并且它们也无需完全懂得 Oracle SQL 的内部运作。以下我们来简单概览以下 Oracle SQL 的优化。<br />
　　 我们首先简要查看 Oracle 的排序，并且看一看排序操作是如何影响性能的。</p>
<p>　　 调整 Oracle 的排序操作<br />
　　 排序是 SQL 语法中一个小的方面，但很重要，在 Oracle 的调整中，它常常被忽略。当使用 create index 、 ORDER BY 或者 GROUP BY 的语句时， Oracle 数据库将会自动执行排序的操作。通常，在以下的情况下 Oracle 会进行排序的操作：<br />
　　 使用 Order by 的 SQL 语句<br />
　　 使用 Group by 的 SQL 语句<br />
　　 在创建索引的时候<br />
　　 进行 table join 时，由于现有索引的不足而导致 SQL 优化器调用 MERGE SORT<br />
　　 当与 Oracle 建立起一个 session 时，在内存中就会为该 session 分配一个私有的排序区域。如果该连接是一个专用的连接 (dedicated connection) ，那么就会根据 init.ora 中 sort_area_size 参数的大小在内存中分配一个 Program Global Area (PGA) 。如果连接是通过多线程服务器建立的，那么排序的空间就在 large_pool 中分配。不幸的是，对于所有的 session ，用做排序的内存量都必须是一样的，我们不能为需要更大排序的操作分配额外的排序区域。因此，设计者必须作出一个平衡，在分配足够的排序区域以避免发生大的排序任务时出现磁盘排序（ disk sorts ）的同时，对于那些并不需要进行很大排序的任务，就会出现一些浪费。当然，当排序的空间需求超出了 sort_area_size 的大小时，这时将会在 TEMP 表空间中分页进行磁盘排序。磁盘排序要比内存排序大概慢 14,000 倍。<br />
　　 上面我们已经提到，私有排序区域的大小是有 init.ora 中的 sort_area_size 参数决定的。每个排序所占用的大小由 init.ora 中的 sort_area_retained_size 参数决定。当排序不能在分配的空间中完成时，就会使用磁盘排序的方式，即在 Oracle <span class="t_tag" onclick="tagshow(event)">实例</span>中的临时表空间中进行。<br />
　　 磁盘排序的开销是很大的，有几个方面的原因。首先，和内存排序相比较，它们特别慢；而且磁盘排序会消耗临时表空间中的资源。 Oracle 还必须分配缓冲池块来保持临时表空间中的块。无论什么时候，内存排序都比磁盘排序好，磁盘排序将会令任务变慢，并且会影响 Oracle 实例的当前任务的执行。还有，过多的磁盘排序将会令 free buffer waits 的值变高，从而令其它任务的数据块由缓冲中移走。<br />
　　 接着，让我们看一下 Oracle 的竞争，并且看一下表的存储参数的设置是如何影响 SQL UPDATE 和 INSERT 语句的性能的。</p>
<p>调整 Oracle 的竞争<br />
　　Oracle 的其中一个优点时它可以管理每个表空间中的自由空间。 Oracle 负责处理表和索引的空间管理，这样就可以让我们无需懂得 Oracle 的表和索引的内部运作。不过，对于有经验的 Oracle 调优专家来说，他需要懂得 Oracle 是如何管理表的 extent 和空闲的数据块。对于调整拥有高的 insert 或者 update 的系统来说，这是非常重要的。<br />
　　 要精通对象的调整，你需要懂得 freelists 和 freelist 组的行为，它们和 pctfree 及 pctused 参数的值有关。这些知识对于企业资源计划（ ERP ）的应用是特别重要的，因为在这些应用中，不正确的表设置通常是 DML 语句执行慢的原因。<br />
　　 对于初学者来说，最常见的错误是认为默认的 Oracle 参数对于所有的对象都是最佳的。除非磁盘的消耗不是一个问题，否则在设置表的 pctfree 和 pctused 参数时，就必须考虑平均的行长和数据库的块大小，这样空的块才会被有效地放到 freelists 中。当这些设置不正确时，那些得到的 freelists 也是 &#8220;dead&#8221; 块，因为它们没有足够的空间来存储一行，这样将会导致明显的处理延迟。<br />
Freelists 对于有效地重新使用 Oracle 表空间中的空间是很重要的，它和 pctfree 及 pctused 这两个存储参数的设置直接相关。通过将 pctused 设置为一个高的值，这时数据库就会尽快地重新使用块。不过，高性能和有效地重新使用表的块是对立的。在调整 Oracle 的表格和索引时，需要认真考虑究竟需要高性能还是有效的空间重用，并且据此来设置表的参数。以下我们来看一下这些 freelists 是如何影响 Oracle 的性能的。<br />
　　 当有一个请求需要插入一行到表格中时， Oracle 就会到 freelist 中寻找一个有足够的空间来容纳一行的块。你也许知道， freelist 串是放在表格或者索引的第一个块中，这个块也被称为段头（ segment header ）。 pctfree 和 pctused 参数的唯一目的就是为了控制块如何在 freelists 中进出。虽然 freelist link 和 unlink 是简单的 Oracle 功能，不过设置 freelist link (pctused) 和 unlink (pctfree) 对 Oracle 的性能确实有影响。<br />
　　 由 DBA 的基本知识知道， pctfree 参数是控制 freelist un-links 的（即将块由 freelists 中移除）。设置 pctfree=10 意味着每个块都保留 10% 的空间用作行扩展。 pctused 参数是控制 freelist re-links 的。设置 pctused=40 意味着只有在块的使用低于 40% 时才会回到表格的 freelists 中。<br />
　　 许多新手对于一个块重新回到 freelists 后的处理都有些误解。其实，一旦由于一个删除的操作而令块被重新加入到 freelist 中，它将会一直保留在 freelist 中即使空间的使用超过了 60% ，只有在到达 pctfree 时才会将数据块由 freelist 中移走。</p>
<p>　　 表格和索引存储参数设置的要求总结<br />
　　 以下的一些规则是用来设置 freelists, freelist groups, pctfree 和 pctused 存储参数的。你也知道， pctused 和 pctfree 的值是可以很容易地通过 alter table <span class="t_tag" onclick="tagshow(event)">命令</span>修改的，一个好的 DBA 应该知道如何设置这些参数的最佳值。<br />
　　 有效地使用空间和高性能之间是有矛盾的，而表格的存储参数就是控制这个方面的矛盾：<br />
. 对于需要有效地重新使用空间，可以设置一个高的 pctused 值，不过副作用是需要额外的 I/O 。一个高的 pctused 值意味着相对满的块都会放到 freelist 中。因此，这些块在再次满之前只可以接受几行记录，从而导致更多的 I/O 。<br />
. 追求高性能的话，可以将 pctused 设置为一个低的值，这意味着 Oracle 不会将数据块放到 freelists 中直到它几乎是空的。那么块将可以在满之前接收更多的行，因此可以减少插入操作的 I/O 。要记住 Oracle 扩展新块的性能要比重新使用现有的块高。对于 Oracle 来说，扩展一个表比管理 freelists 消耗更少的资源。<br />
　　 让我们来回顾一下设置对象存储参数的一些常见规则：<br />
　　 ．经常将 pctused 设置为可以接收一条新行。对于不能接受一行的 free blocks 对于我们来说是没有用的。如果这样做，将会令 Oracle 的性能变慢，因为 Oracle 将在扩展表来得到一个空的块之前，企图读取 5 个 &#8220;dead&#8221; 的 free block 。<br />
　　 ．表格中 chained rows 的出现意味着 pctfree 太低或者是 db_block_size 太少。在很多情况下， RAW 和 LONG RAW 列都很巨大，以至超过了 Oracle 的最大块的大小，这时 chained rows 是不可以避免的。<br />
　　 ．如果一个表有同时插入的 SQL 语句，那么它需要有同时删除的语句。运行单一个一个清除的工作将会把全部的空闲块放到一个 freelist 中，而没有其它包含有任何空闲块的 freelists 出现。<br />
　　 ． freelist 参数应该设置为表格同时更新的最大值。例如，如果在任何时候，某个表最多有 20 个用户执行插入的操作，那么该表的参数应该设置为 freelists=20 。<br />
　　 应记住的是 freelist groups 参数的值只是对于 Oracle Parallel <span class="t_tag" onclick="tagshow(event)">Server</span> 和 <span class="t_tag" onclick="tagshow(event)">Real</span> <span class="t_tag" onclick="tagshow(event)">Application</span> Clusters 才是有用的。对于这类 Oracle ， freelist groups 应该设置为访问该表格的 Oracle Parallel Server 实例的数目。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/oracle-database/oracletuning.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>10个Oracle性能调整的要点：SGA</title>
		<link>http://www.nonetsky.com/course/oracle-database/oraclesg.html</link>
		<comments>http://www.nonetsky.com/course/oracle-database/oraclesg.html#comments</comments>
		<pubDate>Sat, 30 Jan 2010 13:49:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Oracle数据库]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/?p=253</guid>
		<description><![CDATA[十、操作系统优化和使用资源管理器
    1、操作系统优化
    1）概念
    操作系统优化时应该考虑的因素有：内存的使用；Cpu的使用；IO级别；网络流量。各个因素互相影响，正确的优化次... ]]></description>
			<content:encoded><![CDATA[<div id="message227" class="t_msgfont">十、操作系统优化和使用资源管理器</div>
<p>    1、操作系统优化<br />
    1）概念<br />
    操作系统优化时应该考虑的因素有：内存的使用；Cpu的使用；IO级别；网络流量。各个因素互相影响，正确的优化次序是内存、IO、CPU。<br />
    操作系统使用了虚拟内存的概念，虚拟内存使每个应用感觉自己是使用内存的唯一的应用，每个应用都看到地址从0开始的单独的一块内存，虚拟内存被分成4K或8K的page，操作系统通过MMU（memory management unit）将这些page与物理内存映射起来，这个映射关系通过page table控制。<br />
    Raw device是没有文件结构或目录结构的磁盘或磁盘分区，由于它忽略了操作系统缓存，在某些情况下可以显著提升性能，但是在windows NT下，由于操作系统IO操作本身不使用文件系统缓存，所以raw device不能显示性能上的优点。</p>
<p>    2）Guideline<br />
    CPU的最高使用率：90％；<br />
    OS/USER进程数之比：40/60；<br />
    各个CPU的负载应该大致均衡。</p>
<p>    3）服务器安全性检查<br />
    A、检查UNIX系统用户口令<br />
    检查：/etc/passwd、/etc/shadow，UNIX密码采用了shadow机制，安全性能高<br />
    建议：参考UNIX命令passwd，修改/etc/default/passwd文件的某些设置如MAXWEEKS、MINWEEKS、PASSLENGTH使口令修改更加合理化。<br />
    建议：定期更改UNIX系统的如下用户口令：<br />
    root、oraprod、applprod、appprod</p>
<p>    B、检查 Remote Login<br />
    启动了rlogin，服务器数据库a、数据库b、数据库c，终端console1、console2、console3及T3形成相互非常信任的关系，用户只要拥有一个服务器的超级权限就可以rlogin到.rhosts指明的任一主机而无需要口令。<br />
    建议：非常不安全，参考UNIX命令rlogin和/目录下的文件.rhosts。在正式环境服务器和测试环境服务器之间不要建立这种远程信任的机制。</p>
<p>    C、检查FTP服务<br />
    检查可以FTP到服务器的用户（/etc/ftpusers），注释了root用户，就是说用户可以用root权限FTP到服务器上。权限太大。<br />
    建议：把这种权力取消，将/etc/ftpusers中root的注释符号（#）去掉，在列表中添加oraprod、applprod、appprod等用户使之不能FTP服务器。必要时（如上传PATCH时）再打开applprod的FTP权限。<br />
    D、建议：UNIX系统管理员定期检查/var/adm下的messages、sulog；/etc/syslog.conf 等信息。检查是否有非法用户登陆UNIX。<br />
    建议：与UNIX工程师探讨更好的监控方式</p>
<p>    4）数据库与应用产品安全性检查<br />
    A、建议：修改oracle用户根目录下的.profile文件，修改该文件的权限为500。即使得用户登陆时并不执行和数据库或应用相关的环境变量，增加安全性。<br />
    B、检查数据库DBA权限的用户密码和应用系统用户密码：SYSTEM、APPS密码都已经改变，SYS密码还是初始安装密码Change_on_install<br />
    建议：立即修改SYS用户密码，定期更改APPS、SYSTEM、SYS密码。<br />
    C、定期检查并清除$ORACLE_HOME/admin/bdump目录下的alert_PROD.log文件和后台进程trace文件。定期清除$ORACLE_HOME/admin/udump目录下的trc文件。<br />
    D、建议：给应用产品登陆的用户设置口令过期限制，如口令访问次数限制或时间（天数）限制。<br />
    建议：不要给使用应用产品的用户共享用户名和口令，每个用户分配一个应用产品用户名。<br />
    建议：对有应用系统管理员权限的用户登记，不适合有系统管理员权限的用户要把权限回收，统一管理。<br />
    E、定期检查并清除与Apache Server有关的log文件，目录为:<br />
    /u01/prodora/iAS/Apache/Apache/logs/acccess_log、error_log<br />
    /u01/prodora/iAS/Apache/Jserv/logs/jserv.log、mod_jserv.log<br />
    F、定期检查清除listener、tnsname的log文件，文件存放在:<br />
    /u01/prodora/8.0.6/network/admin/apps_prod.log、<br />
    /u01/proddb/8.1.7/network/admin/prod.log<br />
    /u01/proddb/8.1.7/network/log/listener.log、sqlnet.log…<br />
    G、数据库控制文件做多个镜像，放在多个磁盘位置，提高安全性。</p>
<p>    5）网络安全性检查<br />
    检查$ORACLE_HOME/dbs/initPROD.ora文件<br />
    #remote_login_passwordfile=EXCLUSIVE<br />
    设置为REMOTE_LOGIN_PASSWORDFILE=NONE，不允许远程客户用INTERNAL方式登陆。<br />
    2、资源管理器（Resource Manager）<br />
    通过资源管理器可以管理混合工作负载，控制系统性能。数据库资源管理器包括：<br />
    • Resource plans：包括 resource plan directives, 它指定了被分配到各个 resource consumer group的资源。<br />
    • Resource consumer groups：定义了具有类似资源使用需求的一组用户。<br />
    • Resource plan directives：包括下列内容:为consumer groups 或 subplans 指定resource plans；在各个 consumer groups 或资源计划的subplans 分配资源。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/oracle-database/oraclesg.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>db2读稳定性隔离级别</title>
		<link>http://www.nonetsky.com/course/db2-course/gelijibie.html</link>
		<comments>http://www.nonetsky.com/course/db2-course/gelijibie.html#comments</comments>
		<pubDate>Sat, 30 Jan 2010 13:47:38 +0000</pubDate>
		<dc:creator>gyst</dc:creator>
		
		<category><![CDATA[DB2数据库]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/?p=292</guid>
		<description><![CDATA[... ]]></description>
			<content:encoded><![CDATA[... ]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/db2-course/gelijibie.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>db2读稳定性隔离级别</title>
		<link>http://www.nonetsky.com/course/db2-course/readstability.html</link>
		<comments>http://www.nonetsky.com/course/db2-course/readstability.html#comments</comments>
		<pubDate>Wed, 06 Jan 2010 07:34:37 +0000</pubDate>
		<dc:creator>gyst</dc:creator>
		
		<category><![CDATA[DB2数据库]]></category>

		<category><![CDATA[DB2]]></category>

		<category><![CDATA[读稳定性]]></category>

		<category><![CDATA[隔离级别]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/course/db2-course/db2%e8%af%bb%e7%a8%b3%e5%ae%9a%e6%80%a7%e9%9a%94%e7%a6%bb%e7%ba%a7%e5%88%ab.html</guid>
		<description><![CDATA[读稳定性隔离级别
读稳定性隔离级别没有可重复读隔离级别那么严格；因此，它没有将事务与其他并发事务的效果完全隔离。读稳定性隔离级别可以防止脏读和不可重复的读，但是可能出现幻... ]]></description>
			<content:encoded><![CDATA[<p><a name="N1026B"><span class="smalltitle">读稳定性隔离级别</span></a></p>
<p>读稳定性隔离级别没有可重复读隔离级别那么严格；因此，它没有将事务与其他并发事务的效果完全隔离。读稳定性隔离级别可以防止脏读和不可重复的读，但是可能出现幻像。在使用这个隔离级别时，只锁定事务实际检索和修改的行。因此，如果一个事务扫描了 1000 行，但只检索 10 行，则只有被检索的 10 行（而不是所扫描的 1000 行）被锁定。因此，如果在同一个事务中发出同一个 SELECT 语句两次或更多次，那么每次产生的结果数据集可能不同。</p>
<p>与可重复读隔离级别一样，在读稳定性隔离级别下运行的事务可以检索一个行集，并可以对它们执行任意操作，直到事务终止。在这个事务存在期间，其他事务不能执行那些会影响这个事务检索到的行集的更新或删除操作；但是其他事务可以执行插入操作。如果插入的行与第一个事务的查询的选择条件匹配，那么这些行可能作为幻像出现在后续产生的结果数据集中。其他事务对其他行所做的更改，在提交之前是不可见的。</p>
<p>那么，读稳定性隔离级别会如何影响旅馆预订应用程序的工作方式呢？当一个顾客检索某个日期段内的所有可用房间列表时，您可以更改这个顾客的列表之外的任何房间的房价。同样，其他顾客可以进行或取消房间预订，如果第一个顾客再次运行同样的查询，其他顾客的操作可能会影响他获得的可用房间列表。如果第一个顾客再次查询同一个日期段内的所有可用房间列表，产生的列表中有可能包含新的房价或第一次产生列表时不可用的房间。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/db2-course/readstability.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>db2可重复读隔离级别</title>
		<link>http://www.nonetsky.com/course/db2-course/repeatableread.html</link>
		<comments>http://www.nonetsky.com/course/db2-course/repeatableread.html#comments</comments>
		<pubDate>Wed, 06 Jan 2010 07:31:01 +0000</pubDate>
		<dc:creator>gyst</dc:creator>
		
		<category><![CDATA[DB2数据库]]></category>

		<category><![CDATA[DB2]]></category>

		<category><![CDATA[可重复读]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/?p=290</guid>
		<description><![CDATA[可重复读隔离级别是最严格的隔离级别。在使用它时，一个事务的影响完全与其他并发事务隔离：脏读、不可重复的读、幻像都不会发生。当使用可重复的读隔离级别时，在事务执行期间锁定... ]]></description>
			<content:encoded><![CDATA[<p>可重复读隔离级别是最严格的隔离级别。在使用它时，一个事务的影响完全与其他并发事务隔离：脏读、不可重复的读、幻像都不会发生。当使用可重复的读隔离级别时，在事务执行期间锁定该事务<em>以任何方式</em> 引用的所有行。因此，如果在同一个事务中发出同一个 SELECT 语句两次或更多次，那么产生的结果数据集总是相同的。因此，使用可重复的读隔离级别的事务可以多次检索同一行集，并可以对它们执行任意操作，直到由提交或回滚操作终止事务。但是，在事务存在期间，不允许其他事务执行会影响这个事务正在访问的任何行的插入、更新或删除操作。为了确保这种行为，锁定该事务所引用的<em>每一行</em> —— 而不是仅锁定被实际检索或修改的那些行。因此，如果一个事务扫描了 1000 行，但只检索 10 行，则所扫描的 1000 行（而不仅是被检索的 10 行）都会被锁定。</p>
<p>那么在现实环境中可重复读隔离级别是如何工作的呢？假定您使用 DB2 数据库跟踪旅馆记录，包括房间预订和房价信息，还有一个基于 Web 的应用程序，它允许顾客按 “先到先服务” 的原则预订房间。如果旅馆预订应用程序是在可重复读隔离级别下运行的，当顾客扫描某个日期段内的可用房间列表时，您（旅馆经理）将无法更改那些房间在指定日期范围内的房价。同样，其他顾客也无法进行或取消将会更改该列表的预订（直到第一个顾客的事务终止为止）。但是，对于生成第一个顾客的列表时没有读取的任何房间记录，您可以修改房价。同样，其他顾客也可以进行或取消这些房间的预订。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/db2-course/repeatableread.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>并发性和隔离级别</title>
		<link>http://www.nonetsky.com/course/db2-course/isolation.html</link>
		<comments>http://www.nonetsky.com/course/db2-course/isolation.html#comments</comments>
		<pubDate>Tue, 05 Jan 2010 16:20:03 +0000</pubDate>
		<dc:creator>gyst</dc:creator>
		
		<category><![CDATA[DB2数据库]]></category>

		<category><![CDATA[并发性]]></category>

		<category><![CDATA[隔离级别]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/uncategorized/%e5%b9%b6%e5%8f%91%e6%80%a7%e5%92%8c%e9%9a%94%e7%a6%bb%e7%ba%a7%e5%88%ab.html</guid>
		<description><![CDATA[并发性和隔离级别
当多个用户访问同一数据库时会发生的现象
在单用户环境中，每个事务都是顺序执行的，而不会遇到与其他事务的冲突。但是，在多用户环境下，多个事务可以（而且常常）... ]]></description>
			<content:encoded><![CDATA[<p><span class="atitle">并发性和隔离级别</span></p>
<p><a name="N10204"><span class="smalltitle">当多个用户访问同一数据库时会发生的现象</span></a></p>
<p>在单用户环境中，每个事务都是顺序执行的，而不会遇到与其他事务的冲突。但是，在多用户环境下，多个事务可以（而且常常）同时执行。因此每个事务都有可能与其他正在运行的事务发生冲突。有可能与其他事务发生冲突的事务称为<em>交错的</em> 或<em>并行的</em> 事务，而相互隔离的事务称为<em>串行化</em> 事务，这意味着同时运行它们的结果与一个接一个连续地运行它们的结果没有区别。在多用户环境下，在使用并行事务时，会发生四种现象：</p>
<ul>
<li><strong>丢失更新：</strong>这种情况发生在两个事务读取并尝试更新同一数据时，其中一个更新会丢失。例如：事务 1 和事务 2 读取同一行数据，并都根据所读取的数据计算出该行的新值。如果事务 1 用它的新值更新该行以后，事务 2 又更新了同一行，则事务 1 所执行的更新操作就丢失了。由于设计 DB2 的方法，DB2 不允许发生此类现象。</li>
<li><strong>脏读：</strong>当事务读取尚未提交的数据时，就会发生这种情况。例如：事务 1 更改了一行数据，而事务 2 在事务 1 提交更改之前读取了已更改的行。如果事务 1 回滚该更改，则事务 2 就会读取被认为是不曾存在的数据。</li>
<li><strong>不可重复的读：</strong>当一个事务两次读取同一行数据，但每次获得不同的数据值时，就会发生这种情况。例如：事务 1 读取了一行数据，而事务 2 在更改或删除该行后提交了更改。当事务 1 尝试再次读取该行时，它会检索到不同的数据值（如果该行已经被更新的话），或发现该行不复存在了（如果该行被删除的话）。</li>
<li><strong>幻像：</strong>当最初没有看到某个与搜索条件匹配的数据行，而在稍后的读操作中又看到该行时，就会发生这种情况。例如：事务 1 读取满足某个搜索条件的一组数据行，而事务 2 插入了与事务 1 的搜索条件匹配的新行。如果事务 1 再次执行产生原先行集的查询，就会检索到不同的行集。</li>
</ul>
<p>维护数据库的一致性和数据完整性，同时又允许多个应用程序同时访问同一数据，这样的特性称为<em>并发性</em>。DB2 数据库用来尝试强制实施并发性的方法之一是通过使用<em>隔离级别</em>，它决定在第一个事务访问数据时，如何对其他事务锁定或隔离该事务所使用的数据。DB2 使用下列隔离级别来强制实施并发性：</p>
<ul>
<li>可重复的读（Repeatable Read）</li>
<li>读稳定性（Read Stability）</li>
<li>游标稳定性（Cursor Stability）</li>
<li>未提交的读（Uncommitted Read）</li>
</ul>
<p>可重复的读隔离级别可以防止所有现象，但是会大大降低并发性的程度（可以同时访问同一资源的事务数量）。未提交的读隔离级别提供了最大的并发性，但是后三种现象都可能出现。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/db2-course/isolation.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>数据库事务</title>
		<link>http://www.nonetsky.com/course/db2-course/transaction.html</link>
		<comments>http://www.nonetsky.com/course/db2-course/transaction.html#comments</comments>
		<pubDate>Tue, 05 Jan 2010 16:10:05 +0000</pubDate>
		<dc:creator>gyst</dc:creator>
		
		<category><![CDATA[DB2数据库]]></category>

		<category><![CDATA[事务]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/?p=277</guid>
		<description><![CDATA[什么是数据一致性？回答这个问题的最佳方法是通过研究示例。假定您的公司拥有多家连锁饭店，公司用一个数据库来跟踪每家饭店中的货物存储量。为了使货物采购过程更方便，数据库包含... ]]></description>
			<content:encoded><![CDATA[<p>什么是数据一致性？回答这个问题的最佳方法是通过研究示例。假定您的公司拥有多家连锁饭店，公司用一个数据库来跟踪每家饭店中的货物存储量。为了使货物采购过程更方便，数据库包含每个连锁店的库存表。每当一家饭店收到或用掉一部分货物时，与该饭店相应的库存表就会被修改以反映库存变化。</p>
<p>现在，假定从一家店调配若干瓶番茄酱到另一家店。为了准确地表示这一次库存调配，调出方饭店表中存储的番茄酱瓶数必须减少，而接收方饭店表中存储的番茄酱瓶数必须增加。如果用户减少了调出方饭店库存表中的番茄酱瓶数，但没有增加接收方库存表中的番茄酱瓶数，则数据就会变得<em>不一致</em>。此时所有连锁店的番茄酱的总瓶数不再准确了。</p>
<p>如果用户忘记了进行所有必要的更改（正如在前面的示例中一样），或者如果在用户进行更改的过程中系统崩溃了，又或者如果数据库应用程序由于某种原因过早地停止了，数据库中的数据都会变得不一致。当几个用户同时访问相同的数据库表时，也可能发生不一致。为了防止数据的不一致（尤其是在多用户环境中），DB2 的设计中集成了下列数据一致性支持机制：</p>
<ul>
<li>事务</li>
<li>隔离级别</li>
<li>锁</li>
</ul>
<p><a name="N1017C"><span class="smalltitle">事务和事务边界</span></a></p>
<p><em>事务</em>（也称为<em>工作单元</em>）是一种将一个或多个 SQL 操作组合成一个单元的可恢复操作序列，通常位于应用程序进程中。事务的启动和终止定义了数据库一致性点；要么将一个事务中执行的所有 SQL 操作的结果都应用于数据库（提交），要么完全取消并丢弃已执行的所有 SQL 操作的结果（回滚）。</p>
<p>使用从 Command Center、Script Center 或 Command Line Processor 运行的嵌入式 SQL 应用程序和脚本，在可执行 SQL 语句第一次执行时（在建立与数据库的连接之后或在现有事务终止之后），事务就会自动启动。在启动事务之后，必须由启动事务的用户或应用程序显式地终止它，除非使用了称为<em>自动提交（automatic commit）</em> 的过程（在这种情况下，发出的每个单独的 SQL 语句被看作单个事务，它一执行就隐式地提交了）。</p>
<p>在大多数情况下，通过执行 COMMIT 或 ROLLBACK 语句来终止事务。当执行 COMMIT 语句时，自从事务启动以来对数据库所做的一切更改就成为永久性的了 —— 即，它们被写到磁盘。当执行 ROLLBACK 语句时，自从事务启动以来对数据库所做的一切更改都被撤消，而数据库返回到事务开始之前所处的状态。不管是哪种情况，数据库在事务完成时都保证能回到一致状态。</p>
<p>一定要注意一点：虽然事务通过确保对数据的更改仅在事务被成功提交之后才成为永久性的，从而提供了一般的数据库一致性，但还是需要用户或应用程序来确保每个事务中执行的 SQL 操作序列始终会导致一致的数据库。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/db2-course/transaction.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>13种J2EE的核心技术</title>
		<link>http://www.nonetsky.com/course/j2ee-middleware/13-j2ee-tech.html</link>
		<comments>http://www.nonetsky.com/course/j2ee-middleware/13-j2ee-tech.html#comments</comments>
		<pubDate>Fri, 27 Feb 2009 08:00:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[J2EE中间件]]></category>

		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[J2EE平台]]></category>

		<category><![CDATA[Java技术]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/?p=269</guid>
		<description><![CDATA[
 
Java最初是在浏览器和客户端机器中粉墨登场的。当时，很多人质疑它是否适合做服务器端的开发。现在，随着对Java2平台企业版（J2EE）第三方支持的增多，Java被广泛接纳为开发企业级服务... ]]></description>
			<content:encoded><![CDATA[<div id="fontzoom" class="content">
<p> </p>
<p>Java最初是在浏览器和客户端机器中粉墨登场的。当时，很多人质疑它是否适合做服务器端的开发。现在，随着对Java2平台企业版（J2EE）第三方支持的增多，Java被广泛接纳为开发企业级服务器端解决方案的首选平台之一。</p>
<p>J2EE平台由一整套服务（Services）、应用程序接口（APIs）和协议构成，它对开发基于Web的多层应用提供了功能支持。</p>
<p>在本文中我将解释支撑J2EE的13种核心技术：JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail 和 JAF，同时还将描述在何时、何处需要使用这些技术。当然，我还要介绍这些不同的技术之间是如何交互的。</p>
<p>此外，为了让您更好地感受J2EE的真实应用，我将在WebLogic应用服务器,来自BEA Systems公司的一种广为应用的产品环境下来介绍这些技术。不论对于WebLogic应用服务器和J2EE的新手，还是那些想了解J2EE能带来什么好处的项目管理者和系统分析员，相信本文一定很有参考价值。</p>
<p>宏观印象: 分布式结构和J2EE</p>
<p>过去，二层化应用 &#8212; 通常被称为client/server应用 &#8212; 是大家谈论的最多的。在很多情况下，服务器提供的惟一服务就是数据库服务。在这种解决方案中，客户端程序负责数据访问、实现业务逻辑、用合适的样式显示结果、弹出预设的用户界面、接受用户输入等。client/server结构通常在第一次部署的时候比较容易，但难于升级或改进，而且经常基于某种专有的协议，通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。更重要的是，在Web时代，二层化应用通常不能体现出很好的伸缩性，因而很难适应Internet的要求。</p>
<p>Sun设计J2EE的部分起因就是想解决二层化结构的缺陷。于是，J2EE定义了一套标准来简化N层企业级应用的开发。它定义了一套标准化的组件，并为这些组件提供了完整的服务。J2EE还自动为应用程序处理了很多实现细节，如安全、多线程等。</p>
<p>用J2EE开发N层应用包括将二层化结构中的不同层面切分成许多层。一个N层化应用A能够为以下的每种服务提供一个分开的层：</p>
<p>显示：在一个典型的Web应用中，客户端机器上运行的浏览器负责实现用户界面。</p>
<p>动态生成显示: 尽管浏览器可以完成某些动态内容显示，但为了兼容不同的浏览器，这些动态生成工作应该放在Web服务器端进行，使用JSP、Servlets，或者XML（可扩展标记语言）和（可扩展样式表语言）。</p>
<p>业务逻辑：业务逻辑适合用Session EJBs（后面将介绍）来实现。</p>
<p>数据访问：数据访问适合用Entity EJBs（后面将介绍）和JDBC来实现。</p>
<p>后台系统集成: 同后台系统的集成可能需要用到许多不同的技术，至于何种最佳需要根据后台系统的特征而定。</p>
<p>您可能开始诧异：为什么有这么多的层？事实上，多层方式可以使企业级应用具有很强的伸缩性，它允许每层专注于特定的角色。例如，让Web服务器负责提供页面，应用服务器处理应用逻辑，而数据库服务器提供数据库服务。</p>
<p>由于J2EE建立在Java2平台标准版（J2SE）的基础上，所以具备了J2SE的所有优点和功能。包括“编写一次，到处可用”的可移植性、通过JDBC访问数据库、同原有企业资源进行交互的CORBA技术，以及一个经过验证的安全模型。在这些基础上，J2EE又增加了对EJB（企业级Java组件）、Java servlets、Java服务器页面（JSPs）和XML技术的支持。</p>
<p>分布式结构与WebLogic应用服务器</p>
<p>J2EE提供了一个框架&#8211;一套标准API&#8211;用于开发分布式结构的应用，这个框架的实际实现留给了第三方厂商。部分厂商只是专注于整个J2EE架构中的的特定组件，例如Apache的Tomcat提供了对JSP和servlets的支持，BEA系统公司则通过其WebLogic应用服务器产品为整个J2EE规范提供了一个较为完整的实现。</p>
<p>WebLogic服务器已使建立和部署伸缩性较好的分布式应用的过程大为简化。WebLogic和J2EE代你处理了大量常规的编程任务，包括提供事务服务、安全领域、可靠的消息、名字和目录服务、数据库访问和连接池、线程池、负载平衡和容错处理等。</p>
<p>通过以一种标准、易用的方式提供这些公共服务，象WebLogic服务器这样的产品造就了具有更好伸缩性和可维护性的应用系统，使其为大量的用户提供了增长的可用性。</p>
<p>J2EE技术</p>
<p>在接下来的部分里，我们将描述构成J2EE的各种技术，并且了解WebLogic服务器是如何在一个分布式应用中对它们进行支持的。最常用的J2EE技术应该是JDBC、JNDI、EJB、JSP和servlets，对这些我们将作更仔细的考察。</p>
<p>Java Database Connectivity (JDBC)</p>
<p>JDBC API以一种统一的方式来对各种各样的数据库进行存取。和ODBC一样，JDBC为开发人员隐藏了不同数据库的不同特性。另外，由于JDBC建立在Java的基础上,因此还提供了数据库存取的平台独立性。</p>
<p>JDBC定义了4种不同的驱动程序，现分述如下：</p>
<p>类型 1: JDBC-ODBC Bridge</p>
<p>在JDBC出现的初期，JDBC-ODBC桥显然是非常有实用意义的，通过JDBC-ODBC桥，开发人员可以使用JDBC来存取ODBC数据源。不足的是，他需要在客户端安装ODBC驱动程序，换句话说，必须安装Microsoft Windows的某个版本。使用这一类型你需要牺牲JDBC的平台独立性。另外，ODBC驱动程序还需要具有客户端的控制权限。</p>
<p>类型 2: JDBC-native driver bridge</p>
<p>JDBC本地驱动程序桥提供了一种JDBC接口，它建立在本地数据库驱动程序的顶层，而不需要使用ODBC。 JDBC驱动程序将对数据库的API从标准的JDBC调用转换为本地调用。使用此类型需要牺牲JDBC的平台独立性，还要求在客户端安装一些本地代码。</p>
<p>类型 3: JDBC-network bridge</p>
<p>JDBC网络桥驱动程序不再需要客户端数据库驱动程序。它使用网络上的中间服务器来存取数据库。这种应用使得以下技术的实现有了可能，这些技术包括负载均衡、连接缓冲池和数据缓存等。由于第3种类型往往只需要相对更少的下载时间，具有平台独立性，而且不需要在客户端安装并取得控制权，所以很适合于Internet上的应用。</p>
<p>类型 4: Pure Java driver</p>
<p>第4种类型通过使用一个纯Java数据库驱动程序来执行数据库的直接访问。此类型实际上在客户端实现了2层结构。要在N-层结构中应用，一个更好的做法是编写一个EJB，让它包含存取代码并提供一个对客户端具有数据库独立性的服务。</p>
<p>WebLogic服务器为一些通常的数据库提供了JDBC驱动程序，包括Oracle, Sybase, Microsoft SQL Server以及Informix。它也带有一种JDBC驱动程序用于Cloudscape，这是一种纯Java的DBMS，WebLogic服务器中带有该数据库的评估版本。</p>
<p>以下让我们看一个实例。</p>
<p>JDBC实例</p>
<p>在这个例子中我们假定你已经在Cloudscape中建立了一个PhoneBook数据库，并且包含一个表，名为 CONTACT_TABLE ，它带有2个字段：NAME 和 PHONE。 开始的时候先装载Cloudscape JDBC driver，并请求 driver manager得到一个对PhoneBook Cloudscape数据库的连接。通过这一连接，我们可以构造一个 Statement 对象并用它来执行一个简单的SQL查询。最后，用循环来遍历结果集的所有数据，并用标准输出将NAME和PHONE字段的内容进行输出。</p>
<p>import java.sql.*;<br />
public class JDBCExample<br />
{<br />
public static void main( String args[] )<br />
{<br />
try<br />
{<br />
Class.forName(&#8221;COM.cloudscape.core.JDBCDriver&#8221;);<br />
Connection conn = DriverManager.getConnection(&#8221;jdbc:cloudscape:PhoneBook&#8221;);<br />
Statement stmt = conn.createStatement();<br />
String sql = &#8220;SELECT name, phone FROM CONTACT_TABLE ORDER BY name&#8221;;<br />
ResultSet resultSet = stmt.executeQuery( sql );<br />
String name;<br />
String phone;<br />
while ( resultSet.next() )<br />
{<br />
name = resultSet.getString(1).trim();<br />
phone = resultSet.getString(2).trim();<br />
System.out.println( name + &#8220;, &#8221; + phone );<br />
}<br />
}<br />
catch ( Exception e )<br />
{<br />
// Handle exception here<br />
e.printStackTrace();<br />
}<br />
}<br />
}</p>
<p>OK。接着我们来看一看JDBC是如何在企业应用中的进行使用。</p>
<p>JDBC在企业级应用中的应用</p>
<p>以上实例其实是很基本的，可能有些微不足道。它假定了一个2层结构。在一个多层的企业级应用中，更大的可能是在客户端和一个EJB进行通信，该EJB将建立数据库连接。为了实现和改进可伸缩性和系统性能， WebLogic服务器提供了对连接缓冲池connection pool的支持。</p>
<p>Connection pool减少了建立和释放数据库连接的消耗。在系统启动以后即可建立这样的缓冲池，此后如故再有对数据库的请求，WebLogic服务器可以很简单地从缓冲池中取出数据。数据缓冲池可以在WebLogic服务器的 weblogic.properties 文件中进行定义。(可参考 weblogic.properties 文件中的例子，WebLogic服务器的文档中还有更详细的参考信息)</p>
<p>在企业级应用的另一个常见的数据库特性是事务处理。事务是一组申明statement，它们必须做为同一个statement来处理以保证数据完整性。缺省情况下JDBC使用 auto-commit 事务模式。这可以通过使用Connection类的 setAutoCommit() 方法来实现。</p>
<p>现在我们已经对JDBC有了一些认识，下面该转向JNDI了。</p>
<p>Java Naming and Directory Interface (JNDI)</p>
<p>JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，后者在应用服务器中的对象。</p>
<p>在JNDI中，在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。这里没有绝对名字的概念存在。对一个应用来说，它可以通过使用 InitialContext 类来得到其第一个context:</p>
<p>Context ctx = new InitialContext();</p>
<p>应用可以通过这个初始化的context经有这个目录树来定位它所需要的资源或对象。例如，假设你在Weblogic服务器中展开了一个EJB并将home接口绑定到名字 myApp.myEJB ，那么该EJB的某个客户在取得一个初始化context以后，可以通过以下语句定位home接口：</p>
<p>MyEJBHome home = ctx.lookup( &#8220;myApp.myEJB&#8221; );</p>
<p>在这个例子中，一旦你有了对被请求对象的参考，EJB的home接口就可以在它上面调用方法。我们将在下面的&#8221;Enterprise Java Beans&#8221;章节中做更多的介绍。</p>
<p>以上关于JNDI的讨论只是冰山之一角而已。如果要更进一步地在context中查找对象，JNDI也提供了一些方法来进行以下操作：　</p>
<p>将一个对象插入或绑定到context。这在你展开一个EJB的时候是很有效的。</p>
<p>从context中移去对象。</p>
<p>列出context中的所有对象。</p>
<p>创建或删除子一级的context。</p>
<p>接下来，我们要开始关注EJB了。</p>
<p>Enterprise Java Beans (EJB)</p>
<p>J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资源缓冲池以及容错性。</p>
<p>EJB规范定义了3中基本的bean类型:</p>
<p>Stateless session beans: 提供某种单一的服务，不维持任何状态，在服务器故障发生时无法继续存在，生命期相对较短。例如，一个stateless session bean可能被用于执行温度转换计算。</p>
<p>Stateful session bean: T提供了与客户端的会话交互，可以存储状态从而代表一个客户。典型例子是购物车。Stateful session bean在服务器故障时无法继续生存，生命气相对较短。每一个实例只用于一个单个的线程。</p>
<p>Entity beans: 提供了一致性数据的表示&#8211; 通常存放在数据库中 &#8212; 在服务器故障发生后能继续存在。多用户情况下可以使用EJB来表示相同的数据。entity EJB的一个典型例子是客户的帐号信息。</p>
<p>尽管有以上的区别，所有的EJB还是有许多的共同之处。它们都处理home interface。它定义了一个客户端是如何创建与消亡EJB的。可以在bean中对定义了客户端方法的远程接口进行调用；bean类则执行了主要的商务逻辑。</p>
<p>描述EJB的开发已经超出了本文的范围。但是，如果一个EJB已经被开发了或者从第三方进行了购买，它就必须在应用服务器中进行发布。WebLogic Server 5.1带有一个EJB Deployer Tool来协助处理EJB的发布。当你使用EJB Deployer Tool的时候，你要定义客户端所用的JNDI名字来定位EJB。Deployer Tool将生成wrapper类来处理和容器的通信以及在一个jar文件中把被请求的Java类绑定在一起。</p>
<p>一旦EJB被发布，客户端就可以使用它的JNDI名字来定位EJB。首先，它必须得到一个到home接口的reference。然后，客户端可以使用该接口，调用一个 create() 方法来得到服务器上运行的某个bean实例的句柄；最后，客户端可以使用该句柄在bean中调用方法。</p>
<p>了解 EJB后，让我们再来看JSP。</p>
<p>JavaServer Pages (JSPs)</p>
<p>我们中间可能已经有许多人已经熟悉Microsoft的Active Server Pages (ASP)技术了。JSP和ASP相对应的，但更具有平台对立性。他们被设计用以帮助Web内容开发人员创建动态网页，并且只需要相对较少的代码。 即使Web设计师不懂得如何编程也可以使用JSP，因为JSP应用是很方便的。 JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给客户端的浏览器。</p>
<p>下面我们来看一个JSP的简单实例。它只显示了服务器的当前日期和时间。虽然，对语法的具体解释已经超出了本文的范围，但我们还是可以很直观地看到，Java代码被放在符号的中间，而Java的表达式则放在符号之间。</p>
<p>Date JSP sample</p>
<p>The current date is .</p>
<p>您可能有时候听说过JHTML。这是JSP以前的一种较老的标准。WebLogic服务器既可支持JSP，又可支持JHTML。请注意，在缺省状况下，JSP在WebLogic服务器中并没有处于有效状态。要使之有效，你可以编辑weblogic.properties文件。如果Web服务器还没有处于有效状态，则要先使之有效。Servlet的情况和JSP是一样的。</p>
<p>下面是: Java servlets</p>
<p>Java servlets</p>
<p>servlet提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而servlets全部由Java写成并且生成HTML。</p>
<p>servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlets和CGI脚本的一个很大的区别是：每一个CGI在开始的时候都要求开始一个新的进程 &#8212; 而servlets是在servlet引擎中以分离的线程来运行的。因此servlets在可伸缩性上提供了很好的改进。</p>
<p>在开发servlets的时候，您常常需要扩展javax.servlet.http.HttpServlet 类，并且override一些它的方法，其中包括：</p>
<p>service(): 作为dispatcher来实现命令-定义方法</p>
<p>doGet(): 处理客户端的HTTP GET请求。</p>
<p>doPost(): 进行HTTP POST操作</p>
<p>其它的方法还包括处理不同类型的HTTP请求 &#8212; 可以参考HttpServlet API文档。</p>
<p>以上描述的是标准J2EE Servlet API的各种方法。WebLogic服务器提供了一个该API完整的实现途径。一旦你开发了一个servlet，你就可以在weblogic.properties 中加以注册并由此可以在WebLogic服务器中对它进行配置。</p>
<p>通过Java servlets,我们已经到达了J2EE主要技术的末尾了。但J2EE所提供的并不止于这些。下面的段落中我们将简要地看一下现存的一些技术，包括RMI, Java IDL和CORBA, JTA, 以及XML，等等。</p>
<p>Remote Method Invocation (RMI)</p>
<p>正如其名字所表示的那样，RMI协议是在远程对象上调用一些方法。它使用了连续序列方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更下层的协议。</p>
<p>Java IDL/CORBA</p>
<p>在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应用和legacy系统相集成。</p>
<p>Java Transaction Architecture (JTA)/Java Transaction Service (JTS)</p>
<p>JTA定义了一种标准的API，应用系统由此可以存取各种事务监控。</p>
<p>JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。</p>
<p>JavaMail and JavaBeans Activation Framework</p>
<p>JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器，也支持IMAP服务器。</p>
<p>JavaMail利用JavaBeans Activation Framework (JAF)来处理MIME-编码的邮件附件。MIME的字节流可以被转换成Java对象，或者转换自Java对象。由此大多数应用都可以不需要直接使用JAF。</p>
<p>Java Messaging Service (JMS)</p>
<p>JMS是用于和面向消息的中间件相互通信的应用程序接口(Java Naming and Directory Interface (JNDI)</p>
<p>JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，后者在应用服务器中的对象。</p>
<p>在JNDI中，在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。这里没有绝对名字的概念存在。对一个应用来说，它可以通过使用 InitialContext 类来得到其第一个context:</p>
<p>Context ctx = new InitialContext();</p>
<p>应用可以通过这个初始化的context经有这个目录树来定位它所需要的资源或对象。例如，假设你在Weblogic服务器中展开了一个EJB并将home接口绑定到名字 myApp.myEJB ，那么该EJB的某个客户在取得一个初始化context以后，可以通过以下语句定位home接口：</p>
<p>MyEJBHome home = ctx.lookup( &#8220;myApp.myEJB&#8221; );</p>
<p>在这个例子中，一旦你有了对被请求对象的参考，EJB的home接口就可以在它上面调用方法。我们将在下面的&#8221;Enterprise Java Beans&#8221;章节中做更多的介绍。</p>
<p>以上关于JNDI的讨论只是冰山之一角而已。如果要更进一步地在context中查找对象，JNDI也提供了一些方法来进行以下操作：　</p>
<p>将一个对象插入或绑定到context。这在你展开一个EJB的时候是很有效的。</p>
<p>从context中移去对象。</p>
<p>列出context中的所有对象。</p>
<p>创建或删除子一级的context。</p>
<p>接下来，我们要开始关注EJB了。</p>
<p>Enterprise Java Beans (EJB)</p>
<p>J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资源缓冲池以及容错性。</p>
<p>EJB规范定义了3中基本的bean类型:</p>
<p>Stateless session beans: 提供某种单一的服务，不维持任何状态，在服务器故障发生时无法继续存在，生命期相对较短。例如，一个stateless session bean可能被用于执行温度转换计算。</p>
<p>Stateful session bean: T提供了与客户端的会话交互，可以存储状态从而代表一个客户。典型例子是购物车。Stateful session bean在服务器故障时无法继续生存，生命气相对较短。每一个实例只用于一个单个的线程。</p>
<p>Entity beans: 提供了一致性数据的表示&#8211; 通常存放在数据库中 &#8212; 在服务器故障发生后能继续存在。多用户情况下可以使用EJB来表示相同的数据。entity EJB的一个典型例子是客户的帐号信息。</p>
<p>尽管有以上的区别，所有的EJB还是有许多的共同之处。它们都处理home interface。它定义了一个客户端是如何创建与消亡EJB的。可以在bean中对定义了客户端方法的远程接口进行调用；bean类则执行了主要的商务逻辑。</p>
<p>描述EJB的开发已经超出了本文的范围。但是，如果一个EJB已经被开发了或者从第三方进行了购买，它就必须在应用服务器中进行发布。WebLogic Server 5.1带有一个EJB Deployer Tool来协助处理EJB的发布。当你使用EJB Deployer Tool的时候，你要定义客户端所用的JNDI名字来定位EJB。Deployer Tool将生成wrapper类来处理和容器的通信以及在一个jar文件中把被请求的Java类绑定在一起。</p>
<p>一旦EJB被发布，客户端就可以使用它的JNDI名字来定位EJB。首先，它必须得到一个到home接口的reference。然后，客户端可以使用该接口，调用一个 create() 方法来得到服务器上运行的某个bean实例的句柄；最后，客户端可以使用该句柄在bean中调用方法。</p>
<p>了解 EJB后，让我们再来看JSP。</p>
<p>JavaServer Pages (JSPs)</p>
<p>我们中间可能已经有许多人已经熟悉Microsoft的Active Server Pages (ASP)技术了。JSP和ASP相对应的，但更具有平台对立性。他们被设计用以帮助Web内容开发人员创建动态网页，并且只需要相对较少的代码。 即使Web设计师不懂得如何编程也可以使用JSP，因为JSP应用是很方便的。 JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给客户端的浏览器。</p>
<p>下面我们来看一个JSP的简单实例。它只显示了服务器的当前日期和时间。虽然，对语法的具体解释已经超出了本文的范围，但我们还是可以很直观地看到，Java代码被放在符号的中间，而Java的表达式则放在符号之间。</p>
<p>Date JSP sample</p>
<p>The current date is .</p>
<p>您可能有时候听说过JHTML。这是JSP以前的一种较老的标准。WebLogic服务器既可支持JSP，又可支持JHTML。请注意，在缺省状况下，JSP在WebLogic服务器中并没有处于有效状态。要使之有效，你可以编辑weblogic.properties文件。如果Web服务器还没有处于有效状态，则要先使之有效。Servlet的情况和JSP是一样的。</p>
<p>下面是: Java servlets</p>
<p>Java servlets</p>
<p>servlet提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而servlets全部由Java写成并且生成HTML。</p>
<p>servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlets和CGI脚本的一个很大的区别是：每一个CGI在开始的时候都要求开始一个新的进程 &#8212; 而servlets是在servlet引擎中以分离的线程来运行的。因此servlets在可伸缩性上提供了很好的改进。</p>
<p>在开发servlets的时候，您常常需要扩展javax.servlet.http.HttpServlet 类，并且override一些它的方法，其中包括：</p>
<p>service(): 作为dispatcher来实现命令-定义方法</p>
<p>doGet(): 处理客户端的HTTP GET请求。</p>
<p>doPost(): 进行HTTP POST操作</p>
<p>其它的方法还包括处理不同类型的HTTP请求 &#8212; 可以参考HttpServlet API文档。</p>
<p>以上描述的是标准J2EE Servlet API的各种方法。WebLogic服务器提供了一个该API完整的实现途径。一旦你开发了一个servlet，你就可以在weblogic.properties 中加以注册并由此可以在WebLogic服务器中对它进行配置。</p>
<p>通过Java servlets,我们已经到达了J2EE主要技术的末尾了。但J2EE所提供的并不止于这些。下面的段落中我们将简要地看一下现存的一些技术，包括RMI, Java IDL和CORBA, JTA, 以及XML，等等。</p>
<p>Remote Method Invocation (RMI)</p>
<p>正如其名字所表示的那样，RMI协议是在远程对象上调用一些方法。它使用了连续序列方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更下层的协议。</p>
<p>Java IDL/CORBA</p>
<p>在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应用和legacy系统相集成。</p>
<p>Java Transaction Architecture (JTA)/Java Transaction Service (JTS)</p>
<p>JTA定义了一种标准的API，应用系统由此可以存取各种事务监控。</p>
<p>JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。</p>
<p>JavaMail and JavaBeans Activation Framework</p>
<p>JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器，也支持IMAP服务器。</p>
<p>JavaMail利用JavaBeans Activation Framework (JAF)来处理MIME-编码的邮件附件。MIME的字节流可以被转换成Java对象，或者转换自Java对象。由此大多数应用都可以不需要直接使用JAF。</p>
<p>Java Messaging Service (JMS)</p>
<p>JMS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域，有支持发布/订阅(publish/subscribe)类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与legacy backend系统相集成。</p>
<p>Extensible Markup Language (XML)</p>
<p>XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。目前正有许多不同的公司在为Java和XML的组合而努力。如果要了解更多的这方面的信息，可以访问Sun的Java-XML页面，或者IBM developerWorks的XML Zone。<br />
API)。它既支持点对点的域，有支持发布/订阅(publish/subscribe)类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与legacy backend系统相集成。</p>
<p>Extensible Markup Language (XML)</p>
<p>XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。目前正有许多不同的公司在为Java和XML的组合而努力。如果要了解更多的这方面的信息，可以访问Sun的Java-XML页面，或者IBM developerWorks的XML Zone。</p>
<p> </p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/j2ee-middleware/13-j2ee-tech.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>J2EE开发入门技术</title>
		<link>http://www.nonetsky.com/course/j2ee-middleware/j2ee-gateway.html</link>
		<comments>http://www.nonetsky.com/course/j2ee-middleware/j2ee-gateway.html#comments</comments>
		<pubDate>Tue, 24 Feb 2009 07:41:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[J2EE中间件]]></category>

		<category><![CDATA[J2EE]]></category>

		<category><![CDATA[J2EE应用]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/?p=267</guid>
		<description><![CDATA[一、J2EE的概念
　　目前，Java 2平台有3个版本，它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition，J2ME)、适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Edition，J2SE... ]]></description>
			<content:encoded><![CDATA[<p><strong>一、J2EE的概念</strong></p>
<p>　　目前，Java 2平台有3个版本，它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition，J2ME)、适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Edition，J2SE)、适用于创建服务器应用程序和服务的Java2平台企业版(Java 2 Platform EntERPrise Edition，J2EE)。</p>
<p>　　J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java 2平台的标准版，J2EE不仅巩固了标准版中的许多优点，例如“编写一次、随处运行”的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等，同时还提供了对 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的 体系结构。</p>
<p>　　J2EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用的需求。通过提供统一的开发平台，J2EE降低了开发多层应用的费用和复杂性，同时提供对现有应用程序集成强有力支持，完全支持Enterprise JavaBeans，有良好的向导支持打包和部署应用，添加目录支持，增强了安全机制，提高了性能。</p>
<p>　　<strong>二、J2EE的优势</strong></p>
<p>　　J2EE为搭建具有可伸缩性、灵活性、易维护性的商务系统提供了良好的机制：</p>
<p>　　保留现存的IT资产： 由于企业必须适应新的商业需求，利用已有的企业信息系统方面的投资，而不是重新制定全盘方案就变得很重要。这样，一个以渐进的(而不是激进的，全盘否定的)方式建立在已有系统之上的服务器端平台机制是公司所需求的。J2EE架构可以充分利用用户原有的投资，如一些公司使用的BEA Tuxedo、IBM CICS, IBM Encina,、Inprise VisiBroker 以及Netscape Application Server。这之所以成为可能是因为J2EE拥有广泛的业界支持和一些重要的´企业计算´领域供应商的参与。每一个供应商都对现有的客户提供了不用废弃已有投资，进入可移植的J2EE领域的升级途径。由于基于J2EE平台的产品几乎能够在任何操作系统和硬件配置上运行，现有的操作系统和硬件也能被保留使用。</p>
<p>　　<strong>高效的开发：</strong>J2EE允许公司把一些通用的、很繁琐的服务端任务交给中间件供应商去完成。这样开发人员可以集中精力在如何创建商业逻辑上，相应地缩短了开发时间。高级中间件供应商提供以下这些复杂的中间件服务：</p>
<ul>
<li>　　状态管理服务</li>
</ul>
<p>　　让开发人员写更少的代码，不用关心如何管理状态，这样能够更快地完成程序开发。</p>
<ul>
<li>　　持续性服务</li>
</ul>
<p>　　让开发人员不用对数据访问逻辑进行编码就能编写应用程序，能生成更轻巧，与数据库无关的应用程序，这种应用程序更易于开发与维护。分布式共享数据对象CACHE服务 &#8212; 让开发人员编制高性能的系统，极大提高整体部署的伸缩性。</p>
<p>　　<strong>支持异构环境：</strong>J2EE能够开发部署在异构环境中的可移植程序。基于J2EE的应用程序不依赖任何特定操作系统、中间件、硬件。因此设计合理的基于J2EE的程序只需开发一次就可部署到各种平台。这在典型的异构企业计算环境中是十分关键的。J2EE标准也允许客户订购与J2EE兼容的第三方的现成的组件，把他们部署到异构环境中，节省了由自己制订整个方案所需的费用。</p>
<p>　　<strong>可伸缩性：</strong>企业必须要选择一种服务器端平台，这种平台应能提供极佳的可伸缩性去满足那些在他们系统上进行商业运作的大批新客户。基于J2EE平台的应用程序可被部署到各种操作系统上。例如可被部署到高端UNIX与大型机系统，这种系统单机可支持64至256个处理器。(这是NT服务器所望尘莫及的)J2EE领域的供应商提供了更为广泛的负载平衡策略。能消除系统中的瓶颈，允许多台服务器集成部署。这种部署可达数千个处理器，实现可高度伸缩的系统，满足未来商业应用的需要。</p>
<p>　　<strong>稳定的可用性：</strong>一个服务器端平台必须能全天候运转以满足公司客户、合作伙伴的需要。因为INTERNET是全球化的、无处不在的，即使在夜间按计划停机也可能造成严重损失。若是意外停机，那会有灾难性后果。J2EE部署到可靠的操作环境中，他们支持长期的可用性。一些J2EE部署在Windows环境中，客户也可选择健壮性能更好的操作系统如Sun Solaris、IBM OS/390。最健壮的操作系统可达到99.999%的可用性或每年只需5分钟停机时间。这是实时性很强商业系统理想的选择。</p>
<p>　　<strong>三、J2EE 的四层模型</strong></p>
<p>　　J2EE使用多层的分布式应用模型，应用逻辑按功能划分为组件，各个应用组件根据他们所在的层分布在不同的机器上。事实上，sun设计J2EE的初衷正是为了解决两层模式(client/server)的弊端，在传统模式中，客户端担当了过多的角色而显得臃肿，在这种模式中，第一次部署的时候比较容易，但难于升级或改进，可伸展性也不理想，而且经常基于某种专有的协议?D?D通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。现在J2EE 的多层企业级应用模型将两层化模型中的不同层面切分成许多层。一个多层化应用能够为不同的每种服务提供一个独立的层，以下是 J2EE 典型的四层结构：</p>
<ul>
<li>　　运行在客户端机器上的客户层组件</li>
<li>　　运行在J2EE服务器上的Web层组件</li>
<li>　　运行在J2EE服务器上的业务逻辑层组件</li>
<li>　　运行在EIS服务器上的企业信息系统(EntERPrise information system)层软件</li>
</ul>
<p>　　<strong>J2EE应用程序组件</strong></p>
<p>　　J2EE应用程序是由组件构成的.J2EE组件是具有独立功能的软件单元，它们通过相关的类和文件组装成J2EE应用程序，并与其他组件交互。J2EE说明书中定义了以下的J2EE组件：</p>
<ul>
<li>　　应用客户端程序和Applets是客户层组件。</li>
<li>　　Java Servlet和JavaServer Pages(JSP)是web层组件。</li>
<li>　　Enterprise JavaBeans(EJB)是业务层组件。</li>
</ul>
<p>　　<strong>客户层组件</strong></p>
<p>　　J2EE应用程序可以是基于web方式的,也可以是基于传统方式的.</p>
<p>　　web 层组件J2EE web层组件可以是JSP 页面或Servlets.按照J2EE规范，静态的HTML页面和Applets不算是web层组件。正如客户层那样，web层可能包含某些 JavaBean 对象来处理用户输入，并把输入发送给运行在业务层上的enterprise bean 来进行处理。</p>
<p>　　<strong>业务层组件</strong></p>
<p>　　业务层代码的逻辑用来满足银行，零售，金融等特殊商务领域的需要,由运行在业务层上的entERPrise bean 进行处理。下图表明了一个enterprise bean 是如何从客户端序接收数据，进行处理(如果必要的话), 并发送到EIS 层储存的，这个过程也可以逆向进行。</p>
<p>　　有三种企业级的bean： 会话(session) beans, 实体(entity) beans, 和 消息驱动(message-driven) beans。会话bean 表示与客户端程序的临时交互。当客户端程序执行完后, 会话bean 和相关数据就会消失。相反, 实体bean 表示数据库的表中一行永久的记录.当客户端程序中止或服务器关闭时, 就会有潜在的服务保证实体bean 的数据得以保存.消息驱动 bean 结合了会话bean 和 JMS的消息监听器的特性, 允许一个业务层组件异步接收JMS 消息。</p>
<p>　　<strong>企业信息系统层</strong></p>
<p>　　企业信息系统层处理企业信息系统软件包括企业基础建设系统例如企业资源计划 (ERP) , 大型机事务处理, 数据库系统,和其它的遗留信息系统。例如，J2EE 应用组件可能为了数据库连接需要访问企业信息系统。</p>
<p>　　<strong>四、J2EE 的结构</strong></p>
<p>　　这种基于组件，具有平台无关性的J2EE 结构使得J2EE 程序的编写十分简单，因为业务逻辑被封装成可复用的组件，并且J2EE 服务器以容器的形式为所有的组件类型提供后台服务。因为你不用自己开发这种服务, 所以你可以集中精力解决手头的业务问题。</p>
<p>　　<strong>容器和服务</strong></p>
<p>　　容器设置定制了J2EE服务器所提供得内在支持，包括安全，事务管理，JNDI(Java Naming and Directory Interface)寻址,远程连接等服务，以下列出最重要的几种服务：J2EE安全(Security)模型可以让你配置 Web 组件或enterprise bean ,这样只有被授权的用户才能访问系统资源。每一客户属于一个特别的角色，而每个角色只允许激活特定的方法。你应在enterprise bean的布置描述中声明角色和可被激活的方法。由于这种声明性的方法，你不必编写加强安全性的规则。</p>
<p>　　J2EE 事务管理(Transaction Management)模型让你指定组成一个事务中所有方法间的关系，这样一个事务中的所有方法被当成一个单一的单元。当客户端激活一个enterprise bean中的方法，容器介入一管理事务。因有容器管理事务，在enterprise bean中不必对事务的边界进行编码。要求控制分布式事务的代码会非常复杂。你只需在布置描述文件中声明enterprise bean的事务属性，而不用编写并调试复杂的代码。容器将读此文件并为你处理此enterprise bean的事务。JNDI 寻址(JNDI Lookup)服务向企业内的多重名字和目录服务提供了一个统一的接口,这样应用程序组件可以访问名字和目录服务.J2EE远程连接(Remote Client Connectivity)模型管理客户端和enterprise bean间的低层交互。当一个enterprise bean创建后, 一个客户端可以调用它的方法就象它和客户端位于同一虚拟机上一样。</p>
<p>　　生存周期管理(Life Cycle Management)模型管理entERPrise bean的创建和移除,一个enterprise bean在其生存周期中将会历经几种状态。容器创建enterprise bean，并在可用实例池与活动状态中移动他，而最终将其从容器中移除。即使可以调用enterprisebean的create及remove方法，容器也将会在后台执行这些任务。</p>
<p>　　数据库连接池(Database Connection Pooling)模型是一个有价值的资源。获取数据库连接是一项耗时的工作，而且连接数非常有限。容器通过管理连接池来缓和这些问题。 enterprise bean可从池中迅速获取连接。在bean释放连接之可为其他bean使用。</p>
<p>　　<strong>容器类型</strong></p>
<p>　　J2EE应用组件可以安装部署到以下几种容器中去：</p>
<ul>
<li>　　EJB 容器管理所有J2EE 应用程序中企业级bean 的执行。enterprise bean 和它们的容器运行在J2EE 服务器上。</li>
<li>　　Web 容器管理所有J2EE 应用程序中JSP页面和Servlet组件的执行。Web 组件和它们的容器运行在J2EE 服务器上。</li>
<li>　　应用程序客户端容器管理所有J2EE应用程序中应用程序客户端组件的执行。应用程序客户端和它们的容器运行在J2EE 服务器上。</li>
<li>　　Applet 容器是运行在客户端机器上的web浏览器和 Java 插件的结合。</li>
</ul>
<p>　　<strong>五、J2EE的核心API与组件</strong></p>
<p>　　J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成，它对开发基于Web的多层应用提供了功能支持，下面对J2EE中的13种技术规范进行简单的描述(限于篇幅，这里只能进行简单的描述：</p>
<p>　　<strong>JDBC(Java Database Connectivity)：</strong></p>
<p>　　JDBC API为访问不同的数据库提供了一种统一的途径，象ODBC一样，JDBC对开发者屏蔽了一些细节问题，另外，JDCB对数据库的访问也具有平台无关性。</p>
<p>　　<strong>JNDI(Java Name and Directory Interface)：</strong></p>
<p>　　JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，或应用服务器中的对象。</p>
<p>　　<strong>EJB(Enterprise JavaBean)：</strong></p>
<p>　　J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是，EJB并不是实现J2EE的唯一途径。正是由于J2EE的开放性，使得有的厂商能够以一种和EJB平行的方式来达到同样的目的。</p>
<p>　　<strong>RMI(Remote Method Invoke)：</strong></p>
<p>　　正如其名字所表示的那样，RMI协议调用远程对象上方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议。</p>
<p>　　<strong>Java IDL/CORBA：</strong></p>
<p>　　在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应用和旧的系统相集成。</p>
<p>　　<strong>JSP(Java Server Pages)：</strong></p>
<p>　　JSP页面由HTML代码和嵌入其中的 Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给客户端的浏览器。Java Servlet：Servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlet提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而 servlets全部由Java写成并且生成HTML。</p>
<p>　　<strong>XML(Extensible Markup Language)：</strong></p>
<p>　　XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。</p>
<p>　　<strong>JMS(Java Message Service)：</strong></p>
<p>　　MS是用于和面向消息的中间件相互信的应用程序接口(API)。它既支持点对点的域，有支持发布/订阅(publish/subscribe)类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。</p>
<p>　　<strong>JTA(Java Transaction Architecture)：</strong></p>
<p>　　JTA定义了一种标准的API，应用系统由此可以访问各种事务监控。</p>
<p>　　<strong>JTS(Java Transaction Service)：</strong></p>
<p>　　JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。</p>
<p>　　<strong>JavaMail：</strong></p>
<p>　　JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器，也支持IMAP服务器。</p>
<p>　　<strong>JTA(JavaBeans Activation Framework)：</strong></p>
<p>　　JavaMail利用JAF来处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/j2ee-middleware/j2ee-gateway.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Oracle数据库清除奇怪表名的方法</title>
		<link>http://www.nonetsky.com/course/oracle-database/oracle-clear-tablename.html</link>
		<comments>http://www.nonetsky.com/course/oracle-database/oracle-clear-tablename.html#comments</comments>
		<pubDate>Sat, 14 Feb 2009 02:13:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Oracle数据库]]></category>

		<category><![CDATA[ORACLE数据库]]></category>

		<guid isPermaLink="false">http://www.nonetsky.com/?p=265</guid>
		<description><![CDATA[    Oracle 10g 中出现表名：BIN$2cMp4FjwQ2Cw3Lj+BxLYTw==$0 最近发现Oracle数据库中出现了这些奇怪的表名，上网查找后发现是oracle10g的回收站功能，并没有彻底的删除表，而是把表放入回收站，最后就... ]]></description>
			<content:encoded><![CDATA[<p>    <span style="color: #0000ff;">Oracle</span> 10g 中出现表名：BIN$2cMp4FjwQ2Cw3Lj+BxLYTw==$0 最近发现<span style="color: #0000ff;">Oracle数据库</span>中出现了这些奇怪的表名，上网查找后发现是oracle10g的回收站功能，并没有彻底的删除表，而是把表放入回收站，最后就出现了这样一堆奇怪的表名……</p>
<p>    清除的方法如下：</p>
<p>    purge table origenal_tableName；</p>
<p>    purge index origenal_indexName；</p>
<p>    查询垃圾信息，可以用如下SQL语句：</p>
<p>    SELECT t.object_name，t.type ，t.original_name FROM user_recyclebin t；</p>
<p>    现在发现，原来还有这个命令：</p>
<p>    PURGE recyclebin；</p>
<p>    根本用不了上面那么复杂。呵呵！</p>
<p>    另：删除Table不进入Recycle的方法：</p>
<p>    drop table tableName purge；</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nonetsky.com/course/oracle-database/oracle-clear-tablename.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
