﻿<?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-城市猎人</title><link>http://www.blogjava.net/sailor/</link><description>在一网情深的日子里，谁能说得清是苦是甜，只知道确定了就义无反顾</description><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 00:33:16 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 00:33:16 GMT</pubDate><ttl>60</ttl><item><title>Oracle Partition 分区详细总结(转)</title><link>http://www.blogjava.net/sailor/articles/385814.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Mon, 20 Aug 2012 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/385814.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/385814.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/385814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/385814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/385814.html</trackback:ping><description><![CDATA[
 
此文从以下几个方面来整理关于分区表的概念及操作:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.表空间及分区表的概念<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.表分区的具体作用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.表分区的优缺点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.表分区的几种类型及操作方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.对表分区的维护性操作.<br />(1.) 表空间及分区表的概念<br />表空间：　是一个或多个数据文件的集合，所有的数据对象都存放在指定的表空间中，但主要存放的是表，所以称作表空间。<br />分区表：<br />当表中的数据量不断增大，查询数据的速度就会变慢，应用程序的性能就会下降，这时就应该考虑对表进行分区。表进行分区后，逻辑上表仍然是一张完整的表，只是将表中的数据在物理上存放到多个表空间(物理文件上)，这样查询数据时，不至于每次都扫描整张表。<br /> <br />( 2).表分区的具体作用<br />Oracle的表分区功能通过改善可管理性、性能和可用性，从而为各式应用程序带来了极大的好处。通常，分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务，分区是构建千兆字节数据系统或超高可用性系统的关键工具。<br /> <br />分区功能能够将表、索引或索引组织表进一步细分为段，这些<a class="keylink" href="http://www.2cto.com/database/" target="_blank">数据库</a>对象的段叫做分区。每个分区有自己的名称，还可以选择自己的存储特性。从数据库管理员的角度来看，一个分区后的对象具有多个段，这些段既可进行集体管理，也可单独管理，这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是，从应用程序的角度来看，分区后的表与非分区表完全相同，使用SQL DML 命令访问分区后的表时，无需任何修改。<br /> <br />什么时候使用分区表：<br />1、表的大小超过2GB。<br />2、表中包含历史数据，新的数据被增加都新的分区中。<br /> <br /> (3).表分区的优缺点<br />表分区有以下优点：<br />1、改善查询性能：对分区对象的查询可以仅搜索自己关心的分区，提高检索速度。<br />2、增强可用性：如果表的某个分区出现故障，表在其他分区的数据仍然可用；<br />3、维护方便：如果表的某个分区出现故障，需要修复数据，只修复该分区即可；<br />4、均衡I/O：可以把不同的分区映射到磁盘以平衡I/O，改善整个系统性能。<br /> <br />缺点：<br />分区表相关：已经存在的表没有方法可以直接转化为分区表。不过<a class="keylink" href="http://www.2cto.com/database/Oracle/" target="_blank">Oracle</a> 提供了在线重定义表的功能。<br /> <br />(4).表分区的几种类型及操作方法<br /> 一.范围分区：<br />范围分区将数据基于范围映射到每一个分区，这个范围是你在创建分区时指定的分区键决定的。这种分区方式是最为常用的，并且分区键经常采用日期。举个例子：你可能会将销售数据按照月份进行分区。<br />当使用范围分区时，请考虑以下几个规则：<br />1、每一个分区都必须有一个VALUES LESS THEN子句，它指定了一个不包括在该分区中的上限值。分区键的任何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中。<br />2、所有分区，除了第一个，都会有一个隐式的下限值，这个值就是此分区的前一个分区的上限值。<br />3、在最高的分区中，MAXVALUE被定义。MAXVALUE代表了一个不确定的值。这个值高于其它分区中的任何分区键的值，也可以理解为高于任何分区中指定的VALUE LESS THEN的值，同时包括空值。<br />例一：<br />假设有一个CUSTOMER表，表中有数据200000行，我们将此表通过CUSTOMER_ID进行分区，每个分区存储100000行，我们将每个分区保存到单独的表空间中，这样数据文件就可以跨越多个物理磁盘。下面是创建表和分区的代码，如下：<br />CREATE TABLE CUSTOMER<br />(<br />&nbsp;&nbsp;&nbsp; CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,<br />&nbsp;&nbsp;&nbsp; FIRST_NAME&nbsp; VARCHAR2(30) NOT NULL,<br />&nbsp;&nbsp;&nbsp; LAST_NAME&nbsp;&nbsp; VARCHAR2(30) NOT NULL,<br />&nbsp;&nbsp;&nbsp; PHONE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(15) NOT NULL,<br />&nbsp;&nbsp;&nbsp; EMAIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(80),<br />&nbsp;&nbsp;&nbsp; STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR(1)<br />)<br />PARTITION BY RANGE (CUSTOMER_ID)<br />(<br />&nbsp;&nbsp;&nbsp; PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,<br />&nbsp;&nbsp;&nbsp; PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02<br />)<br />例二：按时间划分<br />CREATE TABLE ORDER_ACTIVITIES<br />(<br />&nbsp;&nbsp;&nbsp; ORDER_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(7) NOT NULL,<br />&nbsp;&nbsp;&nbsp; ORDER_DATE&nbsp;&nbsp;&nbsp; DATE,<br />&nbsp;&nbsp;&nbsp; TOTAL_AMOUNT NUMBER,<br />&nbsp;&nbsp;&nbsp; CUSTOTMER_ID NUMBER(7),<br />&nbsp;&nbsp;&nbsp; PAID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR(1)<br />)<br />PARTITION BY RANGE (ORDER_DATE)<br />(<br />&nbsp; PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01,<br />&nbsp; PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,<br />&nbsp; PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03<br />)<br />例三：MAXVALUE<br />CREATE TABLE RangeTable<br />(<br />&nbsp; idd&nbsp;&nbsp; INT PRIMARY KEY ,<br />&nbsp; iNAME VARCHAR(10),<br />&nbsp; grade INT<br />)<br />PARTITION&nbsp; BY&nbsp; RANGE (grade)<br />(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARTITION&nbsp; part1 VALUES&nbsp; LESS&nbsp; THEN (1000) TABLESPACE&nbsp; Part1_tb,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARTITION&nbsp; part2 VALUES&nbsp; LESS&nbsp; THEN (MAXVALUE) TABLESPACE&nbsp; Part2_tb<br />);<br /> <br />二.列表分区：<br />该分区的特点是某列的值只有几个，基于这样的特点我们可以采用列表分区。<br />例一<br />CREATE TABLE PROBLEM_TICKETS<br />(<br />&nbsp;&nbsp;&nbsp; PROBLEM_ID&nbsp;&nbsp; NUMBER(7) NOT NULL PRIMARY KEY,<br />&nbsp;&nbsp;&nbsp; DESCRIPTION&nbsp; VARCHAR2(2000),<br />&nbsp;&nbsp;&nbsp; CUSTOMER_ID&nbsp; NUMBER(7) NOT NULL,<br />&nbsp;&nbsp;&nbsp; DATE_ENTERED DATE NOT NULL,<br />&nbsp;&nbsp;&nbsp; STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(20)<br />)<br />PARTITION BY LIST (STATUS)<br />(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARTITION PROB_ACTIVE&nbsp;&nbsp; VALUES ('ACTIVE') TABLESPACE PROB_TS01,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02<br />例二<br />CREATE&nbsp; TABLE&nbsp; ListTable<br />(<br />&nbsp;&nbsp;&nbsp; id&nbsp;&nbsp;&nbsp; INT&nbsp; PRIMARY&nbsp; KEY ,<br />&nbsp;&nbsp;&nbsp; name&nbsp; VARCHAR (20),<br />&nbsp;&nbsp;&nbsp; area&nbsp; VARCHAR (10)<br />)<br />PARTITION&nbsp; BY&nbsp; LIST (area)<br />(<br />&nbsp;&nbsp;&nbsp; PARTITION&nbsp; part1 VALUES ('guangdong','beijing') TABLESPACE&nbsp; Part1_tb,<br />&nbsp;&nbsp;&nbsp; PARTITION&nbsp; part2 VALUES ('shanghai','nanjing')&nbsp; TABLESPACE&nbsp; Part2_tb<br />);<br />)<br /> <br />三.散列分区：<br />这类分区是在列值上使用散列算法，以确定将行放入哪个分区中。当列的值没有合适的条件时，建议使用散列分区。<br />散列分区为通过指定分区编号来均匀分布数据的一种分区类型，因为通过在I/O设备上进行散列分区，使得这些分区大小一致。<br />例一：<br />CREATE TABLE HASH_TABLE<br />(<br />&nbsp; COL NUMBER(8),<br />&nbsp; INF VARCHAR2(100)<br />)<br />PARTITION BY HASH (COL)<br />(<br />&nbsp; PARTITION PART01 TABLESPACE HASH_TS01,<br />&nbsp; PARTITION PART02 TABLESPACE HASH_TS02,<br />&nbsp; PARTITION PART03 TABLESPACE HASH_TS03<br />)<br />简写：<br />CREATE TABLE emp<br />(<br />&nbsp;&nbsp;&nbsp; empno NUMBER (4),<br />&nbsp;&nbsp;&nbsp; ename VARCHAR2 (30),<br />&nbsp;&nbsp;&nbsp; sal&nbsp;&nbsp; NUMBER<br />)<br />PARTITION BY&nbsp; HASH (empno) PARTITIONS 8<br />STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);<br /> <br />hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中,hash算法中最重要的是hash函数，Oracle中如果你要使用hash分区，只需指定分区的数量即可。建议分区的数量采用2的n次方，这样可以使得各个分区间数据分布更加均匀。<br /> <br />四.组合范围散列分区<br />这种分区是基于范围分区和列表分区，表首先按某列进行范围分区，然后再按某列进行列表分区，分区之中的分区被称为子分区。<br />CREATE TABLE SALES<br />(<br />PRODUCT_ID VARCHAR2(5),<br />SALES_DATE DATE,<br />SALES_COST NUMBER(10),<br />STATUS VARCHAR2(20)<br />)<br />PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)<br />(<br />&nbsp;&nbsp; PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br />&nbsp;&nbsp; PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />)<br /> <br />五.复合范围散列分区：<br />这种分区是基于范围分区和散列分区，表首先按某列进行范围分区，然后再按某列进行散列分区。<br />create table dinya_test<br /> (<br /> transaction_id number primary key,<br /> item_id number(8) not null,<br /> item_description varchar2(300),<br /> transaction_date date<br /> )<br /> partition by range(transaction_date)subpartition by hash(transaction_id)&nbsp; subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)<br /> (<br />&nbsp;&nbsp;&nbsp;&nbsp; partition part_01 values less than(to_date(&#8216;2006-01-01&#8217;,&#8217;yyyy-mm-dd&#8217;)),<br />&nbsp;&nbsp;&nbsp;&nbsp; partition part_02 values less than(to_date(&#8216;2010-01-01&#8217;,&#8217;yyyy-mm-dd&#8217;)),<br />&nbsp;&nbsp;&nbsp;&nbsp; partition part_03 values less than(maxvalue)<br /> );<br /> <br />(5).有关表分区的一些维护性操作：<br />一、添加分区<br />以下代码给SALES表添加了一个P3分区<br />ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));<br />注意：以上添加的分区界限应该高于最后一个分区界限。<br />以下代码给SALES表的P3分区添加了一个P3SUB1子分区<br />ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');<br />二、删除分区<br />以下代码删除了P3表分区：<br />ALTER TABLE SALES DROP PARTITION P3;<br />在以下代码删除了P4SUB1子分区：<br />ALTER TABLE SALES DROP SUBPARTITION P4SUB1;<br />注意：如果删除的分区是表中唯一的分区，那么此分区将不能被删除，要想删除此分区，必须删除表。<br />三、截断分区<br />截断某个分区是指删除某个分区中的数据，并不会删除分区，也不会删除其它分区中的数据。当表中即使只有一个分区时，也可以截断该分区。通过以下代码截断分区：<br />ALTER TABLE SALES TRUNCATE PARTITION P2;<br />通过以下代码截断子分区：<br />ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;<br />四、合并分区<br />合并分区是将相邻的分区合并成一个分区，结果分区将采用较高分区的界限，值得注意的是，不能将分区合并到界限较低的分区。以下代码实现了P1 P2分区的合并：<br />ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;<br />五、拆分分区<br />拆分分区将一个分区拆分两个新分区，拆分后原来分区不再存在。注意不能对HASH类型的分区进行拆分。<br />ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);<br />六、接合分区(coalesca)<br />结合分区是将散列分区中的数据接合到其它分区中，当散列分区中的数据比较大时，可以增加散列分区，然后进行接合，值得注意的是，接合分区只能用于散列分区中。通过以下代码进行接合分区：<br />ALTER TABLE SALES COALESCA PARTITION;<br />七、重命名表分区<br />以下代码将P21更改为P2<br />ALTER TABLE SALES RENAME PARTITION P21 TO P2;<br />八、相关查询<br />跨分区查询<br />select sum( *) from<br />(select count(*) cn from t_table_SS PARTITION (P200709_1)<br />union all<br />select count(*) cn from t_table_SS PARTITION (P200709_2)<br />);<br />查询表上有多少分区<br />SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'<br />查询索引信息<br />select object_name,object_type,tablespace_name,sum(value)<br />from v$segment_statistics<br />where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'<br />group by object_name,object_type,tablespace_name<br />order by 4 desc<br /> <br />--显示数据库所有分区表的信息：<br />select * from DBA_PART_TABLES<br /> <br />--显示当前用户可访问的所有分区表信息:<br />select * from ALL_PART_TABLES<br /> <br />--显示当前用户所有分区表的信息：<br />select * from USER_PART_TABLES<br /> <br />--显示表分区信息 显示数据库所有分区表的详细分区信息：<br />select * from DBA_TAB_PARTITIONS<br /> <br />--显示当前用户可访问的所有分区表的详细分区信息：<br />select * from ALL_TAB_PARTITIONS<br /> <br />--显示当前用户所有分区表的详细分区信息：<br />select * from USER_TAB_PARTITIONS<br /> <br />--显示子分区信息 显示数据库所有组合分区表的子分区信息：<br />select * from DBA_TAB_SUBPARTITIONS<br /> <br />--显示当前用户可访问的所有组合分区表的子分区信息：<br />select * from ALL_TAB_SUBPARTITIONS<br /> <br />--显示当前用户所有组合分区表的子分区信息：<br />select * from USER_TAB_SUBPARTITIONS<br /> <br />--显示分区列 显示数据库所有分区表的分区列信息：<br />select * from DBA_PART_KEY_COLUMNS<br /> <br />--显示当前用户可访问的所有分区表的分区列信息：<br />select * from ALL_PART_KEY_COLUMNS<br /> <br />--显示当前用户所有分区表的分区列信息：<br />select * from USER_PART_KEY_COLUMNS<br /> <br />--显示子分区列 显示数据库所有分区表的子分区列信息：<br />select * from DBA_SUBPART_KEY_COLUMNS<br /> <br />--显示当前用户可访问的所有分区表的子分区列信息：<br />select * from ALL_SUBPART_KEY_COLUMNS<br /> <br />--显示当前用户所有分区表的子分区列信息：<br />select * from USER_SUBPART_KEY_COLUMNS<br /> <br />--怎样查询出oracle数据库中所有的的分区表<br />select * from user_tables a where a.partitioned='YES'<br /> <br />--删除一个表的数据是<br />truncate table table_name;<br /> <br />--删除分区表一个分区的数据是<br />alter table table_name truncate partition p5;<br /> <br /> <br />【PS】：当update更改数据所属分区时，必须赋予表row movement权限。<br />alter table test_partition_tab enable/disable row movement;<br />update分区字段，改变所属分区，数据在内部变化是经过了源数据插入新分区、新数据更新、源老数据删除的步骤，因此rowid将会改变；数据索引也将重走。	<img src ="http://www.blogjava.net/sailor/aggbug/385814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2012-08-20 10:00 <a href="http://www.blogjava.net/sailor/articles/385814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle时间相关</title><link>http://www.blogjava.net/sailor/articles/366783.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Mon, 19 Dec 2011 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/366783.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/366783.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/366783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/366783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/366783.html</trackback:ping><description><![CDATA[<h3><a href="http://xaajie.iteye.com/blog/436556">Oracle时间相关-(求timestamp类型的时间差）</a> <em class="actions"></em></h3>
<div class="news_tag"><a href="http://www.iteye.com/blogs/tag/Oracle">Oracle</a></div>
<div class="blog_content" id="blog_content">
<p><strong>TIMESTAMP数据类型：</strong>是DATE的扩展，可以存储年、月、日、小时、分钟、秒，同时还可以存储秒的小数部分。</p>
<p>通过to_timestamp函数将date型转成这种类型，来看看它的形式</p>
<p>详见代码：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://xaajie.iteye.com/blog/436556#"><img alt="复制代码" src="http://xaajie.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://xaajie.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://xaajie.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-sql"><li><span class="keyword">SELECT</span><span>&nbsp;TO_TIMESTAMP(</span><span class="string">'2009-7-30'</span><span>,</span><span class="string">'yyyy-mm-dd'</span><span>) &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span><span class="keyword">FROM</span><span>&nbsp;dual&nbsp;&nbsp;</span></span></li></ol></div><pre class="sql" title="Oracle时间相关-(求timestamp类型的时间差）" style="display: none" pre_index="0" source_url="http://xaajie.iteye.com/blog/436556" codeable_type="Blog" codeable_id="436556" name="code">SELECT TO_TIMESTAMP('2009-7-30','yyyy-mm-dd')
  FROM dual</pre>
<p>&nbsp;<br />结果为：30-7月 -09 12.00.00.000000000 上午</p>
<p>&nbsp;</p>
<p><strong>timestamp以日期格式输出表示</strong> ：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://xaajie.iteye.com/blog/436556#"><img alt="复制代码" src="http://xaajie.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://xaajie.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://xaajie.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-sql"><li><span>&nbsp;</span><span class="keyword">select</span><span>&nbsp;TO_CHAR(to_timestamp(</span><span class="string">'2009-7-30'</span><span>,</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>)&nbsp;,</span><span class="string">'YYYY-MM-DD&nbsp;HH24:MI:SS'</span><span>) &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span><span class="keyword">from</span><span>&nbsp;dual&nbsp;&nbsp;</span></span></li></ol></div><pre class="sql" title="Oracle时间相关-(求timestamp类型的时间差）" style="display: none" pre_index="1" source_url="http://xaajie.iteye.com/blog/436556" codeable_type="Blog" codeable_id="436556" name="code">&nbsp;select TO_CHAR(to_timestamp('2009-7-30','yyyy-mm-dd hh24:mi:ss') ,'YYYY-MM-DD HH24:MI:SS')
&nbsp; from dual</pre>
<p>&nbsp;<br />结果为：2009-07-30 00:00:00</p>
<p>&nbsp;</p>
<p><strong>date格式的时间差，以秒为单位：</strong></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://xaajie.iteye.com/blog/436556#"><img alt="复制代码" src="http://xaajie.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://xaajie.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://xaajie.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-sql"><li><span class="keyword">select</span><span>&nbsp;(to_date(</span><span class="string">'2009-7-30'</span><span>,&nbsp;</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>)&nbsp;- &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_date(</span><span class="string">'2009-7-29'</span><span>,&nbsp;</span><span class="string">'YYYY-MM-DD&nbsp;HH24:mi:ss'</span><span>))&nbsp;*&nbsp;86400&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="string">"itvtime"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;</span><span class="keyword">from</span><span>&nbsp;dual&nbsp;&nbsp;</span></span></li></ol></div><pre class="sql" title="Oracle时间相关-(求timestamp类型的时间差）" style="display: none" pre_index="2" source_url="http://xaajie.iteye.com/blog/436556" codeable_type="Blog" codeable_id="436556" name="code">select (to_date('2009-7-30', 'yyyy-mm-dd hh24:mi:ss') -
       to_date('2009-7-29', 'YYYY-MM-DD HH24:mi:ss')) * 86400 as "itvtime"
 from dual</pre>
<p>&nbsp;</p>
<p>结果为：86400</p>
<p>&nbsp;</p>
<p><strong>timestamp格式求时间差，以秒为单位：</strong></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://xaajie.iteye.com/blog/436556#"><img alt="复制代码" src="http://xaajie.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://xaajie.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://xaajie.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-sql"><li><span class="keyword">select</span><span>&nbsp;(to_date(TO_CHAR(to_timestamp(</span><span class="string">'2009-7-30'</span><span>,</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>)&nbsp;,&nbsp;</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>), &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>)&nbsp;- &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_date(TO_CHAR(to_timestamp(</span><span class="string">'2009-7-29'</span><span>,</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>)&nbsp;,&nbsp;</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>), &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">'YYYY-MM-DD&nbsp;HH24:mi:ss'</span><span>))&nbsp;*&nbsp;86400&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="string">"itvtime"</span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;</span><span class="keyword">from</span><span>&nbsp;dual&nbsp;&nbsp;</span></span></li></ol></div><pre class="sql" title="Oracle时间相关-(求timestamp类型的时间差）" style="display: none" pre_index="3" source_url="http://xaajie.iteye.com/blog/436556" codeable_type="Blog" codeable_id="436556" name="code">select (to_date(TO_CHAR(to_timestamp('2009-7-30','yyyy-mm-dd hh24:mi:ss') , 'yyyy-mm-dd hh24:mi:ss'),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'yyyy-mm-dd hh24:mi:ss') -
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to_date(TO_CHAR(to_timestamp('2009-7-29','yyyy-mm-dd hh24:mi:ss') , 'yyyy-mm-dd hh24:mi:ss'),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'YYYY-MM-DD HH24:mi:ss')) * 86400 as "itvtime"
&nbsp;from dual</pre>
<p>&nbsp;结果为：86400</p>
<p>&nbsp;</p>
<p><strong>求任意timestamp格式的时间戳，据1970年01月01日的毫秒数：</strong></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://xaajie.iteye.com/blog/436556#"><img alt="复制代码" src="http://xaajie.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://xaajie.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://xaajie.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-sql"><li><span class="keyword">SELECT</span><span>&nbsp;(to_date(TO_CHAR(to_timestamp(</span><span class="string">'2009-7-30'</span><span>,</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>),&nbsp;</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>),</span><span class="string">'yyyy-mm-dd&nbsp;hh24:mi:ss'</span><span>)&nbsp;- &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to_date(</span><span class="string">'1970-01-01&nbsp;00:00:00'</span><span>,&nbsp;</span><span class="string">'YYYY-MM-DD&nbsp;HH24:mi:ss'</span><span>))&nbsp;*&nbsp;86400000 &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span><span class="keyword">FROM</span><span>&nbsp;dual&nbsp;&nbsp;</span></span></li></ol></div><pre class="sql" title="Oracle时间相关-(求timestamp类型的时间差）" style="display: none" pre_index="4" source_url="http://xaajie.iteye.com/blog/436556" codeable_type="Blog" codeable_id="436556" name="code">SELECT (to_date(TO_CHAR(to_timestamp('2009-7-30','yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') -
       to_date('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:mi:ss')) * 86400000
  FROM dual</pre>
<p>&nbsp;结果为：1248912000000</p>
<p><br /><strong>应用：</strong>具体应用时将例子中to_timestamp()阴影部分代码换成相应字段即可（该字段是timestamp格式）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与得到以分为单位或小时为单位只需要变乘的数即可</p>
<p>虽然实现了时间差的计算，自我感觉比较复杂化，希望找到比较简便的方法。。。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>根据日期求当月天数</strong></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Sql代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://xaajie.iteye.com/blog/436556#"><img alt="复制代码" src="http://xaajie.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://xaajie.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://xaajie.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-sql"><li><span class="keyword">select</span><span>&nbsp;add_months(trunc(to_date(</span><span class="string">'2009-9'</span><span>,&nbsp;</span><span class="string">'yyyy-mm'</span><span>),&nbsp;</span><span class="string">'mm'</span><span>),&nbsp;1)&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;trunc(to_date(</span><span class="string">'2009-9'</span><span>,&nbsp;</span><span class="string">'yyyy-mm'</span><span>),&nbsp;</span><span class="string">'mm'</span><span>) &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span><span class="keyword">from</span><span>&nbsp;dual&nbsp;&nbsp;</span></span></li></ol></div><pre class="sql" title="Oracle时间相关-(求timestamp类型的时间差）" style="display: none" pre_index="5" source_url="http://xaajie.iteye.com/blog/436556" codeable_type="Blog" codeable_id="436556" name="code">select add_months(trunc(to_date('2009-9', 'yyyy-mm'), 'mm'), 1) 
       - trunc(to_date('2009-9', 'yyyy-mm'), 'mm')
  from dual</pre>
<p>&nbsp;</p>
<p>结果为：30</p></div><img src ="http://www.blogjava.net/sailor/aggbug/366783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2011-12-19 17:29 <a href="http://www.blogjava.net/sailor/articles/366783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>solaris 10配置JAVA环境以及安装firefox </title><link>http://www.blogjava.net/sailor/articles/362727.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Sat, 05 Nov 2011 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/362727.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/362727.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/362727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/362727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/362727.html</trackback:ping><description><![CDATA[<h3><span class="link_title"><a title="solaris 10配置JAVA环境以及安装firefox" href="/whuslei/article/details/6320772">solaris 10配置JAVA环境以及安装firefox</a></span> </h3>
<div class="article_manage"><span class="link_categories">分类： <a href="/whuslei/article/category/731600">Solaris 10</a> </span><span class="link_postdate">2011-04-13 06:35</span> <span class="link_view" title="阅读次数">145人阅读</span> <span class="link_comments" title="评论次数"><a href="#comments">评论</a>(0)</span> <span class="link_collect"><a title="收藏" href="javascript:void(0);">收藏</a></span> <span class="link_report"><a title="举报" href="#report">举报</a></span> </div>
<div id="article_content" class="article_content">
<p><strong><font size="2">一、solaris10 上如何配置JAVA环境？</font></strong></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 1、下载。 <br />&nbsp;&nbsp;&nbsp;&nbsp; 访问</font><a href="https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u15-oth-JPR@CDS-CDS_Developer"><font size="2">https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u15-oth-JPR@CDS-CDS_Developer</font></a><font size="2">，选择合适的版本(我们选择solaris sparc)后，有以下几种： <br /></font></p>
<p><a href="http://hi.csdn.net/attachment/201104/13/0_1302679997dD4b.gif"><font size="2"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://hi.csdn.net/attachment/201104/13/0_1302679998G1gW.gif" width="553" height="190" /></font></a><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 不同的包有不同的使用方法。xx.sh这种比较简单，直接./xxx.sh就可以了。执行完后会在当前目录下生成一个jdk1.6.0_15的文件夹，像"绿色版"，如下： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="http://hi.csdn.net/attachment/201104/13/0_1302679999h1Xr.gif"><font size="2"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://hi.csdn.net/attachment/201104/13/0_13026799999OPO.gif" width="691" height="56" /></font></a><font size="2"> <br />&nbsp;&nbsp;&nbsp;&nbsp; 如果是xx.tar.Z，先用 uncompress -cvf *.z|tar -xvf -，如果不行，则再用tar &#8211;xvf xx.tar,解压后的文件夹jdkjdk1.6.0_15文件夹，如下： <br /></font><a href="http://hi.csdn.net/attachment/201104/13/0_1302680001kYtI.gif"><font size="2"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://hi.csdn.net/attachment/201104/13/0_130268000311ds.gif" width="699" height="73" /></font></a><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 需要将这两个包加到pakage中。 <br />&nbsp;&nbsp;&nbsp;&nbsp; 安装：#pkgadd -d&nbsp; SUNWj6rt SUNWj6dev SUNWj6cfg SUNWj6man SUNWj6dmo <br />&nbsp;&nbsp;&nbsp;&nbsp; 卸载：#pkgrm SUNWj6rt SUNWj6dev SUNWj6cfg SUNWj6man SUNWj6dmo</font></p>
<p><font size="2">&nbsp;&nbsp; 2、修改默认为jdk1.6</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; (1) 以xx.sh为例，生成的文件夹jdk1.6.0复制到/usr/jdk目录下 <br />&nbsp;&nbsp;&nbsp;&nbsp; (2) 建立软连接 ln -s /usr/jdk/jdk1.6.0/&nbsp;&nbsp; /usr/java&nbsp;&nbsp;&nbsp; </font><font size="2"><strong>#将前者做一个链接，后者指向前者，后者为链接名 <br /></strong>&nbsp;&nbsp;&nbsp;&nbsp; (3) java &#8211;version 查看是否正确安装 <br /></font></p>
<p><font size="2">&nbsp; 3、安装好CLASSPATH等环境变量 <br />&nbsp;&nbsp;&nbsp;&nbsp; 修改/etc/profile 的内容，加入JAVA_HOME 和 JRE_HOME ，以及</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; CLASSPATH的设定，例如 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAVA_HOME=/usr/java <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export JAVA_HOME</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JRE_HOME=/usr/java/jre <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export JRE_HOME</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export CLASSPATH</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PATH=.:$JAVA_HOME/bin:$JRE_HOME/bin <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export PATH </font></p>
<p><strong><font size="2">二、solaris10 上如何安装firefox</font></strong></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 1、下载。访问</font><a href="http://www.sunfreeware.com/mozilla.html"><font size="2">http://www.sunfreeware.com/mozilla.html</font></a><font size="2">，下载相应版本</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 2、查看网站上的README.firefox3，里面包含的安装的步骤</font></p><pre><font size="2"><font face="Verdana"> 3, First uncompress the zip file <strong>$ bzip2 -d &lt;zip file basename&gt;.bz2</strong> You will get a package datastream file named &lt;zip file basename&gt; 4, Install the package as root <strong># pkgadd -d ./&lt;zip file basename&gt;</strong> The default install location would be <strong>/opt/sfw/lib/firefox</strong></font></font></pre><pre><font size="2" face="Verdana"> 本blog地址：<a href="blog.csdn.com/whuslei" target="_blank">blog.csdn.com/whuslei</a>，版权所有！</font></pre></div><img src ="http://www.blogjava.net/sailor/aggbug/362727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2011-11-05 09:40 <a href="http://www.blogjava.net/sailor/articles/362727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Applciation Server10g启动</title><link>http://www.blogjava.net/sailor/articles/356772.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Thu, 18 Aug 2011 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/356772.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/356772.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/356772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/356772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/356772.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text">
<p><strong>第二章：管理工具</strong></p>
<p>关键两个：OEM和opmn命令：<br /><strong>2.1.1 Managing Oracle Application Server with Oracle Enterprise Manager 10g Application Server Control</strong><br />Oracle Enterprise Manager 10g Application Server Control is installed with every instance of Oracle Application Server. As a result, you can immediately begin managing your application server and its components from your Web browser.</p>
<p>The Enterprise Manager home pages make it easy to locate the most important monitoring data and the most commonly used administrative functions&#8212;all from your Web browser.<br />这是个好东西，并且它提供的帮助更是个好东西。</p>
<p><strong>2.1.2 Managing Oracle Application Server Using the OPMN Command Line</strong><br />You can also use the opmnctl command-line tool, which provides a command-line interface to Oracle Process Manager and Notification Server (OPMN). For example, you can use this command line (opmnctl) to:</p>
<p>l Start and stop applications and application server instances<br />l Associate two or more application server instances to form a cluster<br />l Display a summary of the instances that are part of a cluster</p>
<p><br /><strong>2.1.3 Managing Oracle Application Server Using the admin_client.jar Utility</strong><br />这个用处不大</p>
<p><strong>第三章：Starting and Stopping</strong></p>
<p><strong>3.2 Starting and Stopping Application Server Instances<br />3.2.1 Starting a Middle-Tier Instance</strong><br />To start a middle-tier instance:</p>
<p>If the middle-tier instance is associated with OracleAS Infrastructure services, such as Oracle Identity Management, make sure the services are started. See Section 3.4.3 for more information.</p>
<p>Start the middle-tier components:</p>
<p><font color="#0000ff">(UNIX) ORACLE_HOME/opmn/bin/opmnctl startall<br />(Windows) ORACLE_HOME\opmn\bin\opmnctl startall</font></p>
<p>This command starts OPMN and all OPMN-managed processes such as Oracle HTTP Server, OC4J instances, and the Application Server Control Console.</p>
<p><br /><strong>3.2.2 Stopping a Middle-Tier Instance</strong></p>
<p><font color="#0000ff">(UNIX) ORACLE_HOME/opmn/bin/opmnctl stopall<br />(Windows) ORACLE_HOME\opmn\bin\opmnctl stopall</font></p>
<p><strong>3.3 Starting and Stopping Components</strong><br /><font color="#0000ff">opmnctl: A command-line tool.<br />Application Server Control Console: A Web-based tool. (<strong>OEM</strong>)</font></p>
<p><br /><strong>3.3.1 Starting and Stopping Components Using opmnctl</strong><br />You can use the opmnctl command-line tool to start and stop components. It is located in the following directory:</p>
<p><font color="#0000ff">(UNIX) ORACLE_HOME/opmn/bin<br />(Windows) ORACLE_HOME\opmn\bin</font></p>
<p>To start, stop, or restart a component using opmnctl:</p>
<p><font color="#0000ff">opmnctl stopproc ias-component=component<br />opmnctl startproc ias-component=component<br />opmnctl restartproc ias-component=component</font></p>
<p><font color="#0000ff"><font color="#000000">For example, the following command starts OracleAS Wireless at the &lt;process-set&gt; level:</font><br />prompt &gt; opmnctl startproc ias-component=wireless process-type=alert_server process-set=alert_instance_1</font></p>
<p><font color="#0000ff"><font color="#000000">The following command restarts OC4J at the &lt;process-type&gt; level:</font><br />prompt &gt; opmnctl restartproc ias-component=OC4J process-type=home</font></p>
<p><font color="#0000ff"><font color="#000000">The following command stops Oracle HTTP Server at the &lt;ias-component&gt; level:</font><br />prompt &gt; opmnctl stopproc ias-component=HTTP_Server</font></p>
<p><font color="#0000ff"><font color="#000000">Enter one of the following commands to obtain additional information:</font><br />prompt &gt; opmnctl usage startproc</font></p>
<p><font color="#0000ff"><strong><font color="#000000">在我安装的环境里，通过上面一行我们从帮助中找到：</font><br /><font color="#008080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Values for the target attributes (ias-instance, ias-component,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process-type and process-set) should be the same as the id<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value of each attribute specified in opmn.xml.</font><br /></strong></font><strong><font color="#000000">从opmn.xml可以找到这些ias-component，也可以通过命令：</font><font color="#339966">opmnctl status</font></strong></p>
<p>To start, stop, or restart the sub-process of a component:</p>
<p><font color="#0000ff">opmnctl stopproc process-type=process<br />opmnctl startproc process-type=process<br />opmnctl restartproc process-type=process</font></p>
<p>To start, stop, or restart an application, such as Application Server Control:</p>
<p><font color="#0000ff">opmnctl startproc application=app_name<br />opmnctl stopproc application=app_name<br />opmnctl restartproc application=app_name</font></p>
<p>To view the status of components and processes:</p>
<p><font color="#0000ff">[oracle@ias ~]$ opmnctl status</font></p>
<p><font color="#0000ff">Processes in Instance: ias.ias<br />--------------------------------------+--------------------+---------+---------<br />ias-component&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | process-type&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; pid&nbsp;&nbsp; | status <br />--------------------------------------+--------------------+---------+---------<br />OC4JGroup:default_group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | OC4J:home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 4812 | Alive&nbsp;&nbsp; <br />ASG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ASG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; N/A | Down&nbsp;&nbsp;&nbsp; <br />HTTP_Server&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | HTTP_Server&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 4312 | Alive&nbsp;&nbsp; </font></p>
<p>&nbsp;</p></div><img src ="http://www.blogjava.net/sailor/aggbug/356772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2011-08-18 11:13 <a href="http://www.blogjava.net/sailor/articles/356772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solaris 修改IP,HOSTNAME</title><link>http://www.blogjava.net/sailor/articles/356270.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Wed, 10 Aug 2011 12:00:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/356270.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/356270.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/356270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/356270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/356270.html</trackback:ping><description><![CDATA[@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
<form name="Form1" method="post" action="default.aspx" id="Form1">
    <div>
    <input type="hidden" name="__VIEWSTATE" id="
    __VIEWSTATE" value="" />
    </div>
    <div id="hd_info">
    <div id="cnts">
    <div id="site_nav"><span style="color: #464646; font-family: simsun; font-size: 14px; line-height: 21px; ">一 、更改solaris IP 地址<br />
    ifconfig用来配置网卡的IP地址,改动后即生效,<br />
    但并不保存,下次启动后失效.<br />
    我们以虚拟机来讲.网卡pcn0<br />
    #ifconfig -a<br />
    lo0:.......<br />
    inet 127.0.0.1 netmask ff000000<br />
    pcn0:......<br />
    inet 192.168.229.3 netmask ffffff00 broadcast 192.168.229.225<br />
    ether 0:c:29:ff:2e:1f<br />
    #ipconfig pcn0 192.168.6.6 netmask 255.255.255.0<br />
    #ifconfig -a<br />
    lo0:......<br />
    inet 127.0.0.1 netmask ff000000<br />
    pcn0:......<br />
    inet 192.168.6.6 netmask ffffff00 broadcast 192.168.229.225<br />
    ether 0:c:29:ff:2e:1f<br />
    想要永久更改配置,则要更改配置文件,以网卡pcn0为例:<br />
    要改三个文件<br />
    1./etc/hosts<br />
    2./etc/netmasks<br />
    3./etc/inet/ipnodes<br />
    #more /etc/hostname.pcn0<br />
    sun10<br />
    (查看server的hostname)<br />
    #more /etc/hosts<br />
    127.0.0.1 localhost<br />
    192.168.229.3 sun10 loghost<br />
    (看自己的IP地址)<br />
    (用vi或gedit改在图形界面下很容易)<br />
    #vi /etc/hosts (192.168.229.3改成192.168.6.6就行了)<br />
    #vi /etc/netmasks (把192.168.229.0改成192.168.6.0)<br />
    #vi /etc/inet/ipnodes (192.168.229.3改成192.168.6.6就行了)<br />
    #reboot (over)<br />
    <br />
    永久更改：<br />
    1）编辑文件/etc/hosts，更改相应的ip和主机名（这个主机名与&#8220;ping
    主机名&#8221;相对应，与hostname命令看到的主机名是两回事，可以一样也可以不一样，下面有说明），如果更改了/etc/hosts文件中的主机名，相应的也要更改/etc/hostname.hme0文件中的主机名，也就是说文件/etc/hosts与/etc/hostname.hme0中的主机名应该一致；<br />
    2）编辑文件/etc/netmasks,编辑相应ip的子网掩码；<br />
    3）在命令行下执行如下命令，使新ip马上生效<br />
    #ifconfig&nbsp;<wbr>&nbsp;<wbr> hme0 inet ip_address
    netmask 子网掩码 up<br />
    二 、更改主机名<br />
    永久更改：<br />
    编辑文件/etc/nodename，输入新的文件名即可，重起或在命令行下执行&#8220; hostname
    新的主机名&#8221;，即可看到新的主机名已经生效了；<br />
    确保下面文件中的主机名一致<br />
    /etc/hosts<br />
    /etc/hostname.hme0<br />
    /etc/nodename<br />
    /etc/net/ticots/hosts<br />
    /etc/net/ticotsord/hosts<br />
    /etc/net/tilts/hosts<br />
    三 、更改网关<br />
    编辑或新建文件/etc/defaultrouter,输入网关ip地址即可，同时在命令行下输入&#8220;route add default
    gateway IP地址&#8221;，新的网关即可马上生效了；<br />
    四 、 增加一个虚拟ip（即在一个网卡上增加第二个ip）<br />
    1）假如系统网卡名称是/etc/hostname.hme0,再增加一个文件，/etc/hostname.hme0:1,文件内容为test；<br />
    2）在/etc/hosts文件中增加一行纪录，&#8220;192.168.100.1&nbsp;<wbr>&nbsp;<wbr>
    test&#8221;,假设新的ip为192.168.10.1 主机名为test；<br />
    3）在/etc/netsmasks文件中增加一行纪录
    &#8220;192.168.100.0&nbsp;<wbr>&nbsp;<wbr>
    255.255.255.0&#8221;；<br />
    4)重起即可生效了；<br />
    五、DNS设置<br />
    1.修改/etc/resolv.conf<br />
    #vi /etc/resolv.conf<br />
    加入一条<br />
    nameserver 202.96.209.133 (上海DNS地址，你可以根据本地的ISP地址自己设置)<br />
    2.修改/etc/nsswitch.conf,如没有，用cp nsswitch.dns nsswitch.conf<br />
    将host: files 那行改成<br />
    host: files dns<br />
    也就是加一个dns<br />
    3.修改/etc/defaultrouter<br />
    defaultrouter 192.168.0.1&nbsp;<wbr>&nbsp;<wbr>
    (你的网关地址，也就是TCP/IP下的default gateway)<br />
    修改完后重新启动<br />
    init 5<br />
    应该OK了。<br />
    注意，如果你用的VM，修改本机的IP地址的时候不要用ifconfig hme0
    的方式来修改IP地址而最好用修改/etc/hosts的方法。</span></div>
    </div>
    </div>
    <div id="authors">
    <h3>
<script type="text/javascript">
if (c_enable_dfp){
try{
  GA_googleFillSlot("blogjava_home_left");
  } catch (e) { }
 }
</script><script src="http://pubads.g.doubleclick.net/gampad/ads?correlator=1312977592373&amp;output=json_html&amp;callback=GA_googleSetAdContentsBySlotForSync&amp;impl=s&amp;prev_afc=1&amp;pstok=Ci8EJXdDTY0KBRDA07wE&amp;client=ca-pub-4210569241504288&amp;slotname=blogjava_home_left&amp;page_slots=blogjava_home_top_banner%2Cblogjava_home_left&amp;cookie=ID%3D1e3dec73ced5f241%3AT%3D1312977549%3AS%3DALNI_MYTJh37-6PhMrINs3WPeRsvOVXNVg&amp;cookie_enabled=1&amp;cdm=www.blogjava.net&amp;url=http%3A%2F%2Fwww.blogjava.net%2FCuteSoft_Client%2FCuteEditor%2FLoad.ashx%3Ftype%3Ddialog%26file%3Dgecko_pasteword.htm&amp;ref=http%3A%2F%2Fwww.blogjava.net%2FCuteSoft_Client%2FCuteEditor%2FLoad.ashx%3Ftype%3Ddialog%26file%3Dgecko_pasteword.htm&amp;lmt=1312948793&amp;dt=1312977593483&amp;cc=2&amp;biw=1423&amp;bih=689&amp;ifi=2&amp;ifk=1162796148&amp;adk=4012565947&amp;u_tz=480&amp;u_his=6&amp;u_java=true&amp;u_h=900&amp;u_w=1440&amp;u_ah=840&amp;u_aw=1440&amp;u_cd=32&amp;u_nplug=10&amp;u_nmime=27&amp;flash=10.3.181&amp;gads=v2&amp;ga_vid=1773357423.1312977569&amp;ga_sid=1312977569&amp;ga_hid=1021020888&amp;ga_fc=true"></script></h3>
</div>
</form>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/sailor/aggbug/356270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2011-08-10 20:00 <a href="http://www.blogjava.net/sailor/articles/356270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle db-link</title><link>http://www.blogjava.net/sailor/articles/346924.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Thu, 24 Mar 2011 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/346924.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/346924.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/346924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/346924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/346924.html</trackback:ping><description><![CDATA[<div>CREATE PUBLIC DATABASE LINK sxst03<span style="filter: glow(color=#FF0000,strength=3); line-height: 1.3em; display: inline-block; color: #ffffff">（连接名称）</span> CONNECT TO sxdznydfd<span style="filter: glow(color=#FF0000,strength=3); line-height: 1.3em; display: inline-block; color: #ffffff">（用户名）</span> IDENTIFIED BY sxdznydfd <span style="filter: glow(color=#FF0000,strength=3); line-height: 1.3em; display: inline-block; color: #ffffff">（密码）</span>USING <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'(DESCRIPTION = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS_LIST = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.3<span style="filter: glow(color=#FF0000,strength=3); line-height: 1.3em; display: inline-block; color: #ffffff">（数据库所在机子的名称或IP）</span>)(PORT = 1521)) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(CONNECT_DATA = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SERVICE_NAME = sxst<span style="filter: glow(color=#FF0000,strength=3); line-height: 1.3em; display: inline-block; color: #ffffff">（要连接数据库的SID）</span>) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)' <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是查询时的写法，在表名后增加 <span style="text-decoration: underline"><span style="line-height: 1.3em; color: #0000ff">@sxst03</span></span>&nbsp;&nbsp;<span style="filter: glow(color=#FF0000,strength=3); line-height: 1.3em; display: inline-block; color: #ffffff">(@加上上面建立的连接名称) <br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select * from&nbsp;&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#100;&#101;&#46;&#84;&#97;&#98;&#108;&#101;&#95;&#82;&#101;&#103;&#105;&#115;&#116;&#114;&#121;&#64;&#115;&#120;&#115;&#116;&#48;&#51;" target="_blank">sde.Table_Registry@sxst03</a> where table_name='N2007E2003140411000B00XJLYD'</div>
<img src ="http://www.blogjava.net/sailor/aggbug/346924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2011-03-24 11:16 <a href="http://www.blogjava.net/sailor/articles/346924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>orale忘记密码破解</title><link>http://www.blogjava.net/sailor/articles/323065.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Tue, 08 Jun 2010 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/323065.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/323065.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/323065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/323065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/323065.html</trackback:ping><description><![CDATA[<p>SQL&gt;coon /as sysdba<br />
SQL&gt;shutdown<br />
SQL&gt;startup<br />
SQL&gt;alter user sys identified by hand2009</p>
<img src ="http://www.blogjava.net/sailor/aggbug/323065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2010-06-08 15:34 <a href="http://www.blogjava.net/sailor/articles/323065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用OPI读取Excle文件</title><link>http://www.blogjava.net/sailor/articles/293588.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Wed, 02 Sep 2009 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/293588.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/293588.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/293588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/293588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/293588.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、读取文件&nbsp;/**&nbsp;*//**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;导入方法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;&nbsp;&nbsp;&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/sailor/articles/293588.html'>阅读全文</a><img src ="http://www.blogjava.net/sailor/aggbug/293588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-09-02 13:44 <a href="http://www.blogjava.net/sailor/articles/293588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR 的 Converter 实现原理简单分析及应用 </title><link>http://www.blogjava.net/sailor/articles/292464.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Mon, 24 Aug 2009 15:12:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/292464.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/292464.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/292464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/292464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/292464.html</trackback:ping><description><![CDATA[<p>我们在应用 DWR 调用远程方法时涉及到 JS 与 JAVA 之间参数和返回值的数据转换，例如：<br />
<br />
JS 的 123 与 Java 的 int&nbsp; 或 Integer、long 间的转换<br />
JS 的 "2009-06-23" 与 Java 的 java.util.Date 之间的转换<br />
JS 的 "[1,2,3]" 与 Java 的 int[] 间的转换<br />
JS 的 "{id:123, name: 'Unmi'}" 与 Java 的 Class Person{int id; String name} 间的转换<br />
<br />
或者更复杂的嵌套类型( "{id:123, name: 'Unmi', blogs:['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}" ) 与 Java 类型间的转换，等等。那么这一切是怎么进行的呢？其实我们见识过很多组件的类型映射，如 Java 的 PropertyEditor、Hibernate(UserType)、iBatis(TypeHandler) 的类型映射，Struts1/2 中 Form/Model 用的 Converter 等。<br />
<br />
这里我来稍稍分析 DWR 的 Converter 实现，以及说明如何定制自己的 Converter。本文所用 DWR 是 2.0.5 版。<br />
<br />
<strong>1. DWR 内置的 Converter 及应用类型</strong><br />
<br />
<table style="border-collapse: collapse" border="1" cellspacing="0" bordercolor="black" cellpadding="5" width="700" align="center">
    <tbody>
        <tr>
            <td><strong>名称</strong></td>
            <td><strong>应用类型</strong></td>
            <td><strong>转换器</strong></td>
        </tr>
        <tr>
            <td>null</td>
            <td>void，java.lang.Void</td>
            <td>NullConverter</td>
        </tr>
        <tr>
            <td>enum</td>
            <td>&nbsp;</td>
            <td>EnumConverter</td>
        </tr>
        <tr>
            <td>primitive</td>
            <td>boolean,byte,short,int,long,float,double,char,<br />
            java.lang.Boolean,java.lang.Byte,java.lang.Short,<br />
            java.lang.Integer,java.lang.Long,java.lang.Float,<br />
            java.lang.Double,java.lang.Character</td>
            <td>PrimitiveConverter</td>
        </tr>
        <tr>
            <td>bignumber</td>
            <td>java.math.BigInteger,java.math.BigDecimal</td>
            <td>BigNumberConverter</td>
        </tr>
        <tr>
            <td>string</td>
            <td>java.lang.String</td>
            <td>StringConverter</td>
        </tr>
        <tr>
            <td>array</td>
            <td>[Z,[B,[S,[I,[J,[F,[D,[C,[L*</td>
            <td>ArrayConverter</td>
        </tr>
        <tr>
            <td>map</td>
            <td>java.util.Map</td>
            <td>MapConverter</td>
        </tr>
        <tr>
            <td>collection</td>
            <td>java.util.Collection</td>
            <td>CollectionConverter</td>
        </tr>
        <tr>
            <td>date</td>
            <td>java.util.Date,java.sql.Date,java.sql.Time,<br />
            java.sql.Timestamp,java.util.Calendar</td>
            <td>DateConverter</td>
        </tr>
        <tr>
            <td>dom</td>
            <td>org.w3c.dom.Node,org.w3c.dom.Element,org.w3c.dom.Document</td>
            <td>DOMConverter</td>
        </tr>
        <tr>
            <td>dom4j</td>
            <td>org.dom4j.Document,org.dom4j.Element,org.dom4j.Node</td>
            <td>DOM4JConverter</td>
        </tr>
        <tr>
            <td>jdom</td>
            <td>org.jdom.Document,org.jdom.Element</td>
            <td>JDOMConverter</td>
        </tr>
        <tr>
            <td>xom</td>
            <td>nu.xom.Document,nu.xom.Element,nu.xom.Node</td>
            <td>XOMConverter</td>
        </tr>
        <tr>
            <td>servlet</td>
            <td>javax.servlet.ServletConfig,javax.servlet.ServletContext,<br />
            javax.servlet.http.HttpServletRequest,<br />
            javax.servlet.http.HttpServletResponse,<br />
            javax.servlet.http.HttpSession</td>
            <td>ServletConverter</td>
        </tr>
        <tr>
            <td>bean</td>
            <td>&nbsp;</td>
            <td>BeanConverter</td>
        </tr>
        <tr>
            <td>object</td>
            <td>&nbsp;</td>
            <td>ObjectConverter</td>
        </tr>
        <tr>
            <td>hibernate2</td>
            <td>&nbsp;</td>
            <td>H2BeanConverter</td>
        </tr>
        <tr>
            <td>hibernate3</td>
            <td>&nbsp;</td>
            <td>H3BeanConverter</td>
        </tr>
        <tr>
            <td>url</td>
            <td>java.net.URL</td>
            <td>URLConverter</td>
        </tr>
        <tr>
            <td>exception</td>
            <td>&nbsp;</td>
            <td>ExceptionConverter</td>
        </tr>
        <tr>
            <td>miniException</td>
            <td>java.lang.Throwable</td>
            <td>MinimalistExceptionConverter</td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
它们是应用启动的时候，通过 org.directwebremoting.servlet.DwrServlet&nbsp;初始化 dwr-2.0.5.jar!/org/directwebremoting/dwr.xml 文件加载进来的。例如：<br />
<br />
&lt;converter id="date" class="org.directwebremoting.convert.DateConverter"/&gt;　注册了 date 转换器<br />
&lt;convert converter="date" match="java.util.Date"/&gt;　应用注册的 date 转换器应用到 java.util.Date 类型<br />
<br />
看到上面，你也许会惊讶一下，我们平时可能也就用下 bean 转换器，其他用内置就行。然而 DWR 确为我们考虑的很周到的，包括 hibernate 相关的，URL、Servlet、Dom 等相关类型的转换器。<br />
<br />
<strong>2. DWR 如何确定用哪个 Converter?<br />
</strong><br />
DWR 是根据方法参数来确定入口参数的 Converter、根据返回值类型确定传向 JS 的出口参数的 Converter。总之是以 Java 方法原型为基准来决定每一参数或返回值各自用哪个 Converter 来转换数据。<br />
<br />
在 BaseCallMarshaller.marshallInbound(HttpServletRequest request, HttpServletResponse response) 方法中，使用<br />
<br />
Class paramType = method.getParameterTypes()[j] 来获得参数的类型，然后从已加载的 Converter Map 中找到 Converter 名称，进而确定 Converter 类名。</p>
<p>而确定返回值类型就不是直接用反射的 method.getReturnType()。而是以反射方式调用方法后，根据具体返回值的类型来确定的。见：<br />
<br />
Replay DefaultRemoter.execute(Call) 方法中的<br />
Object reply = chain.doFilter(object, method, call.getParameters());　再进入到<br />
Object ExecuteAjaxFilter.doFilter(Object obj, Method method, Object[] params Ajax FilterChain){<br />
&nbsp;&nbsp;&nbsp; &nbsp; return method.invoke(obj, params);<br />
}<br />
<br />
就是根据上面的返回值，然后在<br />
<br />
DefaultConverterManager.convertOutbound(Object, OutboundContext) 方法中的<br />
<br />
Converter converter = getConverter(object); 　//根据返回值 object&nbsp; 确定该用的 Converter。<br />
<br />
<strong>3. DWR Converter 的调用</strong><br />
<br />
多留意下 DWR 自带的 Converter，可以看到所有的 Converter 直接或简接的 extends BaseV20Converter implements Converter，其实 BaseV20Converter(DWR 1.x 中对应为 BaseV10Converter) 本身就实现了 Converter。在 BaseV20Converter 抽象类中默认实现了 Converter 的方法<br />
<br />
public void setConverterManager(ConverterManager config)&nbsp;&nbsp;{&nbsp; }<br />
<br />
具体的 Converter 只要专心去实现接口 Converter 中的另两个方法:<br />
<br />
Object convertInbound(Class paramType, InboundVariable data, InboundContext inctx) throws MarshallException;<br />
OutboundVariable convertOutbound(Object data, OutboundContext outctx) throws MarshallException;<br />
<br />
运行时，它们相应的被 ConvertManager(默认为 DefaultConvertManager) 的<br />
Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx, TypeHintContext incc) throws MarshallException<br />
OutboundVariable convertOutbound(Object object, OutboundContext outctx) throws MarshallException<br />
来调用。<br />
<br />
DWR 对每个参数或返回值至少会应用一次 Converter，但对于复杂的类型会递归的调用 Converter，比如，要完成<br />
<br />
JS "{id:123, name: 'Unmi', blogs:['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}"&nbsp; 到 Java 的 Person{int id, String name, String[] blogs;} 的转换，就会使用到 bean-&gt;primitive-&gt;array 三个 Converter。<br />
<br />
<strong>4. 定制自己的 Converter</strong><br />
<br />
基本上 DWR&nbsp; 内置的 Converter 就够用的，但也有可能需要定定自己的 Converter。从 DWR 的 Converter 实现来看，一般会用两种方式：<br />
<br />
1) extends BaseV20Converter implements Converter，实现 Converter 的 converterInbound() 和 converterOutbound() 方法<br />
2) extends BasicObjectConverter implements Converter，或继承 BeanConverter，实现 BasicObjectConverter 的 getPropertyMapFromObject()，getPropertyMapFromObject() 和 createTypeHintContext() 方法。<br />
<br />
前一种方式，请参照 org.directwebremoting.convert.DateConverter 的源码实现：<br />
<br />
convertInbound() 由 JS 的字符串转换成要求的 Date、Time、Timestamp 或 Calender 对像。<br />
convertOubound() 把 Java 的类型转换成 JS 的 new Date() 类型，注意返回值的写法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new SimpleOutboundVariable("new Date(" + millis + ")", outctx, true);</p>
<p>第二种继承 BasicObjectConverter 或是 BeanConverter 的做法，可参考 BeanConverter&nbsp; 的源码实现。表现在 JSON 和 Java 对象间的转换，要是引入解析 JSON 的 JAR 包或许能有不少帮助。<br />
<br />
定制 Converter 的内容讲的很少，主要是真有这方面的需要的时候请参考 DWR&nbsp;&nbsp;的相关源码，实际中理解各个接口方法参数的意义，及返回值的要求。对待开源组件还是要保持阅读源码的好习惯。<br />
<br />
好啦，自己的 Converter 写好，需要注册，需要应用。我们还是参考 DWR 的做法，写在自己的 dwr.xml 中。例如定制了 com.unmi.dwr.converter.SpecialConverter，要对 com.unmi.model.SpecialObject 进行出入类型的转换，就这么写：<br />
<br />
&lt;converter id="special" class="com.unmi.dwr.converter.SpecialConverter"/&gt;　注册了&nbsp;special 转换器<br />
&lt;convert converter="special" match="com.unmi.model.SpecialObject"/&gt;　应用注册的 special 转换器应用到 com.unmi.model.SpecialObject &nbsp;类型<br />
<br />
<strong>5. 小结</strong><br />
<br />
用 DWR&nbsp;其实也有段时日了，未曾系统的学，总是遇一问题、扫除一个，不免也会去找找相关更系统的资料。然而着下此篇的动机是上周六在书城翻了下 《 DWR 实战》，它实际讲 DWR 本身的较少。最后我第一个想了解了是 DWR 能完成 JS 与 Java 间什么类型的转换，第一手的资料网上也没搜索到，于是进到源码中去，亲身历练，也更加深了印象。<br />
<br />
读者也许和我一样目的，只想看看内置的转换器有哪些，能转换哪些类型，那就只需看最为抢眼的那张表格吧。需要定制 Converter 应该很少，就像我们很少定制 Struts 的 Converter、Hibernate 的 UserType 和 iBatis 的 TypeHandler 一样。因此也就对定制 DWR 的 Converter 所用篇幅不多。<br />
<br />
对待开源，自己总有个习惯就是必须有相关的源代码伴随在它身边。开源组件的使用一般不难，碰到问题，既然源码都掌握了，我想总能从源码中找出原因来。尚且，对这样的知名组件越发深入，就更能嚼出许多味多。<br />
<br />
<br />
参考：DWR 2.0.5 的源代码，对 DWR 项目进行单步调试</p>
<p><br />
原文：<a href="http://www.blogjava.net/Unmi/archive/2009/06/23/283741.html">http://www.blogjava.net/Unmi/archive/2009/06/23/283741.html</a></p>
 <img src ="http://www.blogjava.net/sailor/aggbug/292464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-08-24 23:12 <a href="http://www.blogjava.net/sailor/articles/292464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>参考资料</title><link>http://www.blogjava.net/sailor/articles/292399.html</link><dc:creator>sailor</dc:creator><author>sailor</author><pubDate>Mon, 24 Aug 2009 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/sailor/articles/292399.html</guid><wfw:comment>http://www.blogjava.net/sailor/comments/292399.html</wfw:comment><comments>http://www.blogjava.net/sailor/articles/292399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sailor/comments/commentRss/292399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sailor/services/trackbacks/292399.html</trackback:ping><description><![CDATA[1、J2EE介绍<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j2ee/"><font color="#000000">参考文件：</font>http://www.ibm.com/developerworks/cn/java/j2ee/</a> <br />
<br />
2、Cache技术――OSCache<br />
&nbsp;&nbsp;&nbsp;
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: Arial">Cache</span><span style="font-size: 10pt; font-family: 宋体">是一种用于<span style="color: red">提高系统响应速度</span>、<span style="color: red">改善系统运行性能</span>的技术。尤其是在</span><span style="font-size: 10pt; font-family: Arial">Web</span><span style="font-size: 10pt; font-family: 宋体">应用中，通过缓存页面的输出结果，可以很显著的改善系统运行性能。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: 宋体">OSCache标记库由OpenSymphony设计，它是一种开创性的缓存方案，它提供了在现有JSP页面之内实现内存缓存的功能。OSCache是个一个被广泛采用的高性能的J2EE缓存框架，OSCache还能应用于任何Java应用程序的普通的缓存解决方案。</span></p>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://aumy2008.blogbus.com/logs/36462858.html">参考文件：http://aumy2008.blogbus.com/logs/36462858.html</a>
<img src ="http://www.blogjava.net/sailor/aggbug/292399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sailor/" target="_blank">sailor</a> 2009-08-24 15:52 <a href="http://www.blogjava.net/sailor/articles/292399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>