-
构建自己的js库
2009-09-24 15:21:33
/**
* @author gezengjin
* js库的构建
*/
(function(){
window['IC']={}
function $(){
//代码
alert("调用到了!");
}
function getElement(){
//
}//把函数注册到库
window['IC']['$']=$;
window['IC']['getElement']=getElement;
})() -
ORACLE常用问题
2009-08-17 18:03:33
ORACLE常用傻瓜问题1000问
作者: CCBZZP
1. Oracle安装完成后的初始口令?
internal/oracle
sys/change_on_install
system/manager
scott/tiger
sysman/oem_temp
2. ORACLE9IAS WEB CACHE的初始默认用户和密码?
administrator/administrator
3. oracle 8.0.5怎么创建数据库?
用orainst。如果有motif界面,可以用orainst /m
4. oracle 8.1.7怎么创建数据库?
dbassist
5. oracle 9i 怎么创建数据库?
dbca
6. oracle中的裸设备指的是什么?
裸设备就是绕过文件系统直接访问的储存空间
7. oracle如何区分 64-bit/32bit 版本?
$ sqlplus '/ AS SYSDBA'
SQL*Plus: Release 9.0.1.0.0 - Production on Mon Jul 14 17:01:09 2003
(c) Copyright 2001 Oracle Corporation. All rights reserved。
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
PL/SQL Release 9.0.1.0.0 - Production
CORE 9.0.1.0.0 Production
TNS for Solaris: Version 9.0.1.0.0 - Production
NLSRTL Version 9.0.1.0.0 - Production
SQL>
8. SVRMGR什么意思?
svrmgrl,Server Manager 9i下没有,已经改为用SQLPLUS了
sqlplus /nolog 变为归档日志型的
9. 请问如何分辨某个用户是从哪台机器登陆ORACLE的?
SELECT machine ,terminal FROM V$SESSION;
10. 用什么语句查询字段呢?
desc table_name 可以查询表的结构
select field_name,... from ... 可以查询字段的值
select * from all_tables where table_name like '%'
select * from all_tab_columns where table_name='??'
11. 怎样得到触发器、过程、函数的创建脚本?
desc user_source
user_triggers
12. 怎样计算一个表占用的空间的大小?
select owner,table_name,NUM_ROWS,BLOCKS*AAA/1024/1024 "Size M",EMPTY_BLOCKS,LAST_ANALYZED
from dba_tables
where table_name='XXX';
Here: AAA is the value of db_block_size;
XXX is the table name you want to check
13. 如何查看最大会话数?
SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%';
SQL>
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ------- ------------------------------
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 4
log_archive_max_processes integer 1
processes integer 200
这里为200个用户。
Select * from v$license;
其中sessions_highwater纪录曾经到达的最大会话数
14. 如何查看系统被锁的事务时间?
select * from v$locked_object ;
15. 如何以archivelog的方式运行oracle?
init.ora
log_archive_start = true
RESTART DATABASE
16. 怎么获取有哪些用户在使用数据库?
select username from v$session;
17. 数据表中的字段最大数是多少?
表或视图中的最大列数为 1000
18. 怎样查得数据库的SID ?
select name from v$database;也可以直接查看 init.ora文件
19. 如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ?
select sys_context('userenv','ip_address') from dual;
如果是登陆本机数据库,只能返回127.0.0.1
20. UNIX 下怎么调整数据库的时间?
su -root
date -u 08010000
21. 在ORACLE TABLE中如何抓取MEMO类型栏为空的资料记录?
select remark from oms_flowrec where trim(' ' from remark) is not null ;
22. 如何用BBB表的资料去更新AAA表的数据(有关联的字段)
UPDATE AAA SET BNS_SNM=(SELECT BNS_SNM FROM BBB WHERE AAA.DPT_NO=BBB.DPT_NO) WHERE BBB.DPT_NO IS NOT NULL;
23. P4计算机安装方法
将SYMCJIT.DLL改为SYSMCJIT.OLD
24. 如何查询SERVER是不是OPS?
SELECT * FROM V$OPTION;
如果PARALLEL SERVER=TRUE则有OPS能
25. 如何查询每个用户的权限?
SELECT * FROM DBA_SYS_PRIVS;
26. 如何将表移动表空间?
ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME;
27. 如何将索引移动表空间?
ALTER INDEX INDEX_NAME REBUILD TABLESPACE TABLESPACE_NAME;
28. 在LINUX,UNIX下如何启动DBA STUDIO?
OEMAPP DBASTUDIO
29. 查询锁的状况的对象有?
V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS ;
查询锁的表的方法:
SELECT S.SID SESSION_ID,S.USERNAME,DECODE(LMODE,0,'None',1,'Null',2,'Row-S (SS)',3,'Row-X (SX)',4,'Share',5,'S/Row-X (SSX)',6,'Exclusive',TO_CHAR(LMODE)) MODE_HELD,DECODE(REQUEST,0,'None',1,'Null',2,'Row-S (SS)',3,'Row-X (SX)',4,'Share',5,'S/Row-X (SSX)',6,'Exclusive',TO_CHAR(REQUEST)) MODE_REQUESTED,O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')',S.TYPE LOCK_TYPE,L.ID1 LOCK_ID1,L.ID2 LOCK_ID2 FROM V$LOCK L,SYS.DBA_OBJECTS O,V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;
30. 如何解锁?
ALTER SYSTEM KILL SESSION ‘SID,SERIR#’;
31. SQLPLUS下如何修改编辑器?
DEFINE _EDITOR="<编辑器的完整路经>" -- 必须加上双引号来定义新的编辑器,也可以把这个写在$ORACLE_HOME/sqlplus/admin/glogin.sql里面使它永久有效。
32. ORACLE产生随机数的函数?
DBMS_RANDOM.RANDOM
33. LINUX下查询磁盘竞争状况命令?
sar -d
33. LINUX下查询CPU竞争状况命令?
sar -r
34. 查询当前用户对象?
SELECT * FROM USER_OBJECTS;
SELECT * FROM DBA_SEGMENTS;
35. 如何获取错误信息?
SELECT * FROM USER_ERRORS;
36. 如何获取链接状况?
SELECT * FROM DBA_DB_LINKS;
37. 查看数据库字符状况?
SELECT * FROM NLS_DATABASE_PARAMETERS;
SELECT * FROM V$NLS_PARAMETERS;
38. 查询表空间信息?
SELECT * FROM DBA_DATA_FILES;
39. ORACLE的INTERAL用户要口令?
修改 SQLNET.ORA
SQLNET.AUTHENTICATION_SERVICES=(NTS)
40. 出现JAVA.EXE的解决办法?
一般是将ORACLEORAHOMEXIHTTPSERVER改成手工启动可以的,X是8或9
41. 如何给表、列加注释?
SQL>comment on table 表 is '表注释';
注释已创建。
SQL>comment on column 表.列 is '列注释';
注释已创建。
SQL> select * from user_tab_comments where comments is not null;
42. 如何查看各个表空间占用磁盘情况?
SQL> col tablespace format a20
SQL> select
b.file_id 文件ID号,
b.tablespace_name 表空间名,
b.bytes 字节数,
(b.bytes-sum(nvl(a.bytes,0))) 已使用,
sum(nvl(a.bytes,0)) 剩余空间,
sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_id,b.bytes
order by b.file_id
43. 如把ORACLE设置为MTS或专用模式?
#dispatchers="(PROTOCOL=TCP) (SERVICE=SIDXDB)"
加上就是MTS,注释就是专用模式,SID是指你的实例名。
44. 如何才能得知系统当前的SCN号 ?
select max(ktuxescnw * power(2,32) + ktuxescnb) from x$ktuxe;
45. 请问如何在ORACLE中取毫秒?
9i之前不支持,9i开始有timestamp。
9i可以用select systimestamp from dual;
46. 如何在字符串里加回车?
select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual ;
47. 中文是如何排序的?
Oracle9i之前,中文是按照二进制编码进行排序的。
在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值:
SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_PINYIN_M 按照拼音排序
48. Oracle8i中对象名可以用中文吗?
可以
49. 如何改变WIN中SQL*Plus启动选项?
SQL*PLUS自身的选项设置我们可以在$ORACLE_HOME/sqlplus/admin/glogin.sql中设置。
50. 怎样修改oracel数据库的默认日期?
alter session set nls_date_format='yyyymmddhh24miss';
或可以在init.ora中加上一行 nls_date_format='yyyymmddhh24miss'
51. 如何将小表放入keep池中?
alter table xxx storage(buffer_pool keep);
52. 如何检查是否安装了某个patch?
check that oraInventory
53. 如何使select语句使查询结果自动生成序号?
select rownum,COL from table;
54. 如何知道数据裤中某个表所在的tablespace?
select tablespace_name from user_tables where table_name='TEST';
select * from user_tables中有个字段TABLESPACE_NAME,(oracle);
select * from dba_segments where …;
55. 怎么可以快速做一个和原表一样的备份表?
create table new_table as (select * from old_table);
55. 怎么在sqlplus下修改procedure?
select line,trim(text) t from user_source where name =’A’ order by line;
56. 怎样解除PROCEDURE被意外锁定?
alter system kill session ,把那个session给杀掉,不过你要先查出她的session id
或把该过程重新改个名字就可以了。
57. SQL Reference是个什么东西?
是一本sql的使用手册,包括语法、函数等等,Oracle官方网站的文档中心提供下载。
58. 如何查看数据库的状态?
UNIX下
ps -ef | grep ora
Windows下
看服务是否起来;是否可以连上数据库
59. 请问如何修改一张表的主键?
alter table aaa
drop constraint aaa_key ;
alter table aaa
add constraint aaa_key primary key(a1,b1) ;
60. 改变数据文件的大小?
用 ALTER DATABASE .... DATAFILE .... ;
手工改变数据文件的大小,对于原来的 数据文件有没有损害。
61. 怎样查看ORACLE中有哪些程序在运行之中?
查看v$sessions表
62. 怎么可以看到数据库有多少个tablespace?
select * from dba_tablespaces;
63. 如何修改oracle数据库的用户连接数?
修改initSID.ora,将process加大,重启数据库。
64. 如何查出一条记录的最后更新时间?
可以用logminer 察看
65. 如何在PL/SQL中读写文件?
UTL_FILE包允许用户通过PL/SQL读写操作系统文件。
66. 怎样把“&”放入一条记录中?
insert into a values (translate ('at{&}t','at{}','at'));
67. EXP 如何加QUERY参数?
EXP USER/PASS FILE=A.DMP TABLES(BSEMPMS)
QUERY='"WHERE EMP_NO=\'S09394\'\"﹔
68. 关于oracle8i支持简体和繁体的字符集问题?
ZHS16GBK可以支持
69. Data Guard是什么软件?
就是Standby的换代产品
70. 如何创建SPFILE?
SQL> connect / as sysdba
SQL> select * from v$version;
SQL> create pfile from spfile;
SQL> CREATE SPFILE FROM PFILE='E:\ora9i\admin\eygle\pfile\init.ora';
文件已创建。
SQL> CREATE SPFILE='E:\ora9i\database\SPFILEEYGLE.ORA' FROM PFILE='E:\ora9i\admin\eygle\pfile\init.ora';
文件已创建。
71. 内核参数的应用?
shmmax
含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定了最多可以使用的内存数目。这个设置也不影响操作系统的内核资源。
设置方法:0.5*物理内存
例子:Set shmsys:shminfo_shmmax=10485760
shmmin
含义:共享内存的最小大小。
设置方法:一般都设置成为1。
例子:Set shmsys:shminfo_shmmin=1:
shmmni
含义:系统中共享内存段的最大个数。
例子:Set shmsys:shminfo_shmmni=100
shmseg
含义:每个用户进程可以使用的最多的共享内存段的数目。
例子:Set shmsys:shminfo_shmseg=20:
semmni
含义:系统中semaphore identifierer的最大个数。
设置方法:把这个变量的值设置为这个系统上的所有Oracle的实例的init.ora中的最大的那个processes的那个值加10。
例子:Set semsys:seminfo_semmni=100
semmns
含义:系统中emaphores的最大个数。
设置方法:这个值可以通过以下方式计算得到:各个Oracle实例的initSID.ora里边的processes的值的总和(除去最大的Processes参数)+最大的那个Processes×2+10×Oracle实例的个数。
例子:Set semsys:seminfo_semmns=200
semmsl
含义:一个set中semaphore的最大个数。
设置方法:设置成为10+所有Oracle实例的InitSID.ora中最大的Processes的值。
例子:Set semsys:seminfo_semmsl=-200
72. 怎样查看哪些用户拥有SYSDBA、SYSOPER权限?
SQL>conn sys/change_on_install
SQL>select * from V_$PWFILE_USERS;
73. 如何单独备份一个或多个表?
exp 用户/密码 tables=(表1,…,表2)
74. 如何单独备份一个或多个用户?
exp system/manager wner=(用户1,用户2,…,用户n) file=导出文件
75. 如何对CLOB字段进行全文检索?
SELECT * FROM A WHERE dbms_lob.instr(a.a,'K',1,1)>0;
76. 如何显示当前连接用户?
SHOW USER
77. 如何查看数据文件放置的路径?
col file_name format a50
SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;
78. 如何查看现有回滚段及其状态?
SQL> col segment format a30
SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS
79. 如何改变一个字段初始定义的Check范围?
SQL> alter table xxx drop constraint constraint_name;
之后再创建新约束:
SQL> alter table xxx add constraint constraint_name check();
80. Oracle常用系统文件有哪些?
通过以下视图显示这些文件信息:v$database,v$datafile,v$logfile v$controlfile v$parameter;
81. 内连接INNER JOIN?
select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no;
82. 如何外连接?
select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+);
select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no;
83. 如何执行脚本SQL文件?
SQL>@$PATH/filename.sql;
84. 如何快速清空一个大表?
SQL>truncate table table_name;
85. 如何查有多少个数据库实例?
SQL>SELECT * FROM V$INSTANCE;
86. 如何查询数据库有多少表?
SQL>select * from all_tables;
87. 如何测试SQL语句执行所用的时间?
SQL>set timing on;
SQL>select * from tablename;
88. CHR()的反函数?
ASCII()
SELECT CHAR(65) FROM DUAL;
SELECT ASCII('A') FROM DUAL;
89. 字符串的连接
SELECT CONCAT(COL1,COL2) FROM TABLE;
SELECT COL1||COL2 FROM TABLE;
90. 怎么把select出来的结果导到一个文本文件中?
SQL>SPOOL C:\ABCD.TXT;
SQL>select * from table;
SQL >spool off;
91. 怎样估算SQL执行的I/O数 ?
SQL>SET AUTOTRACE ON ;
SQL>SELECT * FROM TABLE;
或
SQL>SELECT * FROM v$filestat;可以查看IO数
92. 如何在sqlplus下改变字段大小?
alter table table_name modify (field_name varchar2(100));
改大行,改小不行(除非都是空的)
93. 如何查询某天的数据?
select * from table_name where trunc(日期字段)=to_date('2003-05-02','yyyy-mm-dd');
94. sql 语句如何插入全年日期?
create table BSYEAR (d date);
insert into BSYEAR
select to_date('20030101','yyyymmdd')+rownum-1
from all_objects
where rownum <= to_char(to_date('20031231','yyyymmdd'),'ddd');
95. 如果修改表名?
alter table old_table_name rename to new_table_name;
96. 如何取得命令的返回状态值?
sqlcode=0
97. 如何知道用户拥有的权限?
SELECT * FROM dba_sys_privs ;
98. 从网上下载的ORACLE9I与市场上卖的标准版有什么区别?
从功能上说没有区别,只不过oracle公司有明文规定;从网站上下载的oracle产品不得用于商业用途,否则侵权。
99. 怎样判断数据库是运行在归档模式下还是运行在非归档模式下?
进入dbastudio,历程--〉数据库---〉归档查看。
100. sql>startup pfile和ifile,spfile有什么区别?
pfile就是Oracle传统的初始化参数文件,文本格式的;
ifile类似于c语言里的include,用于把另一个文件引入;
spfile是9i里新增的并且是默认的参数文件,二进制格式;
startup后应该只可接pfile。
101. 如何搜索出前N条记录?
SELECT * FROM empLOYEE WHERE ROWNUM < n
ORDER BY empno;
102. 如何知道机器上的Oracle支持多少并发用户数?
SQL>conn internal ;
SQL>show parameter processes ;
103. db_block_size可以修改吗?
一般不可以﹐不建议这样做的。
104. 如何统计两个表的记录总数?
select (select count(id) from aa)+(select count(id) from bb) 总数 from dual;
105. 怎样用Sql语句实现查找一列中第N大值?
select * from
(select t.*,dense_rank() over (order by sal) rank from employee)
where rank = N;
106. 如何在给现有的日期加上2年?(
select add_months(sysdate,24) from dual;
107. USED_UBLK为负值表示什么意思?
It is "harmless"。
108. Connect string是指什么?
应该是tnsnames.ora中的服务名后面的内容
109. 怎样扩大REDO LOG的大小?
建立一个临时的redolog组,然后切换日志,删除以前的日志,建立新的日志。
110. tablespace 是否不能大于4G?
没有限制。
111. 返回大于等于N的最小整数值?
SELECT CEIL(N) FROM DUAL;
112. 返回小于等于N的最小整数值?
SELECT FLOOR(N) FROM DUAL;
113. 返回当前月的最后一天?
SELECT LAST_DAY(SYSDATE) FROM DUAL;
114. 如何不同用户间数据导入?
IMP SYSTEM/MANAGER FILE=AA.DMP FROMUSER=USER_OLD TOUSER=USER_NEW ROWS=Y INDEXES=Y ;
115. 如何找数据库表的主键字段的名称?
SQL>SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='TABLE_NAME';
116. 两个结果集互加的函数?
SQL>SELECT * FROM BSEMPMS_OLD INTERSECT SELECT * FROM BSEMPMS_NEW;
SQL>SELECT * FROM BSEMPMS_OLD UNION SELECT * FROM BSEMPMS_NEW
SQL>SELECT * FROM BSEMPMS_OLD UNION ALL SELECT * FROM BSEMPMS_NEW;
117. 两个结果集互减的函数?
SQL>SELECT * FROM BSEMPMS_OLD MINUS SELECT * FROM BSEMPMS_NEW;
118. 如何配置Sequence?
建sequence seq_custid
create sequence seq_custid start 1 incrememt by 1;
建表时:
create table cust
{ cust_id smallint not null,
...}
insert 时:
insert into table cust
values( seq_cust.nextval,...)
日期的各部分的常用的的写法
119. 取时间点的年份的写法:
SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL;
120. 取时间点的月份的写法:
SELECT TO_CHAR(SYSDATE,'MM') FROM DUAL;
121. 取时间点的日的写法:
SELECT TO_CHAR(SYSDATE,'DD') FROM DUAL;
122. 取时间点的时的写法:
SELECT TO_CHAR(SYSDATE,'HH24') FROM DUAL;
123. 取时间点的分的写法:
SELECT TO_CHAR(SYSDATE,'MI') FROM DUAL;
124. 取时间点的秒的写法:
SELECT TO_CHAR(SYSDATE,'SS') FROM DUAL;
125. 取时间点的日期的写法:
SELECT TRUNC(SYSDATE) FROM DUAL;
126. 取时间点的时间的写法:
SELECT TO_CHAR(SYSDATE,'HH24:MI:SS') FROM DUAL;
127. 日期,时间形态变为字符形态:
SELECT TO_CHAR(SYSDATE) FROM DUAL;
128. 将字符串转换成日期或时间形态:
SELECT TO_DATE('2003/08/01') FROM DUAL;
129. 返回参数的星期几的写法:
SELECT TO_CHAR(SYSDATE,'D') FROM DUAL;
130. 返回参数一年中的第几天的写法:
SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;
131. 返回午夜和参数中指定的时间值之间的秒数的写法:
SELECT TO_CHAR(SYSDATE,'SSSSS') FROM DUAL;
132. 返回参数中一年的第几周的写法:
SELECT TO_CHAR(SYSDATE,'WW') FROM DUAL;
虚拟字段
133. CURRVAL 和 nextval
为表创建序列
CREATE SEQUENCE EMPSEQ ... ;
SELECT empseq.currval FROM DUAL ;
自动插入序列的数值
INSERT INTO emp
VALUES (empseq.nextval, 'LEWIS', 'CLERK',
7902, SYSDATE, 1200, NULL, 20) ;
134. ROWNUM
按设定排序的行的序号
SELECT * FROM emp WHERE ROWNUM < 10 ;
135. ROWID
返回行的物理地址
SELECT ROWID, ename FROM emp WHERE deptno = 20 ;
136. 将N秒转换为时分秒格式?
set serverout on
declare
N number := 1000000;
ret varchar2(100);
begin
ret := trunc(n/3600) || '小时' || to_char(to_date(mod(n,3600),'sssss'),'fmmi"分 "ss"秒"') ;
dbms_output.put_line(ret);
end;
137. 如何查询做比较大的排序的进程?
SELECT b.tablespace, b.segfile#, b.segblk#, b.blocks, a.sid, a.serial#, a.username, a.osuser, a.status
FROM v$session a,v$sort_usage b
WHERE a.saddr = b.session_addr
ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks ;
138. 如何查询做比较大的排序的进程的SQL语句?
select /*+ ORDERED */ sql_text from v$sqltext a
where a.hash_value = (
select sql_hash_value from v$session b
where b.sid = &sid and b.serial# = &serial)
order by piece asc ;
139. 如何查找重复记录?
SELECT * FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2);
140. 如何删除重复记录?
DELETE FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2);
141. 如何快速编译所有视图?
SQL >SPOOL VIEW1.SQL
SQL >SELECT ‘ALTER VIEW ‘||TNAME||’
COMPILE;’ FROM TAB;
SQL >SPOOL OFF
然后执行VIEW1.SQL即可。
SQL >@VIEW1.SQL;
142. ORA-01555 SNAPSHOT TOO OLD的解决办法
增加MINEXTENTS的值,增加区的大小,设置一个高的OPTIMAL值。
143. 事务要求的回滚段空间不够,表现为表空间用满(ORA-01560错误),回滚段扩展到达参数 MAXEXTENTS的值(ORA-01628)的解决办法。
向回滚段表空间添加文件或使已有的文件变大;增加MAXEXTENTS的值。
144. 如何加密ORACLE的存储过程?
下列存储过程内容放在AA.SQL文件中
create or replace procedure testCCB(i in number) as
begin
dbms_output.put_line('输入参数是'||to_char(i));
end;
SQL>wrap iname=a.sql;
PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Tue Nov 27 22:26:48 2001
Copyright (c) Oracle Corporation 1993, 2000. All Rights Reserved。
Processing AA.sql to AA.plb
运行AA.plb
SQL> @AA.plb ;
145. 如何监控事例的等待?
select event,sum(decode(wait_Time,0,0,1)) "Prev",
sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot"
from v$session_Wait
group by event order by 4;
146. 如何回滚段的争用情况?
select name, waits, gets, waits/gets "Ratio"
from v$rollstat C, v$rollname D
where C.usn = D.usn;
147. 如何监控表空间的 I/O 比例?
select B.tablespace_name name, B.file_name "file", A.phyrds pyr, A.phyblkrd pbr, A.phywrts pyw, A.phyblkwrt pbw
from v$filestat A, dba_data_files B
where A.file# = B.file_id
order by B.tablespace_name;
148. 如何监控文件系统的 I/O 比例?
select substr(C.file#,1,2) "#", substr(C.name,1,30) "Name", C.status, C.bytes, D.phyrds, D.phywrts
from v$datafile C, v$filestat D
where C.file# = D.file#;
149. 如何在某个用户下找所有的索引?
select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
from user_ind_columns, user_indexes
where user_ind_columns.index_name = user_indexes.index_name
and user_ind_columns.table_name = user_indexes.table_name
order by user_indexes.table_type, user_indexes.table_name,
user_indexes.index_name, column_position;
150. 如何监控 SGA 的命中率?
select a.value + b.value "logical_reads", c.value "phys_reads",
round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
from v$sysstat a, v$sysstat b, v$sysstat c
where a.statistic# = 38 and b.statistic# = 39
and c.statistic# = 40;
151. 如何监控 SGA 中字典缓冲区的命中率?
select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
(1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
from v$rowcache
where gets+getmisses <>0
group by parameter, gets, getmisses;
152. 如何监控 SGA 中共享缓存区的命中率,应该小于1% ?
select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
sum(reloads)/sum(pins) *100 libcache
from v$librarycache;
select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent"
from v$librarycache;
153. 如何显示所有数据库对象的类别和大小?
select count(name) num_instances ,type ,sum(source_size) source_size ,
sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size,
sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required
from dba_object_size
group by type order by 2;
154. 监控 SGA 中重做日志缓存区的命中率,应该小于1%
SELECT name, gets, misses, immediate_gets, immediate_misses,
Decode(gets,0,0,misses/gets*100) ratio1,
Decode(immediate_gets+immediate_misses,0,0,
immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
FROM v$latch WHERE name IN ('redo allocation', 'redo copy');
155. 监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size
SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts(disk)');
156. 如何监控当前数据库谁在运行什么SQL语句?
SELECT osuser, username, sql_text from v$session a, v$sqltext b
where a.sql_address =b.address order by address, piece;
157. 如何监控字典缓冲区?
SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE;
SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE;
SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE;
后者除以前者,此比率小于1%,接近0%为好。
SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES"
FROM V$ROWCACHE
158. 监控 MTS
select busy/(busy+idle) "shared servers busy" from v$dispatcher;
此值大于0.5时,参数需加大
select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher';
select count(*) from v$dispatcher;
select servers_highwater from v$mts;
servers_highwater接近mts_max_servers时,参数需加大
159. 如何知道当前用户的ID号?
SQL>SHOW USER;
或 SQL>select user from dual;
160. 如何查看碎片程度高的表?
SELECT segment_name table_name , COUNT(*) extents
FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name
HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name);
162. 如何知道表在表空间中的存储情况?
select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name;
163. 如何知道索引在表空间中的存储情况?
select segment_name,count(*) from dba_extents where segment_type='INDEX' and wner='&owner'
group by segment_name;
164、如何知道使用CPU多的用户session?
11是cpu used by this session
select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
from v$session a,v$process b,v$sesstat c
where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by value desc;
165. 如何知道监听器日志文件?
以8I为例
$ORACLE_HOME/NETWORK/LOG/LISTENER.LOG
166. 如何知道监听器参数文件?
以8I为例
$ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA
167. 如何知道TNS 连接文件?
以8I为例
$ORACLE_HOME/NETWORK/ADMIN/TNSNAMES.ORA
168. 如何知道Sql*Net 环境文件?
以8I为例
$ORACLE_HOME/NETWORK/ADMIN/SQLNET.ORA
169. 如何知道警告日志文件?
以8I为例
$ORACLE_HOME/ADMIN/SID/BDUMP/SIDALRT.LOG
170. 如何知道基本结构?
以8I为例
$ORACLE_HOME/RDBMS/ADMIN/STANDARD.SQL
171. 如何知道建立数据字典视图?
以8I为例
$ORACLE_HOME/RDBMS/ADMIN/CATALOG.SQL
172. 如何知道建立审计用数据字典视图?
以8I为例
$ORACLE_HOME/RDBMS/ADMIN/CATAUDIT.SQL
173. 如何知道建立快照用数据字典视图?
以8I为例
$ORACLE_HOME/RDBMS/ADMIN/CATSNAP.SQL
SQL语句的优化方法
174. /*+ALL_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化。
例如:
SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';
175. /*+FIRST_ROWS*/
表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化。
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';
176. /*+CHOOSE*/
表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;
表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';
177. /*+RULE*/
表明对语句块选择基于规则的优化方法。
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='CCBZZP';
178. /*+FULL(TABLE)*/
表明对表选择全局扫描的方法。
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='CCBZZP';
179. /*+ROWID(TABLE)*/
提示明确表明对指定表根据ROWID进行访问。
例如:
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='CCBZZP';
180. /*+CLUSTER(TABLE)*/
提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效。
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
181. /*+INDEX(TABLE INDEX_NAME)*/
表明对表选择索引的扫描方法。
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';
182. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明对表选择索引升序的扫描方法。
例如:
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='CCBZZP';
183. /*+INDEX_COMBINE*/
为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的
布尔组合方式。
例如:
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
WHERE SAL<5000000 AND HIREDATE<SYSDATE;
184. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
提示明确命令优化器使用索引作为访问路径。
例如:
SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
FROM BSEMPMS WHERE SAL<60000;
185. /*+INDEX_DESC(TABLE INDEX_NAME)*/
表明对表选择索引降序的扫描方法。
例如:
SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='CCBZZP';
186. /*+INDEX_FFS(TABLE INDEX_NAME)*/
对指定的表执行快速全索引扫描,而不是全表扫描的办法。
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';
187. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
提示明确进行执行规划的选择,将几个单列索引的扫描合起来。
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='CCBZZP' AND DPT_NO='TDC306';
188. /*+USE_CONCAT*/
对查询中的WHERE后面的OR条件进行转换为UNION ALL的组合查询。
例如:
SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
189. /*+NO_EXPAND*/
对于WHERE后面的OR 或者IN-LIST的查询语句,NO_EXPAND将阻止其基于优化器对其进行扩展。
例如:
SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
190. /*+NOWRITE*/
禁止对查询块的查询重写操作。
191. /*+REWRITE*/
可以将视图作为参数。
192. /*+MERGE(TABLE)*/
能够对视图的各个查询进行相应的合并。
例如:
SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;
193. /*+NO_MERGE(TABLE)*/
对于有可合并的视图不再合并。
例如:
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;
194. /*+ORDERED*/
根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接。
例如:
SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;
195. /*+USE_NL(TABLE)*/
将指定表与嵌套的连接的行源进行连接,并把指定表作为内部表。
例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
196. /*+USE_MERGE(TABLE)*/
将指定的表与其它行源通过合并排序连接方式连接起来。
例如:
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
197. /*+USE_HASH(TABLE)*/
将指定的表与其它行源通过哈希连接方式连接起来。
例如:
SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
198. /*+DRIVING_SITE(TABLE)*/
强制与ORACLE所选择的位置不同的表进行查询执行。
例如:
SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;199. /*+LEADING(TABLE)*/
将指定的表作为连接次序中的首表。
200. /*+CACHE(TABLE)*/
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
201. /*+NOCACHE(TABLE)*/
当进行全表扫描时,CACHE提示能够将表的检索块放置在缓冲区缓存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
202. /*+APPEND*/
直接插入到表的最后,可以提高速度。
insert /*+append*/ into test1 select * from test4 ;
203. /*+NOAPPEND*/
通过在插入语句生存期内停止并行模式来启动常规插入。
insert /*+noappend*/ into test1 select * from test4 ;
ORACLE内部函数
204. 如何得到字符串的第一个字符的ASCII值?
ASCII(CHAR)
SELECT ASCII('ABCDE') FROM DUAL;
结果: 65
205. 如何得到数值N指定的字符?
CHR(N)
SELECT CHR(68) FROM DUAL;
结果: D
206. 如何连接两个字符串?
CONCAT(CHAR1,CHAR2)
SELECT CONCAT('ABC','DEFGH') FROM DUAL;
结果: 'ABCDEFGH'
207. 如何将列中的数值代替为字符串?
DECODE(CHAR,N1,CHAR1,N2,CHAR2...)
SELECT DECODE(DAY,1,'SUN',2,'MON') FROM DUAL;
208. INITCAP(CHAR)
将字符串CHAR的第一个字符为大写,其余为小写。
SELECT INITCAP('ABCDE') FROM DUAL;
209. LENGTH(CHAR)
取一字符串CHAR的长度。
SELECT LENGTH('ABCDE') FROM DUAL;
210. LOWER(CHAR)
将字符串CHAR全部变为小写。
SELECT LOWER('ABCDE') FROM DUAL;
211. LPAD(CHAR1,N,CHAR2)
用字符串CHAR2包括的字符左填CHAR1,使其长度为N。
SELECT LPAD('ABCDEFG',10'123') FROM DUAL;
结果: '123ABCDEFG'
212. LTRIM(CHAR,SET)
从字符串CHAR的左边移去字符串SET中的字符,直到第一个不是SET中的字符为止。
SELECT ('CDEFG','CD') FROM DUAL;
结果: 'EFG'
213. NLS_INITCAP(CHAR)
取字符CHAR的第一个字符大写,其余字符为小写。
SELECT NLS_INITCAP('ABCDE') FROM DUAL;
214. NLS_LOWER(CHAR)
将字符串CHAR包括的字符全部小写。
SELECT NLS_LOWER('AAAA') FROM DUAL;
215. NLS_UPPER(CHAR)
将字符串CHAR包括的字符全部大写。
SELECT NLS_UPPER('AAAA') FROM DUAL;
216. REPLACE(CHAR1,CHAR2,CHAR3)
用字符串CHAR3代替每一个列值为CHAR2的列,其结果放在CHAR1中。
SELECT REPLACE(EMP_NO,'123','456') FROM DUAL;
217. RPAD(CHAR1,N,CHAR2)
用字符串CHAR2右填字符串CHAR1,使其长度为N。
SELECT RPAD('234',8,'0') FROM DUAL;
218. RTRIM(CHAR,SET)
移去字符串CHAR右边的字符串SET中的字符,直到最后一个不是SET中的字符为止。
SELECT RTRIM('ABCDE','DE') FROM DUAL;
219. SUBSTR(CHAR,M,N)
得到字符串CHAR从M处开始的N个字符. 双字节字符,一个汉字为一个字符的。
SELECT SUBSTR('ABCDE',2,3) FROM DUAL;
220. SUBSTRB(CHAR,M,N)
得到字符串CHAR从M处开始的N个字符. 双字节字符,一个汉字为二个字符的。
SELECT SUBSTRB('ABCDE',2,3) FROM DUAL;
221. TRANSLATE(CHAR1,CHAR2,CHAR3)
将CHAR1中的CHAR2的部分用CHAR3代替。
SELECT TRANSLATE('ABCDEFGH','DE','MN') FROM DUAL;
222. UPPER(CHAR)
将字符串CHAR全部为大写。
223. ADD_MONTHS(D,N)
将N个月增加到D日期。
SELECT ADD_MONTHS(SYSDATE,5) FROM DUAL;
224. LAST_DAY(D)
得到包含D日期的月份的最后的一天的日期。
SELECT LAST_DAY(SYSDATE) FROM DUAL;
225. MONTH_BETWEEN(D1,D2)
得到两个日期之间的月数。
SELECT MONTH_BETWEEN(D1,D2) FROM DUAL;
226. NEXT_DAY(D,CHAR)
得到比日期D晚的由CHAR命名的第一个周日的日期。
SELECT NEXT_DAY(TO_DATE('2003/09/20'),'SATDAY') FROM DUAL;
227. ROUNT(D,FMT)
得到按指定的模式FMT舍入到的最进的日期。
SELECT ROUNT('2003/09/20',MONTH) FROM DUAL;
228. SYSDATE
得到当前系统的日期和时间。
SELECT SYSDATE FROM DUAL;
229. TO_CHAR(D,FMT)
将日期D转换为FMT的字符串。
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD') FROM DUAL;
230. TO_DATE(CHAR,FMT)
将字符串CHAR按FMT的格式转换为日期。
SELECT TO_DATE('2003/09/20','YYYY/MM/DD') FROM DUAL;
231. ABS(N)
得到N的绝对值。
SELECT ABS(-6) FROM DUAL;
232. CEIL(N)
得到大于或等于N的最大整数。
SELECT CEIL(5.6) FROM DUAL;
233. COS(N)
得到N的余弦值。
SELECT COS(1) FROM DUAL;
234. SIN(N)
得到N的正弦值。
SELECT SIN(1) FROM DUAL;
235. COSH(N)
得到N的双曲余弦值。
SELECT COSH(1) FROM DUAL;
236. EXP(N)
得到N的E的N次幂。
SELECT EXP(1) FROM DUAL;
237. FLOOR(N)
得到小于或等于N的最小整数。
SELECT FLOOR(5.6) FROM DUAL;
238. LN(N)
得到N的自然对数。
SELECT LN(1) FROM DUAL;
239. LOG(M,N)
得到以M为底N的对数。
SELECT LOG(2,8) FROM DUAL;
240. MOD(M,N)
得到M除以N的余数。
SELECT MOD(100,7) FROM DUAL;
241. POWER(M,N)
得到M的N幂。
SELECT POWER(4,3) FROM DUAL;
242. ROUND(N,M)
将N舍入到小数点后M位。
SELECT (78.87653,2) FROM DUAL;
243. SIGN(N)
当N<0时,得到-1;
当N>0时,得到1;
当N=0时,得到0;
SELECT SIGN(99) FROM DUAL;
244. SINH(N)
得到N的双曲正弦值。
SELECT SINH(1) FROM DUAL;
245. SORT(N)
得到N的平方根,N>=0
SELECT SORT(9) FROM DUAL;
246. TAN(N)
得到N的正切值。
SELECT TAN(0) FROM DUAL;
247. TANH(N)
得到N的双曲正切值。
SELECT TANH(0) FROM DUAL;
248. TRUNC(N,M)
得到在M位截断的N的值。
SELECT TRUNC(7.7788,2) FROM DUAL;
249. COUNT()
计算满足条件的记录数。
SELECT COUNT(*) FROM TABLE1 WHERE COL1='AAA';
250. MAX()
对指定的列求最大值。
SELECT MAX(COL1) FROM TABLE1;
251. MIN()
对指定的列求最小值。
SELECT MIN(COL1) FROM TABLE1;
252. AVG()
对指定的列求平均值。
SELECT AVG(COL1) FROM TABLE1;
253. SUM()
计算列的和。
SELECT SUM(COL1) FROM DUAL;
254. TO_NUMBER(CHAR)
将字符转换为数值。
SELECT TO_NUMBER('999') FROM DUAL;
255. CHARTOROWID(CHAR)
将包含外部语法ROWID的CHAR或VARCHAR2数值转换为内部的二进制语法,参数CHAR必须是包含外部语法的ROWID的18字符的字符串。
SELECT NAME FROM BSEMPMS WHERE ROWID=CHARTOROWID('AAAAfZAABAAACp8AAO');
NAME : LEIXUE
256. CONVERT(CHAR,DEST_CHAR_SET,SOURCE_CHAR_SET)
CONVERT将字符串CHAR中的字符从SOURCE_CHAR_SET标识的字符集转换为由DEST_CHAR_SET标识的字符集
SELECT CONVERT('GroB','US7ASCII','WE8HP') 'CONVERSION' FROM PUBS;
CONVERSION: Gross
257. HEXTORAW(CHAR)
将包含十六进制的CHAR转换为一个RAW数值。
INSERT INTO BSEMPMS(RAW_COLUMN) SELECT HEXTORAW('7D') FROM TEST;
258. RAWTOHEX(RAW)
将RAW数值转换为一个包含十六进制的CHAR值。
SELECT RAWTOHEX(RAW_COLUMN) 'CONVERSION' FROM BSEMPMS;
CONVERSION: 7D
259. ROWIDTOCHAR(ROWID)
将一个ROWID数值转换为VARCHAR2数据类型。
SELECT ROWID FROM BSEMPMS WHERE ROWIDTOCHAR(ROWID) LIKE '%BR1AAB%';
260. TO_MULTI_BYTE(CHAR)
将CHAR中的单字节转换为等价的多字节字符。
SELECT TO_MULTI_BYTE('ASFDFD') FROM TEST;
261. TO_SINGLE_BYTE(CHAR)
将CHAR中的多字节转换为等价的单字节字符。
SELECT TO_SINGLE_BYTE('ASFDFD') FROM TEST;
262. TRANSLATE USING(TEXT USING {CHAR_CS|NCHAR_CS})
将文本TEXT按照指定的转换方式转换成数据库字符集和民族字符集。
其中TEXT是待转换的。
USING CHAR_CS参数转换TEXT为数据库字符集,输出数据类型是VARCHAR2。
USING NCHAR_CS参数转换TEXT为数据库字符集,输出数据类型是NVARCHAR2。
CREATE TABLE TEST(CHAR_COL CHAR(20),NCHAR_COL NCHAR(20));
INSERT INTO TEST VALUES('HI,N'BYE');
SELECT * FROM TEST;
263. DUMP(EXPR,RETURN_FORMAT,START_POSITION,LENGTH)
返回一个包含数据类型代码,字节长度等内部表示信息的VARCHAR2值.返回结果是当前数据库字符集,数据类型按照下面规定的内部数据类型的编码作为一个数字进行返回:
代码 数据类型
0 VARCHAR2
1 NUMBER
8 LONG
12 DATE
23 RAW
24 LONG RAW
69 ROWID
96 CHAR
106 MSSLABEL
参数RETUEN_FORMAT指定按照下面的基数表示返回的数值。
RETURN_FORMAT RESULT
8 8进制
10 10进制
16 16进制
17 单字符表示
如果参数RETURN_FORMAT没有指定,则按十进制表示返回。
如果参数START_POSITION和LENGTH被指定,则从START_POSITION开始的长为LENGTH的字节将被返回,缺省是返回整数表示。
SELECT DUMP('ABC',1016) FROM TEST;
select dump(ename,8,3,2) 'example' from emp where name='ccbzzp';
264. empty_b|clob()
返回一个空的LOB定位符,用在初始化LOB变量,或用在INSERT及UPDATE声明去初始化LOB列或将其属性置为空。
INSERT INTO TABLE1 VALUES(EMPTY_BLOB());
UPDATE TABLE1 SET CLOB_COL=EMPTY_BLOB();
265. BFILENAME('DIRECTORY','FILENAME')
返回一个BFILE定位符,相关的二进制LOB物理文件在服务器的文件系统上.目录DIRECTORY是指在服务器的文件系统上实际搜索路径全名的别名. FILENAME是指服务器的文件系统的文件名。
INSERT INTO FILE_TAB VALUES(BFILENAME('LOB_DIR','IMAGE1.GIF'));
266. GREATEST(EXPR,EXPR,...)
GREATEST返回参数的最大值。
SELECT GREATEST('HARRY','HARRIOT','HAROLD') 'SAMPLE' FROM TABLE1;
267. LEAST(EXPR,EXPR,...)
LEAST返回参数的最小值。
SELECT LEAST('HARRY','HARRIOT','HAROLD') 'SAMPLE' FROM TABLE1;
268. NLS_CHARSET_DECL_LEN(BYTECNT,CSID)
返回一个NCHAR列的宽度。
SELECT NLS_CHARSET_DECL_LEN(200,NLS_CHARSET_ID('JA16EEFDFDF')) FROM TABLE1;
269. NLS_CHARSET_ID(TEXT)
返回相应于NLS字符集名字的NLS字符集ID数。
SELECT NLS_CHARSET_D('JADFDFFDF') FROM TABLE1;
270. NLS_CHARSET_NAME(N)
返回相应于ID数N的NLS字符集名称。
SELECT NLS_CHARSET_NAME(2) FROM TABLE1;
271. NVL(EXPR1,EXPR2)
若EXPR1是NULL,则返回EXPR2,否则返回EXPR1。
SELECT NAME,NVL(TO_CHAR(COMM),'NOT APPLICATION') FROM TABLE1;
272. UID
返回唯一标识当前数据库用户的整数。
SELECT UID FROM TABLE1;
273. USER
用VARCHAR2数据类型返回当前ORACLE用户的名称。
SELECT USER,UID FROM TABLE1;
274. USERENV(OPTION)
返回当前的会话信息。
PTION='ISDBA'若当前是DBA角色,则为TRUE,否则FALSE。
OPTION='LANGUAGE'返回数据库的字符集。
OPTION='SESSIONID'为当前会话标识符。
OPTION='ENTRYID'返回可审计的会话标识符。
OPTION='LANG'返回会话语言名称的ISO简记。
OPTION='INSTANCE'返回当前的实例。
SELECT USERENV('LANGUAGE') FROM DUAL;
275. VSIZE(EXPR)
返回EXPR内部表示的字节数。
SELECT NAME,VSIZE(NAME) FROM TABLE1;
276. DEREF(E)
返回参数E的对象引用。
SELECT DEREF(C2) FROM TABLE1;
277. REFTOHEX(R)
将参数R转换为16进制。
SELECT REFTOHEX(C2) FROM TABLE1;
278. MAKE_REF(TABLE,KEY,KEY...)
通过把给定的键作为主键来创建给定视图对象中一行的引用。
CREATE TYPE T1 AS OBJECT(A NUMBER,B NUMBER);
CREATE TABLE TB1(C1 NUMBER,C2 NUMBER,PRIMARY KEY(C1,C2));
CREATE VIEW V1 OF T1 WITH OBJECT OID(A,B) AS SELECT * FROM TB1;
SELECT MAKE_REF(V1,1,3) FROM PUBS;
279. STDDEV(DISTINCT|ALL X)
STDDEV给出一组行值的标准差。
SELECT STDDEV(SALARY) AS EXAMPLE FROM EMPLOYEE;
280. VARIANCE(DISTINCT|ALL X)
VARIANCE返回一组行中所有VALUE的方差。
SELECT VARIANCE(SALARY) AS EXAMPLE FROM EMPLOYEE;
9I管理的V$视图
281. V$ACCESS
显示当前被锁定的数据库中的对象及正在访问他们的会话。
282. V$ACTIVE_INSTANCES
为当前安装的数据库中出现的所有实例建立从实例名到实例号的映射。
283. V$ACTIVE_SESS_POOL_MTH
所有活动的会话池资源分配方法。
284. V$AQ
当前数据库中的队列的统计量。
285. V$ARCHIVE
归档所需的重做日志文件中的信息。
286. V$ARCHIVE_DEST
当前实例的所有归档日志目的文件及它们的当前值,模式,状态。
287. V$ARCHIVE_PROCESSES
为一个实例提供不同的ARCH进程状态的信息。
288. V$ARCHIVE_LOG
控制文件中的归档日志信息。
289. V$BACKUP
所有联机数据文件的备份状态。
290. V$BACKUP_ASYNC_IO
从控制文件中显示备份集的信息。
291. V$BACKUP_CORRUPTION
从控制文件中显示数据文件备份中有关损坏的信息。
292. V$BACKUP_DATAFILE
从控制文件中显示备份数据文件和备份控制文件的信息。
293. V$BACKUP_DEVICE
显示关于支持备份设备的信息。
294. V$BACKUP_PIECE
从控制文件中显示备份块的信息。
295. V$BACKUP_REDOLOG
从控制文件中显示关于备份集中归档日志的信息。
296. V$BACKUP_SET
从控制文件中显示备份集的信息。
297. V$BACKUP_SYNC_IO
从控制文件中显示备份集的信息。
298. V$BGPROCESS
描述后台进程。
299. V$BH
是9I的实时应用集群视图.为系统全局区中的每一个缓冲区给出了状态和探查次数。
300. V$BSP
显示用在缓存中块服务器后台进程上的统计信息。
301. V$BUFFER_POOL
显示实例缓冲池的信息。
302. V$BUFFER_POOL_STATISTICS
显示实例缓冲池的信息。
303. V$CACHE
包含当前实例的SGA中的每一个块的头部信息。
304. V$CACHE_LOCK
包含当前实例的SGA中的每一个块的头部信息. 和V$CACHE非常相似,
除特使平台锁管理器标识符号不同外。
305. V$CACHE_TRANSFER
除了只显示那些被探查了至少一次的块的信息外,和V$CACHE功能相同。
306. V$CIRCUIT
包含关于虚电路的信息,是用户通过调度程序和服务器到数据库的所有连接。
307. V$CLASS_PING
显示每一个块类中被探查块的数目。
308. V$COMPATIBILITY
显示数据库实例使用的特征,可以阻止数据库回到早期的版本中去。
309. V$COMPATSEG
显示数据库实例使用的永久性特征,可以阻止数据库回到早期的版本中去。
310. V$CONTEXT
列出当前对话的设置属性。
311. V$CONTROLFILE
列出控制文件的名称。
312. V$CONTROLFILE_RECORD_SECTION
显示控制文件记录部分的信息。
313. V$COPY_CORRUPTION
显示控制文件中数据文件损坏的信息。
314. V$CR_BLOCK_SERVER
显示用在缓存中块服务器后台进程上的统计信息。
315. V$DATABASE
包含控制文件中数据库的信息。
316. V$DATAFILE
包含控制文件中数据库文件的信息。
317. V$DATAFILE_COPY
包含控制文件中数据库文件副本的信息。
318. V$DATAFILE_HEADER
显示数据文件头部的数据文件信息。
319. V$DB_CACHE_ADVICE
根据缓存的大小估计出物理读的数量。
320. V$DB_OBJECT_CACHE
缓存在库缓存中的数据库对象。
321. V$DB_PIPES
显示实例中的共享池当前描绘的管道。
322. V$DBFILE
列出组成数据库的所有数据文件。
323. V$DBLINK
查询会话所打开的所有数据库连接。
324. V$DELETED_OBJECT
显示控制文件中被删除归档日志。
325. V$DISPATCHER
提供调度进程的信息。
326. V$DISPATCHER_RATE
为调度进程提供优质提供速率统计量。
327. V$DLM_ALL_LOCKS
列出当前所有锁的信息。
328. V$DLM_CONVERT_LOCAL
本地锁转换操作所消耗的时间。
329. V$DLM_CONVERT_REMOTE
远程锁转换操作所消耗的时间。
330. V$DLM_LATCH
它是过时的,参见V$LATCH
331. V$DLM_LOCKS
这些是锁管理器已知的被阻塞或阻塞其它对象的锁信息。
332. V$DLM_MISC
显示多种DLM统计量。
333. V$DLM_RESS
显示当前锁管理器已知的全部资源的信息。
334. V$ENABLEDPRIVE
显示被授予的特权。
335. V$ENQUEUE_LOCK
显示排队对象所拥有的全部锁。
33 -
什么是UAT测试?
2009-08-11 12:03:19
什么是UAT测试?
目前公司在各个项目的测试过程中都会提到UAT测试,那么什么是UAT测试?UAT测试一般包含哪些测试步骤哪?UAT测试的重点是什么?
UAT(user acceptance Test):用户接受测试。
一般包含以下步骤:
一步:用户培训手册准备(就是针对要进行UAT测试的对象,及要进行培训的用户,准备一些培训资料,一般是测试对象使用/功能手册及要培训的用户的个人资料等等)。
二步:测试脚本发放(如果你公司采用自动化测试,那么每一个功能或一个模块等都有对应的测试脚本,可以把这些测试脚本分发给特点的人员;如果采用手工测试,就要把详细描述一个功能或模块的文档分给相关人员(当然自动化测试也要分发))。
三步:用户补充业务测试场景和测试数据(就是:请有代表性的一些最终用户根据实际应用环境及一些常用处理的数据,来给一些补充与建议,越贴近实际应用越好)。
四步:顾问补充测试步骤(你可以请项目专家,测试经理,或专门的测试,开发等顾问对测试步骤进行补充)。
五步:培训资料及测试脚本文档的确定与最终输出(一般到此,各种资料都基本确定,这时可以将它们进行打印,或形成特别的电子文档)。
六步:测试策略的制定。
七步:测试用户的确定(大体上从培训人员中选取,因为不能每个接受培训的人员都是资格去测试的,这里你可以通过一些考核来实现人员的筛选等等)。
八步:由专门的测试组织机构确定测试地点,并发出通知。
九步:测试网络环境的搭建和保障(包括网络,系统,硬软件,包括一些case工具等)。
十步:组织进行测试。
十一步:评审分析提交的问题(这就进入了一般bug处理过程,形成了一个循环)。
UAT测试的重点,我想主要体现在以下几个方面:
一是:培训的资料表述要准确全面,易懂等(这是理论基础)。
二是:人员选择,要典型有代表性(用户基础)。
三是:测试流程步骤(要周密)。
四是:测试策略制定(确定一个适合测试对象及测试人员的测试策略)
五是:问题的表达与处理(因为测试者不是专业开发测试人员,对于问题的表达可能不能到位,或根本就不是那种问题,这就存在如何复现与转化问题等)。
-
解释测试之走廊对话的法则
2009-08-11 12:01:40
解释测试之走廊对话的法则
测试不仅是一种质量控制也是一种服务,正式由于测试的独特角色,决定了测试人员在测试的过程中需要和各种较色的人员打交道;怎么向别人解释清楚什么是测试,就是一门解释测试的学问了。我相信并不是每个人都能做好这一点。
通过什么来指导我们和不懂测试的人员进行测试交流哪:就是它---走廊对话的法则:
1、 从实践中发言。保持真实,拥有自己的方式。如果你没有完全明白其他人的言谈避免使用它,因为持怀疑态度的听众将会反复询问你,使它成为正在进行的项目以改善你对于测试技术的理解,通过将它们用于实践观察你是如何改变自己得想法的,并且使得你的想法影响其他人的实践。
2、 和他们联系起来。比你的听众在某方面先进,将自己的身份放低。一个执行副总裁关心什么?一个技术支撑管理人员的一天是什么?一个项目经理的首要担心的三个问题是什么?将你的企图、知识和感兴趣的方面调整到你听众的一边。
3、 查看你的条款。很多次我的解释说明已经挫败了意想不到的分歧术语。条款如测试、测试用例、测试计划、回归测试和缺陷,这些我称之为危险术语,因为对于这些条款有很多不同的定义。如果你辩证的看待自己,考虑像以前一样简要定义这些条款。
4、 展示出尊重。对待每个人好像他们都是非常聪明的人,并且他们和你一样的关心质量。尊重异议和问题,我发现我有时候可以将处于敌对状态的听众通过善意的,有洞察力的解释转变过来,这和他们是否真的有企图和有洞察力是没有关系的。我用这种方式对待他们,因为不这样做肯定会失败。
5、 引出有趣的话题。你不可能向一个不感兴趣的人有成果的解释事情。引起你的听众一点的兴趣他就会提出问题。如何这样做的方法之一就是抛出一些显而易见的不清楚的地方、行话或者和你的解释说明矛盾的地方,如果你的听众询问他们,你就回答说“好眼光,我非常乐意听到你这样询问,这是个非常重要的问题。”如果他们不询问,他们说“你或许没有注意到这里有一个矛盾的地方,你将有权提出质疑?”不论是那种方式,继续将该问题更好的解释。
6、 解释问题发生后的事情。按照你的想法做了执行的差异是什么?你希望发生什么?如果我们接受了你的测试观点我们行为有何不同?将注意力集中在你解释后面的任务上。
7、 迅速一点,找到关键。使用简短的语句,那么也许你可以完成你的解释,而不是在妙语连珠以前就被阻止。
8、 展示出人人如何参与。我尽自己最大努力将项目的情况真实的描述:我们都在一起,我们都有贡献,如果事情出错了我们共同承担。如果你发现解释每个人所扮演的角色比较困难,那么停下来思考你是否能够成功的解释这个项目。如果只是牵扯你一个人,那么你将会使你的听众厌烦,如果只是牵扯进他们,那么你听起来像是插足了不是你的业务范围的领域。
9、 准备充分。开发多种解释的标准、预先的比喻以及不明白的时候要记录。解释测试的想法经常是在我真正在测试时,所以我准备了一个记事本用来捕获这些想法,现在我有一大堆的记事本,上面写满了解释的片段。
-
数据库中的锁机制
2009-05-13 15:25:31
数据库中的锁机制
锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。目前,大多数数据库管理系统都或多或少具有自我调节、自我管理的功能,因此很多用户实际上不清楚锁的理论和所用数据库中锁的具体实现。
Microsoft SQL Server(以下简称SQL Server)作为一种中小型数据库管理系统,已经得到了广泛的应用,该系统更强调由系统来管理锁。在用户有SQL请求时,系统分析请求,自动在满足锁定条件和系统性能之间为数据库加上适当的锁,同时系统在运行期间常常自动进行优化处理,实行动态加锁。对于一般的用户而言,通过系统的自动锁定管理机制基本可以满足使用要求,但如果对数据安全、数据库完整性和一致性有特殊要求,就必须自己控制数据库的锁定和解锁,这就需要了解SQL Server的锁机制,掌握数据库锁定方法。
锁的多粒度性以及锁升级
数据库中的锁是指一种软件机制,用来指示某个用户(也即进程会话,下同)已经占用了某种资源,从而防止其他用户做出影响本用户的数据修改或导致数据库数据的非完整性和非一致性。这儿所谓资源,主要指用户可以操作的数据行、索引以及数据表等。根据资源的不同,锁有多粒度(multigranular)的概念,也就是指可以锁定的资源的层次。SQL Server中能够锁定的资源粒度包括:数据库、表、区域、页面、键值(指带有索引的行数据)、行标识符(RID,即表中的单行数据)。
采用多粒度锁的重要用途是用来支持并发操作和保证数据的完整性。SQL Server根据用户的请求,做出分析后自动给数据库加上合适的锁。假设某用户只操作一个表中的部分行数据,系统可能会只添加几个行锁(RID)或页面锁,这样可以尽可能多地支持多用户的并发操作。但是,如果用户事务中频繁对某个表中的多条记录操作,将导致对该表的许多记录行都加上了行级锁,数据库系统中锁的数目会急剧增加,这样就加重了系统负荷,影响系统性能。因此,在数据库系统中,一般都支持锁升级(lock escalation)。所谓锁升级是指调整锁的粒度,将多个低粒度的锁替换成少数的更高粒度的锁,以此来降低系统负荷。在SQL Server中当一个事务中的锁较多,达到锁升级门限时,系统自动将行级锁和页面锁升级为表级锁。特别值得注意的是,在SQL Server中,锁的升级门限以及锁升级是由系统自动来确定的,不需要用户设置。
锁的模式和兼容性
在数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式,SQL Server中锁模式包括:
1.共享锁
SQL Server中,共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。默认情况下,数据被读取后,SQL Server立即释放共享锁。例如,执行查询“SELECT * FROM my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连接选项设置和SELECT语句中的锁定设置都可以改变SQL Server的这种默认设置。例如,“ SELECT * FROM my_table HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。
2.修改锁
修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为独占锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为独占锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请修改锁,在数据修改的时候再升级为独占锁,就可以避免死锁。修改锁与共享锁是兼容的,也就是说一个资源用共享锁锁定后,允许再用修改锁锁定。
3.独占锁
独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。独占锁不能和其他锁兼容。
4.结构锁
结构锁分为结构修改锁(Sch-M)和结构稳定锁(Sch-S)。执行表定义语言操作时,SQL Server采用Sch-M锁,编译查询时,SQL Server采用Sch-S锁。
5.意向锁
意向锁说明SQL Server有在资源的低层获得共享锁或独占锁的意向。例如,表级的共享意向锁说明事务意图将独占锁释放到表中的页或者行。意向锁又可以分为共享意向锁、独占意向锁和共享式独占意向锁。共享意向锁说明事务意图在共享意向锁所锁定的低层资源上放置共享锁来读取数据。独占意向锁说明事务意图在共享意向锁所锁定的低层资源上放置独占锁来修改数据。共享式独占锁说明事务允许其他事务使用共享锁来读取顶层资源,并意图在该资源低层上放置独占锁。
6.批量修改锁
批量复制数据时使用批量修改锁。可以通过表的TabLock提示或者使用系统存储过程sp_tableoption的“table lock on bulk load”选项设定批量修改锁。
另外,SQL Server命令语句操作会影响锁定的方式,语句的组合也同样能产生不同的锁定,详情如下表:
锁冲突及其防止办法
在数据库系统中,死锁是指多个用户(进程)分别锁定了一个资源,并又试图请求锁定对方已经锁定的资源,这就产生了一个锁定请求环,导致多个用户(进程)都处于等待对方释放所锁定资源的状态。
在SQL Server中,系统能够自动定期搜索和处理死锁问题。系统在每次搜索中标识所有等待锁定请求的进程会话,如果在下一次搜索中该被标识的进程仍处于等待状态,SQL Server就开始递归死锁搜索。 -
测试经验总结
2009-04-30 09:37:41
1、 测试人员要提高自己的分层测试思想,在划分测试点的时候不光要从业务的角度考虑,还要充分考虑数据的特殊性。
2、 测试人员也应当具有一定的市场意识和风险意识,能够站在不同的角度,尽可能的分析系统可能存在的风险场景。
3、 测试负责人制定测试计划粒度要小、周期要短;测试组成员对于自己的工作都有明确的目标和子目标。特别是存在交叉测试的模块,测试人员一定要责任明确,确保没有漏测的场景。
4、 测试人员一定要有自我推销意识,主动加强与开发人员、需求人员及客户的沟通。
5、 测试人员也应该像质量管理人员一样,在项目中起到过程监控点的作用。能够从全局的角度反映项目存在的问题。
6、 提高测试效率很重要的一点就是对可复用资产的充分利用;可复用资产中比较重要的一部分就是测试用例的复用,所以在以后的测试中一定要充分利用可复用的测试用例提高测试用例的编写效率。
7、“经验的浪费是最大的浪费”,测试人员一定要善意总结,把自己的测试经验记录下来,这样不仅能完善自己的测试思想还能为同事提供系统的学习经验
-
oracle10g安装与配置教程
2009-04-28 16:51:30
从网上查找的一篇oracle10g安装与配置教程,拿过来学习了!有朋友想用可以下载附件。
-
经典的性能测试模型
2009-04-21 12:03:11
业务场景描述:5000个用户分批次登陆系统,但是要保证登陆的用户中,时刻有一定比例的用户做业务(6%),其他用户登陆后等待;执行完业务的用户进入等待队列,然后从等待队列选取一人继续执行业务,但是要保证时刻有6%的执行业务占比。可以控制总的性能测试执行时间!
如下是我编写的场景脚本:
#include <VU.h>
#include <cvicse.h>
{
string logger;
//共享变量,控制业务的起止时间
shared t_start,t_end;
int t,t_zong;
//用于第一组并发用户的判断,同时也把值赋予id_yw;
shared num_yw,num_yw1;
//业务组内,每个虚拟用户的id
int id_yw;
//下一个操作业务的用户id
shared id_next,share;
int num_zong, num_binf;
//设定wait的等待时间
int time_out;//根据业务所占比重计算,暂时用2,测试取整函数!
num_zong = _nusers;
num_binf = (_nusers*3)/10;//设定wait的等待时间,越长越好,假若一直没被激活,此时间可以设置为session的失效时间。
time_out = (_nusers)*3000;//t_zong,业务运行时间,暂时根据并发用户计算,1200 60,60,1000
t_zong = (_nusers)*3000;//登录系统,一秒两个用户
//delay((_uid)*500);
share = num_binf;//开始业务
num_yw1++;
id_yw = num_yw1;
t_start = start_time["yw_time"];
do{
num_yw++;
//第一次发起并发,发起id_yw比较小的(数量为该组需要并发的人数),大于id_yw的用户等待被激活
if(num_yw > num_binf)
{
//此处用户一直在监听,是否被激活,即现有操作人员结束操作后,随机产生的id号是否与自己匹配。如果匹配则开始业务操作,否则继续等待。
wait(&id_next,id_yw,id_yw,0,time_out);
if(wait(&id_next,id_yw,id_yw,0,time_out) == 0)
{
//break;
//script_exit("");
user_exit(-1, "Fatal Error - Aborting");
}
//说明:此处判断是否是被正常激活。0为等待超时(非正常激活)。当suite结束时,势必会造成大量的
//用户非正常激活,从而同时并发下面的业务。所以,此处设置适当延迟,使用户顺序推出。
//delay(id_yw*10000);
}
else
{
logger = "the yw is starting.....";
writelog(logger);
}
//else直接往下走。
//开始操作业务
//使用delay(8000)模拟业务
delay(8000);
//结束操作业务
t_end = stop_time["yw_time"];t = t_end - t_start;
//业务结束后,在用户组内随机取一个用户id,赋给共享变量next_id
//id_next = ((rand()) % num_zong )+1;
share++;
if(share<=num_zong)
{
id_next =share;
}else{
share = 1;
id_next =share;
}}while(t<t_zong);
} -
静坐思
2009-04-20 13:27:36
美人泪
谁在指间流过了千年的时光
谁在反复地追问着可曾遗忘
我爱你用尽了我所有的悲伤
你眼中却有我看不懂的凄凉 -
Java中数据库连接池原理机制的详细讲解
2009-04-13 15:15:18
连接池的基本工作原理
1、基本概念及原理
由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配?释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量?使用情况,为系统开发?测试及性能调整提供依据。
2、服务器自带的连接池
JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere等提供了连接池的机制,但是必须有其第三方的专用类方法支持连接池的用法。
连接池关键问题分析
1、并发问题
为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为Java语言自身提供了对并发管理的支持,使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如:
public synchronized Connection getConnection()
2、多数据库服务器和多用户
对于大型的企业级应用,常常需要同时连接不同的数据库(如连接Oracle和Sybase)。如何连接不同的数据库呢?我们采用的策略是:设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的url地址()?用户名()?密码()等信息。如tx.url=172.21.15.123:5000/tx_it,tx.user=yang,tx.password=yang321。根据资源文件提供的信息,创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。
对于同一个数据库有多个用户使用不同的名称和密码访问的情况,也可以通过资源文件处理,即在资源文件中设置多个具有相同url地址,但具有不同用户名和密码的数据库连接信息。
3、事务处理
我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-ALL-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。
在Java语言中,Connection类本身提供了对事务的支持,可以通过设置Connection的AutoCommit属性为false,然后显式的调用commit或rollback方法来实现。但要高效的进行Connection复用,就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现,这种方法可以大大降低事务管理的复杂性。
4、连接池的分配与释放
连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。
对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxConn),如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout,则返回空值(null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法。
5、连接池的配置与维护
连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConn)和最大连接数(maxConn)来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。
如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。
连接池的实现
1、连接池模型
本文讨论的连接池包括一个连接池类(DBConnectionPool)和一个连接池管理类(DBConnetionPoolManager)。连接池类是对某一数据库所有连接的“缓冲池”,主要实现以下功能:①从连接池获取或创建可用连接;②使用完毕之后,把连接返还给连接池;③在系统关闭前,断开所有连接并释放连接占用的系统资源;④还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。
连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理,具有以下功能:①装载并注册特定数据库的JDBC驱动程序;②根据属性文件给定的信息,创建连接池对象;③为方便管理多个连接池对象,为每一个连接池对象取一个名字,实现连接池名字与其实例之间的映射;④跟踪客户使用连接情况,以便需要是关闭连接释放资源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理,如系统需要连接不同的数据库,或连接相同的数据库但由于安全性问题,需要不同的用户使用不同的名称和密码。
2、连接池实现
下面给出连接池类和连接池管理类的主要属性及所要实现的基本接口:
public class DBConnectionPool implements TimerListener{
private int checkedOut;//已被分配出去的连接数
private ArrayList freeConnections=new ArrayList();
//容器,空闲池,根据//创建时间顺序存放已创建但尚未分配出去的连接
private int minConn;//连接池里连接的最小数量
private int maxConn;//连接池里允许存在的最大连接数
private String name;//为这个连接池取个名字,方便管理
private String password;//连接数据库时需要的密码
private String url;//所要创建连接的数据库的地址
private String user;//连接数据库时需要的用户名
public Timer timer;//定时器
public DBConnectionPool(String name,String URL,String user,
String password,int maxConn)//公开的构造函数
public synchronized void freeConnection(Connection con)
//使用完毕之后,把连接返还给空闲池
public synchronized Connection getConnection(long timeout)
//得到一个连接,timeout是等待时间
public synchronized void release()
//断开所有连接,释放占用的系统资源
private Connection newConnection()
//新建一个数据库连接
public synchronized void TimerEvent()
//定时器事件处理函数
}
public class DBConnectionManager {
static private DBConnectionManager instance;
//连接池管理类的唯一实例
static private int clients;//客户数量
private ArrayList drivers=new ArrayList();
//容器,存放数据库驱动程序
private HashMap pools = new HashMap();
//以name/value的形式存取连接池对象的名字及连接池对象
static synchronized public DBConnectionManager getInstance()
/**如果唯一的实例instance已经创建,直接返回这个实例;否则,调用私有构造函数,
创建连接池管理类的唯一实例*/
private DBConnectionManager()
//私有构造函数,在其中调用初始化函数init()
public void freeConnection(String name,Connection con)
//释放一个连接,name是一个连接池对象的名字
public Connection getConnection(String name)
//从名字为name的连接池对象中得到一个连接
public Connection getConnection(String name,long time)
//从名字为name的连接池对象中取得一个连接,time是等待时间
public synchronized void release()//释放所有资源
private void createPools(Properties props)
//根据属性文件提供的信息,创建一个或多个连接池
private void init()//初始化连接池管理类的唯一实例,由私有构造函数调用
private void loadDrivers(Properties props)//装载数据库驱动程序
}
3、连接池使用
上面所实现的连接池在程序开发时如何应用到系统中呢?下面以Servlet为例说明连接池的使用。
Servlet的生命周期是:在开始建立servlet时,调用其初始化(init)方法。之后每个用户请求都导致一个调用前面建立的实例的service方法的线程。最后,当服务器决定卸载一个servlet时,它首先调用该servlet的destroy方法。
根据servlet的特点,我们可以在初始化函数中生成连接池管理类的唯一实例(其中包括创建一个或多个连接池)。如:
public void init() throws ServletException
{
connMgr=DBConnectionManager.getInstance();
}
然后就可以在service方法中通过连接池名称使用连接池,执行数据库操作。最后在destroy方法中释放占用的系统资源,如:
public void destroy(){
connMgr.release();
super.destroy();
}
结束语
在使用JDBC进行与数据库有关的应用开发中,数据库连接的管理是一个难点。很多时候,连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用效率的瓶颈。对于众多用户访问的Web应用,采用数据库连接技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很多。本文阐述了使用JDBC访问数据库的技术?讨论了基于连接池技术的数据库连接管理的关键问题并给出了一个实现模型。文章所给出的是连接池管理程序的一种基本模式,为提高系统的整体性能,在此基础上还可以进行很多有意义的扩展。
-
模拟负载均衡:IP地址的自动分配
2009-04-13 14:39:00
一个控制服务器,多个子服务器!性能测试时录制的脚本路径是固定的,如果不修改脚本压力集中在一个子服务器上;不能满足模拟负载均衡的模型;特写如下脚本:
/**********************************************************/
string func Rip()
{
string ip = "";
int y;
y = ((_uid)%9);//y = uniform(1,9);
if(y==0)
{
ip = "192.168.20.10";
}else if(y==1){
ip = "192.168.20.11";
}else if(y==2){
ip = "192.168.20.12";
}else if(y==3){
ip = "192.168.20.13";
}else if(y==4){
ip = "192.168.20.14";
}else if(y==5){
ip = "192.168.20.15";
}else if(y==6){
ip = "192.168.20.16";
}else if(y==7){
ip = "192.168.20.17";
}else{
ip = "192.168.20.18";
}
return ip;
} -
老鼠和猴子的爱情
2009-04-13 14:33:09
--------引自网络文学
老鼠和猴子的爱情
从前有一只老鼠了一只猴子,他告诉猴子说:“我你”,猴子说:“你长的太丑了”。老鼠想尽一切办法让自己变的英俊些。果然老鼠变英俊了。老鼠又去找猴子说:“我你”猴子说:“你不够强壮,保护不了我,我觉得不安全。”老鼠伤心死了。因为他太猴子了。于是他又苦练体,到河南少林寺去拜师学艺,学后,老鼠又去找猴子说:“我你。”猴子说:“我喜欢有才华的。你没有才华。”老鼠说我会你一生一世的。猴子笑答:“我喜欢有才华的。”老鼠说我会有才华的。我还会回来的。于是老鼠又发奋读书。他去了中的清华大学,本的东京大学,美的哈佛大学,学归来。他又去找猴子说:“我你”。猴子哭笑不得,她没想到老鼠会这样的她。其实从一开始猴子就不老鼠。
猴子沉默不久就说话了,“我其实从来就没过你”。然后就转走了。老鼠伤心的哭了。也是他为猴子留下了最后一滴泪。
就在这时神出现了,神慈祥的抚摸着老鼠的说:“善良的孩子去南方吧!那里有你美丽的天空和美丽的梦,去吧!我善良的孩子。”
猴子过后心里很不是滋味!不小心已不知不觉掉下了泪。心里在想我这是怎么了。这时神出现了,神和蔼的说:“我可的孩子你命中注定要为而伤。你永远得不到,即使得到了,也会马失去。除非时光逆转,河倒流。当你真正你一生的那个,那个就会死去。”然后就化做一清烟消失了。
若干年后,一只凶恶的大象看了猴子,可猴子怎么也不答应。大象要强娶。猴子天天以泪洗面。这消息让老鼠知道了,老鼠回来了。就在凶恶的大象强娶的那天老鼠来了。
老鼠与大象大战了三天三,最终终不敌凶恶的大象。大象急败坏的用大鼻子卷住老鼠,他要把这个讨厌的家伙卷死,因为老鼠怎么也不让大象娶猴子。大象愤怒了,老鼠只剩下最后一了,他笑了,流泪了。老鼠看了猴子一眼声嘶力竭的说:“你卷死我吧!正我最的从来没有过我,说完眼角不知不觉留下了生命最后的一滴泪。”随后就闭了眼睛。
这时猴子哭了!她放声嚎啕。她感觉自己的心疼的要死。这时她才发现自己早就了老鼠,只是自己还不知道。
这时大象也哭了,他是被老鼠的痴感动了。缓缓的展开了鼻子。
这时神也感动了。电闪雷鸣,风雨大作。时光逆转,河倒流。
猴子的眼泪与老鼠流下的那滴泪融合了。老鼠复活了,猴子兴奋的跑到老鼠面前说:“我你”。老鼠说:“我要给你从新选择的机会”。
猴子把老鼠抱的死死的说什么也不肯放开,她怕放开老鼠就离去了。老鼠说:“我要带你去我们那个美丽的天空,那里有我们美丽的梦”。猴子说你走到那我就陪你到那,就这样老鼠带着他心的女去了他们那美丽的天空。
-
数据库连接池
2009-04-13 13:09:22
---引自百度搜索
数据库连接池概述:
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
-
B/S架构 C/S架构 SOA架构
2009-04-13 12:10:14
一、什么是C/S和B/S
第一、什么是C/S结构。C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。
传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件, 加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。而且代价高, 效率低。如我院使用的上海超兰公司“案件统计”管理软件就是典型的C/S体系结构管理软件。
第二、什么是B/S结构。B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。目前我院内网(Intranet)、外网(Internet)和北京东方清大公司“案件、办公管理软件”就是B/S 结构管理软件,干警在局域网各工作站通过WWW浏览器就能实现工作业务。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。
第三、面向服务的体系结构(service-oriented architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。二、C/S和B/S 之比较
C/S和B/S是当今世界开发模式技术架构的两大主流技术。C/S是美国 Borland公司最早研发,B/S是美国微软公司研发。目前,这两项技术以被世界各国所掌握,国内公司以C/S和B/S技术开发出产品也很多。这两种技术都有自己一定的市场份额和客户群,各家企业都说自己的管理软件架构技术功能强大、先进、方便,都能举出各自的客户群体,都有一大群文人墨客为自己摇旗呐喊,广告满天飞,可谓仁者见仁,智者见智。
1、C/S架构软件的优势与劣势
(1)、应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。
(2)、数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。
(3)、C/S架构的劣势是高昂的维护成本且投资大。首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。
其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。
2、B/S架构软件的优势与劣势
(1)、维护和升级方式简单。目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。
(2)、成本降低,选择更多。大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。 现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。
比如说很多人每天上“新浪”网,只要安装了浏览器就可以了,并不需要了解“新浪”的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。
(3)、应用服务器运行数据负荷较重。由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。
Web服务作为炙手可热的技术,如何应用到企业的IT系统和商业流程之中、并给企业带来直接的经济效益,一直备受国内外企业管理者的高度关注和推崇。而在近两年,出现了一种技术架构被誉为下一代Web服务的基础架构,它就是SOA(Service-oriented architecture,面向服务架构)。1996年,Gartner最早提出SOA。2002年12月,Gartner提出SOA是"现代应用开发领域最重要的课题",还预计到2008年,SOA将成为占有绝对优势的软件工程实践方法,主流企业现在就应该在理解和应用SOA开发技能方面进行投资。
更好支持商业流程
SOA并不是一个新事物,IT组织已经成功建立并实施SOA应用软件很多年了,BEA、IBM、等厂商看到了它的价值,纷纷跟进。SOA的目标在于让IT变得更有弹性,以更快地响应业务单位的需求,实现实时企业(Real-Time Enterprise,这是Gartner为SOA描述的愿景目标)。而BEA的CIO Rhonda早在2001年6月就提出要将BEA的IT基础架构转变为SOA,并且从对整个企业架构的控制能力、提升开发效率、加快开发速度、降低在客户化和人员技能的投入等方面取得了不错的成绩。
SOA是在计算环境下设计、开发、应用、管理分散的逻辑(服务)单元的一种规范。这个定义决定了SOA的广泛性。SOA要求开发者从服务集成的角度来设计应用软件,即使这么做的利益不会马上显现。SOA要求开发者超越应用软件来思考,并考虑复用现有的服务,或者检查如何让服务被重复利用。SOA鼓励使用可替代的技术和方法(例如消息机制),通过把服务联系在一起而非编写新代码来构架应用。经过适当构架后,这种消息机制的应用允许公司仅通过调整原有服务模式而非被迫进行大规模新的应用代码的开发,使得在商业环境许可的时间内对变化的市场条件做出快速的响应。
SOA也不仅仅是一种开发的方法论--它还包含管理。例如,应用SOA后,管理者可以方便的管理这些搭建在服务平台上的企业应用,而不是管理单一的应用模块。其原理是,通过分析服务之间的相互调用,SOA使得公司管理人员方便的拿到什么时候、什么原因、哪些商业逻辑被执行的数据信息,这样就帮助了企业管理人员或应用架构师迭代地优化他们的企业业务流程、应用系统。
SOA的一个中心思想就是使得企业应用摆脱面向技术的解决方案的束缚,轻松应对企业商业服务变化、发展的需要。企业环境中单个应用程序是无法包容业务用户的(各种)需求的,即使是一个大型的ERP解决方案,仍然不能满足这个需求在不断膨胀、变化的缺口,对市场快速做出反应,商业用户只能通过不断开发新应用、扩展现有应用程序来艰难的支撑其现有的业务需求。通过将注意力放在服务上,应用程序能够集中起来提供更加丰富、目的性更强的商业流程。其结果就是,基于SOA的企业应用系统通常会更加真实地反映出与业务模型的结合。服务是从业务流程的角度来看待技术的--这是从上向下看的。这种角度同一般的从可用技术所驱动的商业视角是相反的。服务的优势很清楚:它们会同业务流程结合在一起,因此能够更加精确地表示业务模型、更好地支持业务流程。相反我们可以看到以应用程序为中心的企业应用模型迫使业务用户将其能力局限为应用程序的能力。
企业流程(enterprise process)是流经企业框架的空气,它赋予业务模型里的组件以生命,并更加清晰地定义了它们之间的关系。流程定义了同业务模型进行交互操作的专门方法。例如,会计可能是企业服务系统的一个组件--但是将发票寄给客户却是一个业务流程。服务被定义用来支持业务流程,因而贯穿整个流程始终的是:各种服务组件在流程和逻辑实现过程中的装配操作。理解业务流程是定制服务的关键所在。
有利于企业业务的集成
传统的应用集成方法(点对点集成、企业消息总线或中间件的集成(EAI)、基于业务流程的集成)都很复杂、昂贵,并且不灵活。这些集成方法难于快速适应基于企业现代业务变化不断产生的需求。基于面向服务架构 (SOA) 的应用开发和集成可以很好的解决其中的许多问题。
SOA 描述了一套完善的开发模式来帮助客户端应用连接到服务上。这些模式定制了系列机制用于描述服务、通知及发现服务、与服务进行通信。
不同于传统的应用集成方法,在 SOA 中,围绕服务的所有模式都是以基于标准的技术实现的。大部分的通信中间件系统,如 RPC、CORBA、DCOM、EJB 和 RMI,也同样如此。可是它们的实现都不是很完美的,在权衡交互性以及标准定制的可接受性方面总是存在问题。SOA 试图排除这些缺陷。因为几乎所有的通信中间件系统都有固定的处理模式,如RPC 的功能、CORBA 的对象等等。然而,服务既可以定义为功能,又可同时对外定义为对象、应用等等。这使得 SOA 可适应于任何现有系统,并使得系统在集成时不必刻意遵循任何特殊定制。
SOA 帮助企业信息系统迁移到"leave-and-layer"架构之上,这意味着在不用对现有的企业系统做修改的前提下,系统可对外提供 Web 服务接口,这是因为它们已经被可以提供 Web 服务接口的应用层做了一层封装,所以在不用修改现有系统架构的情况下,SOA 可以将系统和应用迅速转换为服务。SOA 不仅覆盖来自于打包应用、定制应用和遗留系统中的信息,而且还覆盖来自于如安全、内容管理、搜索等 IT 架构中的功能和数据。因为基于 SOA 的应用能很容易地从这些基础服务架构中添加功能,所以基于SOA的应用能更快地应对市场变化,为使企业业务部门设计开发出新的功能应用。 -
理解cookie工作机制
2009-04-12 21:44:10
cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。
而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie的内容主要包括:名字,值,过期时间,路径和域。
其中域可以指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com,可以用飘柔来做比。
路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。
路径与域合在一起就构成了cookie的作用范围。
如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。
-
什么是Cookie?
2009-04-12 20:57:37
Cookies一词用在程序设计中是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。从本质上讲,它可以看作是你的身份证。但Cookies不能作为代码执行,也不会传送病毒,且为你所专有,并只能由提供它的服务器来读取。保存的信息片断以"名/值"对(name-value pairs)的形式储存,一个"名/值"对仅仅是一条命名的数据。
一个网站只能取得它放在你的电脑中的信息,它无法从其它的Cookies文件中取得信息,也无法得到你的电脑上的其它任何东西。 Cookies中的内容大多数经过了加密处理,因此一般用户看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。
由于Cookies是我们浏览的网站传输到用户计算机硬盘中的文本文件或内存中的数据,因此它在硬盘中存放的位置与使用的操作系统和浏览器密切相关。在Windows 9X系统计算机中,Cookies文件的存放位置为C:/Windows/Cookies,在Windows NT/2000/XP的计算机中,Cookies文件的存放位置为C:/Documents and Settings/用户名/Cookies。
硬盘中的Cookies文件可以被Web浏览器读取,它的命令格式为:用户名@网站地址[数字].txt。如笔者计算机中的一个Cookies文件名为:ch@163[1].txt。要注意的是:硬盘中的Cookies属于文本文件,不是程序。
Cookies的设置
你可以在IE的"工具/Internet选项"的"常规"选项卡中,选择"设置/查看文件",查看所有保存到你电脑里的Cookies。这些文件通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的域名。如果你使用NetsCape浏览器,则存放在"C:/PROGRAMFILES/NETS- CAPE/USERS/"里面,与IE不同的是,NETSCAPE是使用一个Cookie文件记录所有网站的Cookies。
我们可对Cookie进行适当设置:打开"工具/Internet选项"中的"隐私"选项卡(注意该设置只在IE6.0中存在,其他版本IE可以单击"工具/Internet选项" "安全"标签中的"自定义级别"按钮,进行简单调整),调整Cookie的安全级别。通常情况,可以调整到"中高"或者"高"的位置。多数的论坛站点需要使用Cookie信息,如果你从来不去这些地方,可以将安全级调到"阻止所有Cookies";如果只是为了禁止个别网站的Cookie,可以单击"编辑"按钮,将要屏蔽的网站添加到列表中。在"高级"按钮选项中,你可以对第一方Cookie和第三方的Cookie进行设置,第一方Cookie是你正在浏览的网站的Cookie,第三方Cookie是非正在浏览的网站发给你的Cookie,通常要对第三方Cookie选择"拒绝"。你如果需要保存Cookie,可以使用IE的"导入导出"功能,打开"文件/导入导出",按提示操作即可。
Cookies的写入与读取
Cookies集合是附属于Response对象及Request对象的数据集合,使用时需要在前面加上Response或Request。
用于给客户机发送Cookies的语法通常为:
当给不存在的Cookies集合设置时,就会在客户机创建,如果该Cookies己存在,则会被代替。由于Cookies是作为HTTP传输的头信息的一部分发给客户机的,所以向客户机发送Cookies的代码一般放在发送给浏览器的HTML文件的标记之前。
如果用户要读取Cookies,则必须使用Request对象的Cookies集合,其使用方法是: 需要注意的是,只有在服务器未被下载任何数据给浏览器前,浏览器才能与Server进行Cookies集合的数据交换,一旦浏览器开始接收Server所下载的数据,Cookies的数据交换则停止,为了避免错误,要在程序和前面加上response.Buffer=True。
Cookies的应用
几乎所有的网站设计者在进行网站设计时都使用了Cookie,因为他们都想给浏览网站的用户提供一个更友好的、人文化的浏览环境,同时也能更加准确地收集访问者的信息。
网站浏览人数管理
由于代理服务器、缓存等的使用,唯一能帮助网站精确统计来访人数的方法就是为每个访问者建立一个唯一的ID。使用Cookie,网站可以完成以下工作:测定多少人访问过;测定访问者中有多少是新用户(即第一次来访),多少是老用户;测定一个用户多久访问一次网站。
通常情况下,网站设计者是借助后台数据库来实现以上目的的。当用户第一次访问该网站时,网站在数据库中建立一个新的ID,并把ID通过Cookie传送给用户。用户再次来访时,网站把该用户ID对应的计数器加1,得到用户的来访次数或判断用户是新用户还是老用户。
按照用户的喜好定制网页外观
有的网站设计者,为用户提供了改变网页内容、布局和颜色的权力,允许用户输入自己的信息,然后通过这些信息对网站的一些参数进行修改,以定制网页的外观。
在电子商务站点中实现诸如"购物篮"等功能
可以使用Cookie记录用户的ID,这样当你往"购物篮"中放了新东西时,网站就能记录下来,并在网站的数据库里对应着你的ID记录当你"买单"时,网站通过ID检索数据库中你的所有选择就能知道你的"购物篮"里有些什么。
在一般的事例中,网站的数据库能够保存的有你所选择的内容、你浏览过的网页、你在表单里填写的信息等;而包含有你的唯一ID的Cookie则保存在你的电脑里。
Cookies的缺陷
Cookie虽然被广泛的应用,并能做到一些使用其它技术不可能实现的功能。但也存在一些不够完美的方面,给应用带来不便。
多人共用一台电脑的问题
任何公共场合的电脑或者许多在办公室或家里使用的电脑,都会同时被两个以上的人使用。这样,当你用它在网上超市购物时,网上超市或网站会在这台机器上留下一个Cookie,将来也许就会有某个人试图使用你的账户购物,带来了不安全的可能。当然,在一些使用多用户操作系统如Windows NT或UNIX的电脑上,这并不会成为一个问题。因为在多用户操作系统下不同的账户的Cookie分别放在不同的地方。
Cookies被删除时
假如你的浏览器不能正常工作,你可能会删除电脑上所有的临时Internet文件。然而,一旦这样操作以后,你就会丢掉所有的Cookies文件。当你再次访问一个网站时,网站会认为你是一位新用户并分配给你一个新的用户ID以及一个新的Cookie。结果将会造成网站统计的新老用户比发生偏差,而你也难以恢复过去保存的参数选择。
一人使用多台电脑时
有的人一天之中经常使用一台以上的电脑。例如在办公室里有一台电脑、家里有一台、还有移动办公用的笔记本电脑。除非网站使用了特别的技术来解决这一问题,否则,你将会有三个不同的Cookies文件在这三台机器上,而在三台机器上访问过的任何网站都将会把你看成三个不同的用户。
防范Cookies泄密
想知道你访问的网站是否在你的硬盘或内存中写入了Cookies信息吗?只需执行下面的操作步骤,就可以了解和控制你正在访问的网站的Cookies信息。
步骤一点击IE窗口中的"工具" "Internet选项",打开"Internet选项"设置窗口;
步骤二点击"Internet选项"设置窗口中的"安全"标签,然后再点击"自定义级别"按钮,进入"安全设置"窗口;
步骤三 找到"安全设置"窗口中的"Cookies"设置项。"Cookies"设置项下有两个分选项,其中"允许使用存储在您计算机上的Cookies"是针对存储在用户计算机硬盘中的Cookies文件;"允许使用每个对话Cookies(未存储)"是针对存储在用户计算机内存中的Cookies信息。存储在硬盘中的Cookies文件是永久存在的,而存储在内存中的Cookies信息是临时的。要想IE在即将接收来自Web站点的所有Cookies时进行提示,可分别选择上面两个分选项中的"提示"项。当然,你也可以选择"启用",允许IE接受所有的Cookies信息(这也是IE的默认选项);选择"禁止",则是不允许Web站点将Cookies存储到您的计算机上,而且Web站点也不能读取你计算机中已有的Cookies。
IE6.0提供了更为可靠的个人隐私及安全保护措施,可以让用户来控制浏览器向外发送信息的多少。在"Internet 选项"窗口中新增了"隐私"选项卡(图1),用户可以在其中直接设置浏览时的隐私级别,按需要控制其他站点对自己电脑所使用的Cookies。
如果我们正在浏览的站点使用了Cookie,那么在浏览器状态栏中会有一个黄色惊叹号的标记,双击后可打开"隐私报告"对话框,用户可以在其中查看具体的隐私策略,还可直接点击"设置"按钮后在上述"隐私"选项卡中调节安全隐私级别。
在"常规"选项卡中还增加了"删除Cookies"按钮(图2),方便用户直接清除本机上的Cookies。另外,在"工具" "选项" "高级"选项卡中也增加了一些进一步提高安全性的选项(如关闭浏览器时清空Internet临时文件)。其实,如何更好地保护个人隐私和安全是微软下一代".NET"战略软件中的关键技术,现在IE6.0已经尝试着迈出了第一步。
另外,由于Cookies的信息并不都是以文件形式存放在计算机里,还有部分信息保存在内存里。比如你在浏览网站的时候,Web服务器会自动在内存中生成Cookie,当你关闭IE浏览器的时候又自动把Cookie删除,那样上面介绍的两种方法就起不了作用,我们需要借助注册表编辑器来修改系统设置。要注意的是,修改注册表前请作备份,以便出现问题后能顺利恢复。
运行Regedit,找到如下键值:HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Internet Settings/Cache/Special Paths/Cookies,这是Cookies在内存中的键值,把这个键值删除。至此Cookies无论以什么形式存在,我们都不用再害怕了。
最后有必要说明的一点是:杜绝Cookies虽然可以增强你电脑的信息安全程度,但这样做同样会有一些弊端。比如在一些需要Cookies支持的网页上,会发生一些莫名其妙的错误,典型的例子就是你以后不能使用某些网站的免费信箱了。
Cookies欺骗
通过分析Cookie的格式,我们知道,最后两项中分别是它的URL路径和域名,服务器对Cookie的识别靠的就是这两个参数。正常情况下,我们要浏览一个网站时输入的URL便是它的域名,需要经过域名管理系统DNS将其转化为IP地址后进行连接。若能在DNS上进行一些设置,把目标域名的IP地址对应到其它站点上,我们便可以非法访问目标站点的Cookie了。
要进行Cookies欺骗,其实很简单。比如在Win9X下的安装目录下,有一名为hosts.sam的文件,以文本方式打开后会看到这样的格式:
127.0.0.1 localhost
经过设置,便可以实现域名解析的本地化,只需将IP和域名依上面的格式添加到文件中并另存为hosts即可。hosts文件实际上可以看成一个本机的DNS系统,它可以负责把域名解释成IP地址,它的优先权比DNS服务器要高,它的具体实现是TCP/IP协议中的一部分。
比如我们要读取的目标站点 www.abc.com 所生成的Cookies信息,可以借助www.def.com(自己的站点)。www.def.com 存放用来进行欺骗所需的文件,通过它读取和修改对方的Cookie。
步骤一 pingwww.def.com 的IP地址:
ping www.def.com
Reply from 192.168.0.1: bytes=32 time=20ms TTL=244
然后修改hosts.sam文件如下:
192.168.0.1 www.abc.com
并保存为hosts文件。
步骤二 读取Cookies信息:
将用来读取Cookie的页面传www.def.com ,此时连www.abc.com,由于我们进行本机DNS域名解析的修改,这时网络连接的并不www.abc.com,而www.def.com 。
这www.abc.com设在本地的Cookie便可被读出。
步骤三 同样道理,你可对读出的数据进行修改,并可将修改后的信息写入Cookie中。修改完毕后,删掉hosts文件,再重新进www.abc.com,此时所使用的Cookies数据就是你制定的数据。
总之,在某种程度上虽然可以实现Cookies的欺骗,给网络应用带来不安全的因素,但Cookies文件本身并不会造成用户隐私的泄露,也不会给黑客提供木马程序的载体,只要合理使用,它们会给网站管理员进行网站的维护和管理以及广大用户的使用都带来便利。
Cookies集合具有以下几种属性:
1.Expires属性:此属性用来给Cookies设置一个期限,在期限内只要打开网页就可以调用被保存的Cookies,如果过了此期限Cookies就自动被删除。如:
设定Cookies的有效期到2004年4月1日,到时将自动删除。如果一个Cookies没有设定有效期,则其生命周期从打开浏览器开始,到关闭浏览器结束,每次运行后生命周期将结束,下次运行将重新开始。
2.Domain属性:这个属性定义了Cookies传送数据的唯一性。若只将某Cookies传送给_blank">搜狐主页时,则可使用如下代码:
3.Path属性:定义了Cookies只发给指定的路径请求,如果Path属性没有被设置,则使用应用软件的缺省路径。
4.Srcure属性:指定Cookies能否被用户读取。
5.Haskeys属性:如果所请求的Cookies是一个具有多个键值的Cookies字典,则返回True,它是一个只读属性 -
马云语录
2009-04-08 16:53:10
- 马云语:做企业不是做侠客。
- 马云语:建立自我、追求忘我。
- 马云语:天不怕,地不怕,就怕CFO当CEO。
- 马云语:人比你永远要相信边上的聪明。
- 马云语:五年以后还想创业,你再创业。
- 马云语:今天很残酷,明天更残酷,后天会很美好,但绝大多数人都死在明天晚上。
- 马云语:上当不是别人太狡猾,而是自己太贪,是因为自己才会上当。
- 马云语:其实很多人的问题是因为他们回答的全是对的。
- 马云语:一个一流的创意,三流的执行,我宁可喜欢一个一流的执行,三流的创意。
- 马云语:蒙牛不是策划出来的,而是踏踏实实的产品、服务和体系做出来的。
- 马云语:最优秀的模式往往是最简单的东西。
- 马云语:要少开店、开好店,店不在于多,而在于精。
- 马云语:创业者书读得不多没关系,就怕不在社会上读书。
- 马云语:在今天的商场上已经没有秘密了,秘密不是你的核心竞争力。
- 马云语:很多人失败的原因不是钱太少,而是钱太多。
- 马云语:钱了概念到今天这个时代已经不能卖。
- 马云语:创业者光有激情和创新是不够的,它需要很好的体系、制度、团队以及良好的盈利模式。
- 马云语:这个世界不是因为你能做什么,而是你该做什么。
- 马云语:你的项目感觉是一个生意,不是一个独特的企业。
- 马云语:建一个公司的时候要考虑有好的价值才卖。如果一开始想到卖,你的路可能就走偏掉。
- 马云语:人要有专注的东西,人一辈子走下去挑战会更多,你天天换,我就怕了你。
- 马云语:要找风险投资的时候,必须跟风险投资共担风险,你拿到的可能性会更大。
- 马云语:记住,关系特别不可靠,做生意不能凭关系,做生意也不能凭小聪明。
- 马云语:不要贪多,做精做透很重要,碰到一个强大的对手或者榜样的时候,你应该做的不是去挑战它,而是去弥补它。
- 马云语:这世界上没有优秀的理念,只有脚踏实地的结果。
- 马云语:一个好的东西往往是说不清楚的,说得清楚的往往不是好东西。
- 马云语:如果你看了很多书,千万别告诉别人,告诉别人别人就会不断考你。
- 马云语:做战略最忌讳的是面面俱到,一定要记住重点突破,所有的资源在一点突破,才有可能赢。
- 马云语:小企业有大的胸怀,大企业要讲细节的东西。
- 马云语:有时候死扛下去总是会有机会的。
- 马云语:所有的创业者应该多花点时间,去学习别人是怎么失败的。
- 马云语:关注对手是战略中很重要的一部分,但这并不意味着你会赢。
- 马云语:战略不能落实到结果和目标上面,都是空话。
- 马云语:绝大部分创业者从微观推向宏观,通过发现一部分人的需求,然后向一群人推起来。
- 马云语:不管你拥有多少资源,永远把对手想得强大一点。
- 马云语:80年代的人不要跟70年代,跟60年代的人竞争,而是要跟未来,跟90年代的人竞争,这样你才有赢的可能性。
- 马云语:商业计划绝对不是一个销售计划,里面有无数细节,无数人才的运营。
- 马云语:战略有很多意义,小公司的战略简单一点,就是活着,活着最重要。
- 马云语:必须先去了解市场和客户的需求,然后再去找相关的技术解决方案,这样成功的可能性才会更大。
- 马云语:最核心的问题是根据市场去制定你的产品,关键是要倾听客户的声音。
- 马云语:免费是世界上最昂贵的东西。所以尽量不要免费。等你有了钱以后再考虑免费。
- 马云语:“营销”这两个字强调既要追求结果,也要注重过程,既要“销”,更要“营”。
- 马云语:诚信绝对不是一种销售,更不是一种高深空洞的理念,它是实实在在的言出必行、点点滴滴的细节。
- 马云语:公关是个副产品,由于你解决了以后会逐渐传出去,这才是最好的公关。
- 马云语:短暂的激情是不值钱的,只有持久的激情才是赚钱的。
- 马云语:聪明是智慧者的天敌,傻瓜用嘴讲话,聪明的人用脑袋讲话,智慧的人用心讲话。
- 马云语:永远要把对手想得非常强大,哪怕非常弱小,你也要把他想得非常强大。
- 马云语:我自己不愿意聘用一个经常在竞争者之间跳跃的人。
- 马云语:多花点时间在你的其他员工身上。
- 马云语:什么是团队呢?团队就是不要让另外一个人失败,不要让团队任何一个人失败。
- 马云语:把你太太当合作伙伴,不要把她当太太看。
- 马云语:有时候学历很高不一定把自己沉得下来做事情。
- 马云语:创业时期千万不要找明星团队,千万不要找已经成功过的人。创业要找最适合的人,不要找最好的人。
- 马云语:最大的挑战和突破在于用人,而用人最大的突破在于信任人。
- 马云语:什么都想自己干,这个世界上你干不完。
- 马云语:每一笔生意必须挣钱,免费不是一个好策略,它付出的代价会非常大。
- 马云语:领导力在顺境的时候,每个人都能出来,只有在逆境的时候才是真正的领导力。
- 马云语:碰到灾难第一个想到的是你的客户,第二想到你的员工,其他才是想对手。
- 马云语:永远记住每次成功都可能导致你的失败,每次失败好好接受教训,也许就会走向成功。
- 马云语:暴躁在某种程度上讲是因为有不安全感,或者是自己没有开放的心态。
- 马云语:可能一个人说你不服气,两个人说你不服气,很多人在说的时候,你要反省,一定是自己出了一些问题。
- 马云语:一个成功的创业者,三个因素,眼光、胸怀和实力。
- 马云语:别人可以拷贝我的模式,不能拷贝我的苦难,不能拷贝我不断往前的激情。
- 马云语:80年代的人还需要摔打,不管做任何事,要检查主观原因。
- 马云语:做小了,一定要做到独特。
- 马云语:聪明是智慧者的天敌,傻瓜用嘴讲话,聪明的人用脑袋讲话,智慧的人用心讲话。所以永远记住,不要把自己当成最聪明的,最聪明的人相信总有别人比自己更聪明。
- 马云语:人永远不要忘记自己第一天的梦想,你的梦想是世界上最伟大的事情,就是帮助别人成功。
- 马云语:不想当将军的士兵不是好士兵,但是一个当不好士兵的将军一定不是好将。
- 马云语:小公司的战略就是两个词:活下来,挣钱。
- 马云语:生存下来的第一个想法是做好,而不是做大。
- 马云语:世界上最不可靠的就是关系。
- 马云语:《赢在中国》没有失败者,只有幸运者。
- 马云语:有结果未必是成功,但是没有结果一定是失败。
- 马云语:永远把别人对你的批评记在心里,别人的表扬,就把它忘了。
- 马云语:权威是你把权给别人的时候,你才能有真正的权利,你懂得倾听、懂得尊重,承担责任的时候,别人一定会听你,你才会有权威。
- 马云语:性格和情商,主要还是由后天学习和塑造的。
- 马云语:成立公司,组织的目的是让平凡的人做出不平凡的贡献。
- 马云语:服务是全世界最贵的产品。
- 马云语:发不出工资是领导者的耻辱。
- 马云语:创业路上需要激情,执著和谦虚,激情和执著是油门,谦虚是刹车,一个都不能缺少。
- 马云语:作为一个领导人,应该控制自己的情绪,很多时候发脾气是无能的表现,合理的情绪控制对于团队的和谐,稳定军心有大作用。
- 马云语:大势好未必你好,大势不好未必你不好。
- 马云语:诚信不是一种销售,不是一种高深空洞的理念,是实实在在的言出必行,点点滴滴的细节,诚信不能拿来销售,不能拿来做概念。
- 马云语:做企业不是做侠客。
-
Robot:一次登录后用脚本实现主要业务按时间循环执行
2009-04-08 10:35:30
在模拟用户的性能测试中,有时候我们需要一次登录系统,然后对某个主要业务(如查询)重复执行一段时间然后退出;如果使用testmanager实现则需要分割脚本,再需要循环的脚本上设置迭代和延迟。下面我用自己编写的一个脚本实现,效率较高:#include <VU.h>
#include <cvicse.h>
#include <nspg.h>
{
string logger;
int t1,t2,t;
/*
*t1 开始时间
*t2 结束时间
*t 运行时间
*i 循环执行的次数
*1秒 = 1000毫秒
*///循环体外,记录开始的时间
t1 = start_time ["T1"];
do
{
//初始化循环次数
int i=0;//delay函数相当于循环体(需要循环的部分)
delay(8000);
//循环结束时统计结束时间
t2 = stop_time ["T1"];
//t计算整个循环时间
t = t2 - t1;
//叠加循环次数
i++;
//记录循环次数
writelog(itoa(i));
}while(t<800000);
//记录循环时间
logger = itoa(t);writelog(logger);}