??xml version="1.0" encoding="utf-8" standalone="yes"?> TIMESTAMP数据cdQ?/strong>是DATE的扩展,可以存储q、月、日、小时、分钟、秒Q同时还可以存储U的数部分?/p>
通过to_timestamp函数date型{成这U类型,来看看它的Ş?/p>
详见代码Q?/p>
timestamp以日期格式输C?/strong> Q?/p>
date格式的时间差Q以Uؓ单位Q?/strong> l果为:86400 timestamp格式求时间差Q以Uؓ单位Q?/strong> l果为:86400 求Q意timestamp格式的时间戳Q据1970q?1?1日的毫秒敎ͼ l果为:1248912000000 与得C分ؓ单位或小时ؓ单位只需要变乘的数即?/p>
虽然实现了时间差的计,自我感觉比较复杂化,希望扑ֈ比较便的Ҏ。。?/p>
Ҏ日期求当月天?/strong> l果为:30 一、solaris10 上如何配|JAVA环境Q?/font> 1、下载? 2、修攚w认ؓjdk1.6 (1) 以xx.shZQ生成的文g夹jdk1.6.0复制?usr/jdk目录? 3、安装好CLASSPATH{环境变? CLASSPATH的设定,例如 JRE_HOME=/usr/java/jre CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib PATH=.:$JAVA_HOME/bin:$JRE_HOME/bin 二、solaris10 上如何安装firefox 1、下载。访?/font>http://www.sunfreeware.com/mozilla.htmlQ下载相应版?/font> 2、查看网站上的README.firefox3Q里面包含的安装的步?/font> W二章:理工具 关键两个QOEM和opmn命oQ?br />2.1.1 Managing Oracle Application Server with Oracle Enterprise Manager 10g Application Server Control The Enterprise Manager home pages make it easy to locate the most important monitoring data and the most commonly used administrative functions—all from your Web browser. 2.1.2 Managing Oracle Application Server Using the OPMN Command Line l Start and stop applications and application server instances W三章:Starting and Stopping 3.2 Starting and Stopping Application Server Instances 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. Start the middle-tier components: (UNIX) ORACLE_HOME/opmn/bin/opmnctl startall This command starts OPMN and all OPMN-managed processes such as Oracle HTTP Server, OC4J instances, and the Application Server Control Console. (UNIX) ORACLE_HOME/opmn/bin/opmnctl stopall 3.3 Starting and Stopping Components (UNIX) ORACLE_HOME/opmn/bin To start, stop, or restart a component using opmnctl: opmnctl stopproc ias-component=component For example, the following command starts OracleAS Wireless at the <process-set> level: The following command restarts OC4J at the <process-type> level: The following command stops Oracle HTTP Server at the <ias-component> level: Enter one of the following commands to obtain additional information: 在我安装的环境里Q通过上面一行我们从帮助中找刎ͼ To start, stop, or restart the sub-process of a component: opmnctl stopproc process-type=process To start, stop, or restart an application, such as Application Server Control: opmnctl startproc application=app_name To view the status of components and processes: [oracle@ias ~]$ opmnctl status Processes in Instance: ias.ias
2.表分区的具体作用
3.表分区的优缺?br /> 4.表分区的几种cd及操作方?br /> 5.对表分区的维护性操?
(1.) 表空间及分区表的概念
表空_ 是一个或多个数据文g的集合,所有的数据对象都存攑֜指定的表I间中,但主要存攄是表Q所以称作表I间?br />分区表:
当表中的数据量不断增大,查询数据的速度׃变慢Q应用程序的性能׃下降Q这时就应该考虑对表q行分区。表q行分区后,逻辑上表仍然是一张完整的表,只是表中的数据在物理上存放到多个表I间(物理文g?Q这h询数据时Q不至于每次都扫描整张表?br />
( 2).表分区的具体作用
Oracle的表分区功能通过改善可管理性、性能和可用性,从而ؓ各式应用E序带来了极大的好处。通常Q分区可以某些查询以及l护操作的性能大大提高。此?分区q可以极大简化常见的理dQ分区是构徏千兆字节数据pȝ或超高可用性系l的关键工具?br />
分区功能能够表、烦引或索引l织表进一步细分ؓD,q些数据?/a>对象的段叫做分区。每个分区有自己的名Uͼq可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段Q这些段既可q行集体理Q也可单独管理,q就使数据库理员在理分区后的对象时有相当大的灉|性。但是,从应用程序的角度来看Q分区后的表与非分区表完全相同,使用SQL DML 命o讉K分区后的表时Q无需M修改?br />
什么时候用分Q?br />1、表的大超q?GB?br />2、表中包含历史数据,新的数据被增加都新的分区中?br />
(3).表分区的优缺?br />表分区有以下优点Q?br />1、改善查询性能Q对分区对象的查询可以仅搜烦自己兛_的分区,提高索速度?br />2、增强可用性:如果表的某个分区出现故障Q表在其他分区的数据仍然可用Q?br />3、维护方便:如果表的某个分区出现故障Q需要修复数据,只修复该分区卛_Q?br />4、均衡I/OQ可以把不同的分区映到盘以^衡I/OQ改善整个系l性能?br />
~点Q?br />分区表相养I已经存在的表没有Ҏ可以直接转化为分。不q?a class="keylink" target="_blank">Oracle 提供了在UK定义表的功能?br />
(4).表分区的几种cd及操作方?br /> 一.范围分区Q?br />范围分区数据基于范围映到每一个分区,q个范围是你在创建分区时指定的分区键军_的。这U分区方式是最为常用的Qƈ且分区键l常采用日期。D个例子:你可能会销售数据按照月份进行分区?br />当用范围分区时Q请考虑以下几个规则Q?br />1、每一个分区都必须有一个VALUES LESS THEN子句Q它指定了一个不包括在该分区中的上限倹{分区键的Q何值等于或者大于这个上限值的记录都会被加入到下一个高一些的分区中?br />2、所有分区,除了W一个,都会有一个隐式的下限|q个值就是此分区的前一个分区的上限倹{?br />3、在最高的分区中,MAXVALUE被定义。MAXVALUE代表了一个不定的倹{这个值高于其它分Z的Q何分区键的|也可以理解ؓ高于M分区中指定的VALUE LESS THEN的|同时包括I倹{?br />例一Q?br />假设有一个CUSTOMER表,表中有数?00000行,我们此表通过CUSTOMER_IDq行分区Q每个分区存?00000行,我们每个分Z存到单独的表I间中,q样数据文g可以跨多个物理磁盘。下面是创徏表和分区的代码,如下Q?br />CREATE TABLE CUSTOMER
(
CUSTOMER_ID NUMBER NOT NULL PRIMARY KEY,
FIRST_NAME VARCHAR2(30) NOT NULL,
LAST_NAME VARCHAR2(30) NOT NULL,
PHONE VARCHAR2(15) NOT NULL,
EMAIL VARCHAR2(80),
STATUS CHAR(1)
)
PARTITION BY RANGE (CUSTOMER_ID)
(
PARTITION CUS_PART1 VALUES LESS THAN (100000) TABLESPACE CUS_TS01,
PARTITION CUS_PART2 VALUES LESS THAN (200000) TABLESPACE CUS_TS02
)
例二Q按旉划分
CREATE TABLE ORDER_ACTIVITIES
(
ORDER_ID NUMBER(7) NOT NULL,
ORDER_DATE DATE,
TOTAL_AMOUNT NUMBER,
CUSTOTMER_ID NUMBER(7),
PAID CHAR(1)
)
PARTITION BY RANGE (ORDER_DATE)
(
PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACEORD_TS01,
PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02,
PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03
)
例三QMAXVALUE
CREATE TABLE RangeTable
(
idd INT PRIMARY KEY ,
iNAME VARCHAR(10),
grade INT
)
PARTITION BY RANGE (grade)
(
PARTITION part1 VALUES LESS THEN (1000) TABLESPACE Part1_tb,
PARTITION part2 VALUES LESS THEN (MAXVALUE) TABLESPACE Part2_tb
);
?列表分区Q?br />该分区的特点是某列的值只有几个,Zq样的特Ҏ们可以采用列表分区?br />例一
CREATE TABLE PROBLEM_TICKETS
(
PROBLEM_ID NUMBER(7) NOT NULL PRIMARY KEY,
DESCRIPTION VARCHAR2(2000),
CUSTOMER_ID NUMBER(7) NOT NULL,
DATE_ENTERED DATE NOT NULL,
STATUS VARCHAR2(20)
)
PARTITION BY LIST (STATUS)
(
PARTITION PROB_ACTIVE VALUES ('ACTIVE') TABLESPACE PROB_TS01,
PARTITION PROB_INACTIVE VALUES ('INACTIVE') TABLESPACE PROB_TS02
例二
CREATE TABLE ListTable
(
id INT PRIMARY KEY ,
name VARCHAR (20),
area VARCHAR (10)
)
PARTITION BY LIST (area)
(
PARTITION part1 VALUES ('guangdong','beijing') TABLESPACE Part1_tb,
PARTITION part2 VALUES ('shanghai','nanjing') TABLESPACE Part2_tb
);
)
?散列分区Q?br />q类分区是在列g使用散列法Q以定行攑օ哪个分区中。当列的值没有合适的条gӞ使用散列分区?br />散列分区为通过指定分区~号来均匀分布数据的一U分区类型,因ؓ通过在I/O讑֤上进行散列分区,使得q些分区大小一致?br />例一Q?br />CREATE TABLE HASH_TABLE
(
COL NUMBER(8),
INF VARCHAR2(100)
)
PARTITION BY HASH (COL)
(
PARTITION PART01 TABLESPACE HASH_TS01,
PARTITION PART02 TABLESPACE HASH_TS02,
PARTITION PART03 TABLESPACE HASH_TS03
)
写:
CREATE TABLE emp
(
empno NUMBER (4),
ename VARCHAR2 (30),
sal NUMBER
)
PARTITION BY HASH (empno) PARTITIONS 8
STORE IN (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);
hash分区最主要的机制是Ҏhash法来计具体某条纪录应该插入到哪个分区?hash法中最重要的是hash函数QOracle中如果你要用hash分区Q只需指定分区的数量即可。徏议分区的数量采用2的nơ方Q这样可以得各个分区间数据分布更加均匀?br />
?l合范围散列分区
q种分区是基于范围分区和列表分区Q表首先按某列进行范围分区,然后再按某列q行列表分区Q分Z中的分区被称为子分区?br />CREATE TABLE SALES
(
PRODUCT_ID VARCHAR2(5),
SALES_DATE DATE,
SALES_COST NUMBER(10),
STATUS VARCHAR2(20)
)
PARTITION BY RANGE(SALES_DATE) SUBPARTITION BY LIST (STATUS)
(
PARTITION P1 VALUES LESS THAN(TO_DATE('2003-01-01','YYYY-MM-DD'))TABLESPACE rptfact2009
(
SUBPARTITION P1SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
SUBPARTITION P1SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
),
PARTITION P2 VALUES LESS THAN (TO_DATE('2003-03-01','YYYY-MM-DD')) TABLESPACE rptfact2009
(
SUBPARTITION P2SUB1 VALUES ('ACTIVE') TABLESPACE rptfact2009,
SUBPARTITION P2SUB2 VALUES ('INACTIVE') TABLESPACE rptfact2009
)
)
?复合范围散列分区Q?br />q种分区是基于范围分区和散列分区Q表首先按某列进行范围分区,然后再按某列q行散列分区?br />create table dinya_test
(
transaction_id number primary key,
item_id number(8) not null,
item_description varchar2(300),
transaction_date date
)
partition by range(transaction_date)subpartition by hash(transaction_id) subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)
(
partition part_01 values less than(to_date(‘2006-01-01’,’yyyy-mm-dd’)),
partition part_02 values less than(to_date(‘2010-01-01’,’yyyy-mm-dd’)),
partition part_03 values less than(maxvalue)
);
(5).有关表分区的一些维护性操作:
一、添加分?br />以下代码lSALES表添加了一个P3分区
ALTER TABLE SALES ADD PARTITION P3 VALUES LESS THAN(TO_DATE('2003-06-01','YYYY-MM-DD'));
注意Q以上添加的分区界限应该高于最后一个分区界限?br />以下代码lSALES表的P3分区d了一个P3SUB1子分?br />ALTER TABLE SALES MODIFY PARTITION P3 ADD SUBPARTITION P3SUB1 VALUES('COMPLETE');
二、删除分?br />以下代码删除了P3表分区:
ALTER TABLE SALES DROP PARTITION P3;
在以下代码删除了P4SUB1子分区:
ALTER TABLE SALES DROP SUBPARTITION P4SUB1;
注意Q如果删除的分区是表中唯一的分区,那么此分区将不能被删除,要想删除此分区,必须删除表?br />三、截断分?br />截断某个分区是指删除某个分区中的数据Qƈ不会删除分区Q也不会删除其它分区中的数据。当表中即只有一个分区时Q也可以截断该分区。通过以下代码截断分区Q?br />ALTER TABLE SALES TRUNCATE PARTITION P2;
通过以下代码截断子分区:
ALTER TABLE SALES TRUNCATE SUBPARTITION P2SUB2;
四、合q分?br />合ƈ分区是将盔R的分区合q成一个分区,l果分区采用较高分区的界限Q值得注意的是Q不能将分区合ƈ到界限较低的分区。以下代码实CP1 P2分区的合qӞ
ALTER TABLE SALES MERGE PARTITIONS P1,P2 INTO PARTITION P2;
五、拆分分?br />拆分分区一个分区拆分两个新分区Q拆分后原来分区不再存在。注意不能对HASHcd的分行拆分?br />ALTER TABLE SALES SBLIT PARTITION P2 AT(TO_DATE('2003-02-01','YYYY-MM-DD')) INTO (PARTITION P21,PARTITION P22);
六、接合分?coalesca)
l合分区是将散列分区中的数据接合到其它分ZQ当散列分区中的数据比较大时Q可以增加散列分区,然后q行接合Q值得注意的是Q接合分区只能用于散列分Z。通过以下代码q行接合分区Q?br />ALTER TABLE SALES COALESCA PARTITION;
七、重命名表分?br />以下代码P21更改为P2
ALTER TABLE SALES RENAME PARTITION P21 TO P2;
八、相x?br />跨分区查?br />select sum( *) from
(select count(*) cn from t_table_SS PARTITION (P200709_1)
union all
select count(*) cn from t_table_SS PARTITION (P200709_2)
);
查询表上有多分?br />SELECT * FROM useR_TAB_PARTITIONS WHERE TABLE_NAME='tableName'
查询索引信息
select object_name,object_type,tablespace_name,sum(value)
from v$segment_statistics
where statistic_name IN ('physical reads','physical write','logical reads')and object_type='INDEX'
group by object_name,object_type,tablespace_name
order by 4 desc
--昄数据库所有分的信息:
select * from DBA_PART_TABLES
--昄当前用户可访问的所有分信息:
select * from ALL_PART_TABLES
--昄当前用户所有分的信息:
select * from USER_PART_TABLES
--昄表分Z?昄数据库所有分的详l分Z息:
select * from DBA_TAB_PARTITIONS
--昄当前用户可访问的所有分的详l分Z息:
select * from ALL_TAB_PARTITIONS
--昄当前用户所有分的详l分Z息:
select * from USER_TAB_PARTITIONS
--昄子分Z?昄数据库所有组合分的子分区信息Q?br />select * from DBA_TAB_SUBPARTITIONS
--昄当前用户可访问的所有组合分的子分区信息Q?br />select * from ALL_TAB_SUBPARTITIONS
--昄当前用户所有组合分的子分区信息Q?br />select * from USER_TAB_SUBPARTITIONS
--昄分区?昄数据库所有分的分区列信息Q?br />select * from DBA_PART_KEY_COLUMNS
--昄当前用户可访问的所有分的分区列信息Q?br />select * from ALL_PART_KEY_COLUMNS
--昄当前用户所有分的分区列信息Q?br />select * from USER_PART_KEY_COLUMNS
--昄子分区列 昄数据库所有分的子分区列信息:
select * from DBA_SUBPART_KEY_COLUMNS
--昄当前用户可访问的所有分的子分区列信息:
select * from ALL_SUBPART_KEY_COLUMNS
--昄当前用户所有分的子分区列信息:
select * from USER_SUBPART_KEY_COLUMNS
--怎样查询出oracle数据库中所有的的分
select * from user_tables a where a.partitioned='YES'
--删除一个表的数据是
truncate table table_name;
--删除分区表一个分区的数据?br />alter table table_name truncate partition p5;
【PS】:当update更改数据所属分区时Q必赋予表row movement权限?br />alter table test_partition_tab enable/disable row movement;
update分区字段Q改变所属分区,数据在内部变化是l过了源数据插入新分区、新数据更新、源老数据删除的步骤Q因此rowid会改变Q数据烦引也重走?
]]>SELECT TO_TIMESTAMP('2009-7-30','yyyy-mm-dd')
FROM dual
l果为:30-7?-09 12.00.00.000000000 上午 select TO_CHAR(to_timestamp('2009-7-30','yyyy-mm-dd hh24:mi:ss') ,'YYYY-MM-DD HH24:MI:SS')
from dual
l果为:2009-07-30 00:00:00select (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
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(TO_CHAR(to_timestamp('2009-7-29','yyyy-mm-dd hh24:mi:ss') , 'yyyy-mm-dd hh24:mi:ss'),
'YYYY-MM-DD HH24:mi:ss')) * 86400 as "itvtime"
from dual
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
应用Q?/strong>具体应用时将例子中to_timestamp()阴媄部分代码换成相应字段卛_Q该字段是timestamp格式Q?/p>
select add_months(trunc(to_date('2009-9', 'yyyy-mm'), 'mm'), 1)
- trunc(to_date('2009-9', 'yyyy-mm'), 'mm')
from dual
]]>
讉Khttps://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=jdk-6u15-oth-JPR@CDS-CDS_DeveloperQ选择合适的版本(我们选择solaris sparc)后,有以下几U: 不同的包有不同的使用Ҏ。xx.shq种比较单,直接./xxx.sh可以了。执行完后会在当前目录下生成一个jdk1.6.0_15的文件夹Q像"l色?Q如下:
如果是xx.tar.ZQ先?uncompress -cvf *.z|tar -xvf -Q如果不行,则再用tar –xvf xx.tar,解压后的文g夹jdkjdk1.6.0_15文g夹,如下Q? 需要将q两个包加到pakage中?
安装Q?pkgadd -d SUNWj6rt SUNWj6dev SUNWj6cfg SUNWj6man SUNWj6dmo
卸蝲Q?pkgrm SUNWj6rt SUNWj6dev SUNWj6cfg SUNWj6man SUNWj6dmo
(2) 建立软连?ln -s /usr/jdk/jdk1.6.0/ /usr/java #前者做一个链接,后者指向前者,后者ؓ链接?
(3) java –version 查看是否正确安装
修改/etc/profile 的内容,加入JAVA_HOME ?JRE_HOME Q以?/font>
JAVA_HOME=/usr/java
export JAVA_HOME
export JRE_HOME
export CLASSPATH
export PATH 3, First uncompress the zip file $ bzip2 -d <zip file basename>.bz2 You will get a package datastream file named <zip file basename> 4, Install the package as root # pkgadd -d ./<zip file basename> The default install location would be /opt/sfw/lib/firefox
本blog地址Q?a href="blog.csdn.com/whuslei" target="_blank">blog.csdn.com/whusleiQ版权所有!
]]>
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.
q是个好东西Qƈ且它提供的帮助更是个好东ѝ?/p>
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:
l Associate two or more application server instances to form a cluster
l Display a summary of the instances that are part of a cluster
2.1.3 Managing Oracle Application Server Using the admin_client.jar Utility
q个用处不大
3.2.1 Starting a Middle-Tier Instance
To start a middle-tier instance:
(Windows) ORACLE_HOME\opmn\bin\opmnctl startall
3.2.2 Stopping a Middle-Tier Instance
(Windows) ORACLE_HOME\opmn\bin\opmnctl stopall
opmnctl: A command-line tool.
Application Server Control Console: A Web-based tool. (OEM)
3.3.1 Starting and Stopping Components Using opmnctl
You can use the opmnctl command-line tool to start and stop components. It is located in the following directory:
(Windows) ORACLE_HOME\opmn\bin
opmnctl startproc ias-component=component
opmnctl restartproc ias-component=component
prompt > opmnctl startproc ias-component=wireless process-type=alert_server process-set=alert_instance_1
prompt > opmnctl restartproc ias-component=OC4J process-type=home
prompt > opmnctl stopproc ias-component=HTTP_Server
prompt > opmnctl usage startproc
Values for the target attributes (ias-instance, ias-component,
process-type and process-set) should be the same as the id
value of each attribute specified in opmn.xml.
从opmn.xml可以扑ֈq些ias-componentQ也可以通过命oQ?/font>opmnctl status
opmnctl startproc process-type=process
opmnctl restartproc process-type=process
opmnctl stopproc application=app_name
opmnctl restartproc application=app_name
--------------------------------------+--------------------+---------+---------
ias-component | process-type | pid | status
--------------------------------------+--------------------+---------+---------
OC4JGroup:default_group | OC4J:home | 4812 | Alive
ASG | ASG | N/A | Down
HTTP_Server | HTTP_Server | 4312 | Alive
]]>
]]>
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.3Q数据库所在机子的名称或IPQ?/span>)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = sxstQ要q接数据库的SIDQ?/span>)
)
)'
下面是查询时的写法,在表名后增加 @sxst03 (@加上上面建立的连接名U?
select * from sde.Table_Registry@sxst03 where table_name='N2007E2003140411000B00XJLYD'
]]>
SQL>shutdown
SQL>startup
SQL>alter user sys identified by hand2009
名称 | 应用cd | 转换?/strong> |
null | voidQjava.lang.Void | NullConverter |
enum | EnumConverter | |
primitive | boolean,byte,short,int,long,float,double,char, java.lang.Boolean,java.lang.Byte,java.lang.Short, java.lang.Integer,java.lang.Long,java.lang.Float, java.lang.Double,java.lang.Character |
PrimitiveConverter |
bignumber | java.math.BigInteger,java.math.BigDecimal | BigNumberConverter |
string | java.lang.String | StringConverter |
array | [Z,[B,[S,[I,[J,[F,[D,[C,[L* | ArrayConverter |
map | java.util.Map | MapConverter |
collection | java.util.Collection | CollectionConverter |
date | java.util.Date,java.sql.Date,java.sql.Time, java.sql.Timestamp,java.util.Calendar |
DateConverter |
dom | org.w3c.dom.Node,org.w3c.dom.Element,org.w3c.dom.Document | DOMConverter |
dom4j | org.dom4j.Document,org.dom4j.Element,org.dom4j.Node | DOM4JConverter |
jdom | org.jdom.Document,org.jdom.Element | JDOMConverter |
xom | nu.xom.Document,nu.xom.Element,nu.xom.Node | XOMConverter |
servlet | javax.servlet.ServletConfig,javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.http.HttpSession |
ServletConverter |
bean | BeanConverter | |
object | ObjectConverter | |
hibernate2 | H2BeanConverter | |
hibernate3 | H3BeanConverter | |
url | java.net.URL | URLConverter |
exception | ExceptionConverter | |
miniException | java.lang.Throwable | MinimalistExceptionConverter |
它们是应用启动的时候,通过 org.directwebremoting.servlet.DwrServlet 初始?dwr-2.0.5.jar!/org/directwebremoting/dwr.xml 文g加蝲q来的。例如:
<converter id="date" class="org.directwebremoting.convert.DateConverter"/> 注册?date 转换?br />
<convert converter="date" match="java.util.Date"/> 应用注册?date 转换器应用到 java.util.Date cd
看到上面Q你也许会惊讶一下,我们qx可能也就用下 bean 转换器,其他用内|就行。然?DWR ؓ我们考虑的很周到的,包括 hibernate 相关的,URL、Servlet、Dom {相关类型的转换器?br />
2. DWR 如何定用哪?Converter?
DWR 是根据方法参数来定入口参数?Converter、根据返回值类型确定传?JS 的出口参数的 Converter。M是以 Java Ҏ原型为基准来军_每一参数或返回值各自用哪个 Converter 来{换数据?br />
?BaseCallMarshaller.marshallInbound(HttpServletRequest request, HttpServletResponse response) Ҏ中,使用
Class paramType = method.getParameterTypes()[j] 来获得参数的cdQ然后从已加载的 Converter Map 中找?Converter 名称Q进而确?Converter cd?/p>
而确定返回值类型就不是直接用反的 method.getReturnType()。而是以反方式调用方法后Q根据具体返回值的cd来确定的。见Q?br />
Replay DefaultRemoter.execute(Call) Ҏ中的
Object reply = chain.doFilter(object, method, call.getParameters()); 再进入到
Object ExecuteAjaxFilter.doFilter(Object obj, Method method, Object[] params Ajax FilterChain){
return method.invoke(obj, params);
}
是Ҏ上面的返回|然后?br />
DefaultConverterManager.convertOutbound(Object, OutboundContext) Ҏ中的
Converter converter = getConverter(object); //Ҏq回?object 定该用?Converter?br />
3. DWR Converter 的调?/strong>
多留意下 DWR 自带?ConverterQ可以看到所有的 Converter 直接或简接的 extends BaseV20Converter implements ConverterQ其?BaseV20Converter(DWR 1.x 中对应ؓ BaseV10Converter) 本n实C Converter。在 BaseV20Converter 抽象cM默认实现?Converter 的方?br />
public void setConverterManager(ConverterManager config) { }
具体?Converter 只要专心d现接?Converter 中的另两个方?
Object convertInbound(Class paramType, InboundVariable data, InboundContext inctx) throws MarshallException;
OutboundVariable convertOutbound(Object data, OutboundContext outctx) throws MarshallException;
q行Ӟ它们相应的被 ConvertManager(默认?DefaultConvertManager) ?br />
Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx, TypeHintContext incc) throws MarshallException
OutboundVariable convertOutbound(Object object, OutboundContext outctx) throws MarshallException
来调用?br />
DWR Ҏ个参数或q回D会应用一?ConverterQ但对于复杂的类型会递归的调?ConverterQ比如,要完?br />
JS "{id:123, name: 'Unmi', blogs:['http://unmi.blogjava.net','http://blog.csdn.net/kypfos']}" ?Java ?Person{int id, String name, String[] blogs;} 的{换,׃使用?bean->primitive->array 三个 Converter?br />
4. 定制自己?Converter
基本?DWR 内置?Converter 够用的Q但也有可能需要定定自q Converter。从 DWR ?Converter 实现来看Q一般会用两U方式:
1) extends BaseV20Converter implements ConverterQ实?Converter ?converterInbound() ?converterOutbound() Ҏ
2) extends BasicObjectConverter implements ConverterQ或l承 BeanConverterQ实?BasicObjectConverter ?getPropertyMapFromObject()QgetPropertyMapFromObject() ?createTypeHintContext() Ҏ?br />
前一U方式,请参?org.directwebremoting.convert.DateConverter 的源码实玎ͼ
convertInbound() ?JS 的字W串转换成要求的 Date、Time、Timestamp ?Calender 对像?br />
convertOubound() ?Java 的类型{换成 JS ?new Date() cdQ注意返回值的写法Q?br />
return new SimpleOutboundVariable("new Date(" + millis + ")", outctx, true);
W二U?BasicObjectConverter 或是 BeanConverter 的做法,可参?BeanConverter 的源码实现。表现在 JSON ?Java 对象间的转换Q要是引入解?JSON ?JAR 包或许能有不帮助?br />
定制 Converter 的内容讲的很,主要是真有这斚w的需要的时候请参?DWR 的相x码,实际中理解各个接口方法参数的意义Q及q回值的要求。对待开源组件还是要保持阅读源码的好习惯?br />
好啦Q自q Converter 写好Q需要注册,需要应用。我们还是参?DWR 的做法,写在自己?dwr.xml 中。例如定制了 com.unmi.dwr.converter.SpecialConverterQ要?com.unmi.model.SpecialObject q行出入cd的{换,p么写Q?br />
<converter id="special" class="com.unmi.dwr.converter.SpecialConverter"/> 注册?nbsp;special 转换?br />
<convert converter="special" match="com.unmi.model.SpecialObject"/> 应用注册?special 转换器应用到 com.unmi.model.SpecialObject cd
5. 结
?DWR 其实也有D|日了Q未曄l的学,L遇一问题、扫除一个,不免也会L扄xpȝ的资料。然而着下此的动机是上周六在书城翻了下 ?DWR 实战》,它实际讲 DWR 本n的较。最后我W一个想了解了是 DWR 能完?JS ?Java 间什么类型的转换Q第一手的资料|上也没搜烦刎ͼ于是q到源码中去Q亲w历l,也更加深了印象?br />
读者也许和我一L的,只想看看内置的{换器有哪些,能{换哪些类型,那就只需看最为抢眼的那张表格吧。需要定?Converter 应该很少Q就像我们很定?Struts ?Converter、Hibernate ?UserType ?iBatis ?TypeHandler 一栗因此也对定制 DWR ?Converter 所用篇q不多?br />
对待开源,自己L个习惯就是必L相关的源代码伴随在它w边。开源组件的使用一般不难,到问题Q既然源码都掌握了,我想总能从源码中扑և原因来。尚且,对这L知名lg发深入Q就更能嚼出许多呛_?br />
参考:DWR 2.0.5 的源代码Q对 DWR 目q行单步调试
原文Q?a href="http://www.aygfsteel.com/Unmi/archive/2009/06/23/283741.html">http://www.aygfsteel.com/Unmi/archive/2009/06/23/283741.html
Cache是一U用?span style="color: red">提高pȝ响应速度?span style="color: red">改善pȝq行性能的技术。尤其是?/span>Web应用中,通过~存面的输出结果,可以很显著的改善pȝq行性能?/span>
OSCache标记库由OpenSymphony设计Q它是一U开创性的~存ҎQ它提供了在现有JSP面之内实现内存~存的功能。OSCache是个一个被q泛采用的高性能的J2EE~存框架QOSCacheq能应用于Q何Java应用E序的普通的~存解决Ҏ?/span>