选择奋斗,选择挑战

发布新日志

  • DBLINK测试

    2012-08-07 14:25:33

    DBLINK测试:

    测试条件:
    1、本地IP:172.168.2.249,SID:orcl,用户名:system,密码:orcl;
    2、远程IP:172.168.2.130,SID:beeload,用户名:beeload,密码:beeload;
    将本地orcl数据库访问远程beeload数据库。

    测试环境:
    两台机器都是windows xp,oracle都是10g;
    建立环境时,要关闭两台计算机的防火墙,否则,会出现能PING通,但是oracle连接不通的情况;
    1、返回数据库的global_name select * from global_name;
    本地:ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM
    远程:BEELOAD.REGRESS.RDBMS.DEV.US.ORACLE.COM
    2、查看global_name参数是TRUE还是FALSE
    执行SQL>show parameter global_name;
    该参数为TRUE时,你在本地建立的DBLINK的名称必须和远程的global_name一致;
    3、查看远程数据库是否支持高级复制功能通过查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持。
    执行语句为:select * from v$option; 也可以执行select * from v$option where PARAMETER='Advanced replication'语句,如何返回值为True,那么就是支持,否则就是不支持。在两个数据库中都是检查是否支持才行。

    建立步骤:
    1、在本地建立一个Oracle的客户端连接beeload,用于连接远程数据库。
    在远程的数据库中,建立一个表用于测试。
    create table RM_TEST ( STU_ID NUMBER, STU_NAME VARCHAR2(100) ) 在其中增加一条记录: insert into RM_TEST (STU_ID, STU_NAME) values (1, '李可宇');
    2、新建一个连接system(具有权限的用户),用于连接本地的数据库。下面开始创建连接到远程数据连接DBLink。
    create database link BEELOAD.REGRESS.RDBMS.DEV.US.ORACLE.COM connect to BEELOAD identified by beeload using 'beeload';
    其中:BEELOAD.REGRESS.RDBMS.DEV.US.ORACLE.COM是远程的数据库的global_name,beeload是连接BEELOAD的用户名,beeload是beeload的密码, beeload是本地建立的连接到北京的数据库的服务名。
    3、测试连接是否成功: select * from dual@BEELOAD.REGRESS.RDBMS.DEV.US.ORACLE.COM 如果返回结果如下则表示连接成功了。
    DUMMY
    X
    4、在本地数据库中查询已经建立的远程连接名:
    SQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';
    OWNER OBJECT_NAME
    SYSTEM BEELOAD.REGRESS.RDBMS.DEV.US.ORACLE.COM
    5、至此,在本地的计算机上建立了一个DBLINK,用于连接到远程的数据库上,在本地的数据库中查询北京的数据库中表的信息: select * from RM_TEST@BEELOAD.REGRESS.RDBMS.DEV.US.ORACLE.COM查询结果:
    STU_ID STU_NAME
    1 李可宇
    表示查询是正常的。
    6、关于global_name参数的测试
    create database link a connect to BEELOAD identified by beeload using 'beeload'; 建立了一个DBLINK,
    执行下面的查询: select owner,object_name from dba_objects where object_type='DATABASE LINK';
    可以看到已经建立了名为:a的DBLINK。
    但执行下面的查询,检索远程数据时,就会出现错误。
    select * from bj_test@a 原因是因为本地数据库的global_names的参数值为true,所以,dblink的名称必须和远程数据库的global_names相同。
    要修改本地数据库的global_names参数为false;(注意是修改本地数据库,通过测试修改过程的参数不行,过程的global_names参数为TRUE还是为FALSE没有关系) 使用下面的语句修改该参数:
    SQL> alter system set global_names=false;
    再执行下面的几步即可查询出数据: create database link a connect to BEELOAD identified by beeload using 'beeload';
    --创建DBLINK select owner,object_name from dba_objects where object_type='DATABASE LINK';
    --查询现有的DBLINK select * from bj_test@a--查询远程表
    7、下面在本地建立存储过程,通过DBLINK检索远程数据库, 存储过程如下: CREATE OR REPLACE PROCEDURE test_cur as strSql1 varchar2(1000); t_stu_name varchar2(100); TYPE TCUR IS REF CURSOR; CUR TCUR; begin strSql1:='select stu_name from bj_test@a'; OPEN CUR FOR strSql1; LOOP FETCH CUR INTO t_stu_name; EXIT WHEN CUR%NOTFOUND; DBMS_OUTPUT.PUT_LINE(t_stu_name); END LOOP; CLOSE CUR; end test_cur;
    测试存储过程显示,输出了过程数据库中的STU_NAME的值。

  • DBLINK详解

    2012-08-07 13:45:32

    DBLINK详解
    1.创建dblink语法:
    CREATE [PUBLIC] DATABASE LINK link 
    CONNECT TO username IDENTIFIED BY password USING ‘connectstring’
    说明:
    1) 权限:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私 有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。
    2)link :  当GLOBAL_NAME=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。
    3)connectstring:连接字符串,tnsnames.ora中定义远程数据库的连接串。
    4)username、password:远程数据库的用户名,口令。如果不指定,则使用当前的用户名和口令登录到远程数据库。
    2.删除数据库链接的语句: DROP [PUBLIC] DATABASE LINK zrhs_link
    3.查看已创建的dblink select owner,object_name from dba_objects where object_type='DATABASE LINK';
    4.dblink的引用: [user.]table|view@dblink 如: SELECT * FROM worker@zrhs_link; SELECT * FROM camel.worker@zrhs_link ;
    5.创建同义词:对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用: CREATE SYNONYM worker_syn FOR worker@zrhs_link;
    6.创建远程视图: CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where…; 现在本视图可与本地数据库中的任何其它视图一样对待,也可以授权给其它用户访问此视图,但该用户必须有访问数据库链接的权限。
    其他:修改GLOBAL_NAME的方法:
    1.在远程数据库的init.ora文件中将global_names设为false。或者
    2.用sys用户执行如下语句:ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE; 修改后重新启动数据库设置才能生效。 数据库全局名称可以用以下命令查出:SELECT * FROM GLOBAL_NAME;

    ===== dblink 实战 ======
    1.dblink分为公有和私有两类。公有dblink使用public修饰关键字。在create和drop的时候都需要使用public关键字。公有dblink对所有人开放,在该dblink之上创建的同义词也会随之对所有人开放。(测试并确认,不过测试是在一个实例多个用户之间进行) 私有dblink只有创建者可以访问,其上的同义词不能被其他用户访问。需为用户创建视图,并将视图授权给所需用户后,用户才可访问该视图。 另外,不能将带有dblink的同义词直接授权给用户。否则报错,其等价于: grant select on table1@user1 to user2                           * ERROR at line 1: ORA-02021: DDL operations are not allowed on a remote database 2.创建dblink时,可以使用连接字符串(与tnsname.ora中的),效率较高。
  • java.io.IOException: Stream closed

    2012-07-31 17:00:48

    java.io.IOException: Stream closed

    严重: Servlet.service() for servlet jsp threw exception。出现此错误一般都是在jsp中使用了输出流,没有妥善处理好的原因。
    原因:
    在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
    有一段这样的代码
    finally {
    if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
    这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
    response.getOutputStream()相冲突的!所以会出现以上这个异常。

    解决的办法
    在使用完输出流以后调用以下两行代码即可:
    out.clear();
    out = pageContext.pushBody();

    java.io.IOException: Stream closed出现这个异常的原因:举个例子

    BufferedReader Input1 = new BufferedReader(new InputStreamReader(System.in));
    BufferedReader Input2 = new BufferedReader(new InputStreamReader(System.in));

    这两句话中的Input1和Input2都是由System.in封装而来。这是设计模式中的装饰模式的应用,顾名思义,装饰模式就是对最原始的东西进行装饰,只改变了外表,但实质并没有改变。System.in就是最原始的东西,Input1和Input2只是他被装饰后的外表,所以程序中的Input1和Input2的实质上都是System.in。调用Input1.close(),会自动调用Input1的实质System.in.close(),所以对于Input2来说他的实质System.in已经关闭掉,所以多个线程索引同一个input  stream,当某一个thread在执行完之后,把这个inputstream关闭了;而此时正在从这个input  stream流中读取信息的线程就会抛出  java.io.IOException:  Stream  closed  异常。

    终于找到这个异常的根源所在,原来是两个页面同时调用一个jsp,这个jsp中的内建对象
    out在执行out.close()时发生的异常,也就是当某一个thread(对应一个jsp)在执行完之
    后,把这个stream关闭了;而此时正在从这个stream中读取信息的另一个jsp就会抛出  java.io.IOException:  Stream  closed  异常。 

  • LR vuser_init 参数化

    2012-07-26 15:08:39

       当脚本录制在vuser_init中时,如果对脚本内的信息进行参数化,action是不会进行多次迭代的。如果需要参数化,脚本则需要录制在action中
  • 使用oracle DBA用户连接DataFactory

    2012-07-25 14:45:37

    配置DataFactory连接,选择oracle数据库,输入的username为DBA用户,不能配置成功,错误提示:connection as SYS should be as SYSDBA or SYSOPER。
Open Toolbar