不应该是家,窝更适合一点

发布新日志

  • Meter——HTTP COOKIE Manager(cookie管理器) 【zt】

    2016-06-01 17:11:48

    现在对于JMeter来说,一个测试计划只能有一个cookie管理器。因为当多个magager存在时,JMeter目前还没有方法来指定使用那个manager。同时,一个cookie manager中的存储的cookie也不能被其他cookie manager所引用,所以同一个计划中不建议使用多个cookie manager

    HTTP COOKIE Manager管理cookie有两种方法:
    1. 他可以像浏览器一样存储和发送cookie,如果你要发送一个带cookie的http请求,cookie manager会自动存储该请求的cookies,并且后面如果发送同源站点的http请求时,都可以用这个cookies。每个JMeter线程都有自己的“cookie存储区域”,
      所以当你测试一个使用cookie来管理session信息的web站点时,每个JMeter线程都有自己的session。
      注意:
    以这种自动收集的方式收集到的cookie不会在cookie manager中进行展示,但是运行后,通过:查看结果树(监 听器)可以查看到cookie信息。
     早期的JMeter版本(2.3.2或更早)对与cookie的管理是支持跨域的,也就是说不同域名的网站都可以使用cookie manager中  的cookie,2.3.2版本之后,这个就不可以了,必须同源,才能共用cookie,如果你想让JMeter的cookie manager支持跨域,  修改JMeter.property :
    CookieManager.check.cookies=false

      接受到的cookie会被自动存储在线程变量中,但是从Jmeter2.3.2版本后,默认不再存储,如果你想要manager自动存储收集到 的cookie,你需要修改JMeter.property :
    CookieManager.save.cookies=true
        存储的时候,cookie的key会以“COOKIE_”为前缀命名(默认情况),如果你想自定义这个前缀,
    修改JMeter.property :
    CookieManager.name.prefix= 
        这个配置如果未启用(也就是维持默认),我们可以通过一下方式获取到cookie的值:${COOKIE_name},其       中name为cookie的名称

       2. 除了上面说的自动收集,我们还可以手动添加cookie,这里,笔者要给大家一个建议,尽量不要一个一个手动去填写,我们可  以结合firefox的插件firebug,直接将cookie导入,操作如下
    • 打开firebug,如图
    JMeter——HTTP COOKIE Manager(cookie管理器) - 一切随缘 - 随缘
       点击红色框中的,下拉框中有个导出本站点的cookie,就可以将cookie信息保存为一个cookies.txt文件,接着打开jmeter 的cookie manager:
    JMeter——HTTP COOKIE Manager(cookie管理器) - 一切随缘 - 随缘
      载入刚才导出的cookies.txt文件即可。
    各个参数说明:
    名称 描述 是否必填
      Name 自定义该cookie的描述,例如:tuan.qq.com的cookie N
      Clear Cookies each Iteration 每次线程组运行前,都会清楚cookie,但是如果是手动添加的cookie,不会被清除 N
      Cookie Policy 选择cookie的管理策略,建议选择compatibility,兼容性强 
      User-Defined Cookies 用户自定义cookie 
      Add Button 。。。略过 
  • 用来插入大量数据的存储过程

    2013-10-14 11:11:48

    用来插入大量数据的存储过程

    Create or replace procedure insertamounttest

    (

    st_num in number,

    ed_num in number

    )

    is

    begin

    declare

    i number;

    begin

    for i in st_num ..ed_num 

    loop

    instert into table values(i,i,'3','3','3',100,'0');

    end loop

    end;

    end;

  • java数据库链接程序

    2013-09-26 10:27:27

    import java.sql.*; 
    import java.io.*;
    import java.util.*;

    public class DatabaseLink {
     String sDB;//从属性文件获取的数据库驱动名
     String sUser,sPassword;//从属性文件获取的用户名和密码
     String sDataBaseDriver;  //jdbc-odbc桥:sun.jdbc.odbc.JdbcOdbcDriver
     String sJdbcOdbcConnHead="jdbc:odbc:";//jdbc-odbc驱动的头
     Connection conn=null; 
     Statement stmt=null;

     /*
      建立数据库的连接
     */
       
      public DatabaseLink()throws IOException{//连接数据库
         try{
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         }catch(ClassNotFoundException ex){
          System.out.println(ex.getMessage());
         }     
          try {
                conn = DriverManager.getConnection("jdbc:odbc:comm","Administrator", "");
                stmt = conn.createStatement();//创建一个 Statement 对象来将 SQL 语句发送到数据库。
             } catch (SQLException ex1) {
                System.out.println(ex1.getMessage());
             } 
        }//end of the method DatabaseLink
     
     /*//////////////数据库的关闭/////////////////////////////////*/
     public void databaseclose(){
      try{   
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if...
       
       if(conn!=null){
        conn.close();
        conn=null;       
       }//end of if...
      }catch(SQLException e){
      }//end of try...catch...
     }//end of the method databaseclose
     

     ///////////////////////数据库的查询///////////////////////////
     public ResultSet query(String sql) {
      ResultSet rs=null;
      
      try{
       if(conn==null){
        DatabaseLink();
       }//end of if...    
       rs=stmt.executeQuery(sql);   
      }catch (SQLException e){   
      }finally{
      //databaseclose();
       return rs;//返回sql语句的执行结果
      }//end of try...catch...finally...
     }//end of the method query(String)
     
     
     
     //////////要查找的列名,表名,和条件组成查询语句/////////////////
     public ResultSet query(String sColumn,String sTableName,String sCondition) {
      ResultSet rs=null;
      try{
       if(conn==null){
        DatabaseLink(); 
      }//end of if....  
       rs=stmt.executeQuery(" select "+sColumn+" from "+sTableName+" where "+sCondition);   
      }catch (SQLException e){   
      }finally{
      //databaseclose();
       return rs;//返回sql语句的执行结果
      }//end of try...catch...finally...
     }//end of the method query(String,String,String)
     
     
     
     ////////////////根据表名 查找表名中的全部内容/////////////////////////////
     public ResultSet queryAll(String sTableName){
      ResultSet rs=null;
      try{
       if(conn==null){
         DatabaseLink();
       }//end of if...
       
       rs=stmt.executeQuery(" select * from "+sTableName);   
      }catch(SQLException e){    
      }finally{
       return rs;//返回sql语句的执行结果
      }//end of try...catch...finally...
     
     }//end of the method queryAll(String)
     
     
     /*
      根据表名和条件名 来查找表中的全部信息
     */
     public ResultSet queryAll(String sTableName,String sCondition){
      ResultSet rs;
      
      try{
       if(conn==null){
         DatabaseLink();
       }//end of if...   
       rs=stmt.executeQuery(" select * from "+sTableName+" where "+sCondition);
       return rs;
      }catch(SQLException e){
       //System.err.println("192zxf查询:"+e.getMessage());
       return null;
      }//end of try...catch....
     }//end of the method queryAll(String,String)
     
     
     
     
     /*
      ///////////////数据库的插入///////////////////////////
     */

     public boolean insert(String sql){
      try{
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if...
       if(conn==null){
        DatabaseLink();
       }//end of if...
       
       stmt=conn.createStatement();
       int result=stmt.executeUpdate(sql);
       if(result==0){
        conn.rollback();
        return false;
       }//end of if...
       conn.commit();   
      }catch(SQLException e){   
       return false;
      }//end of try...catch....  
      return true;
     }//end of the method insert(String)
     
     
     /*////////////////////
       根据表名,列名和列名值组成插入语句。插入一条记录
     */
     public boolean insert(String sTable,String strRowName[],String[] strRowValue){
      int iLength=strRowName.length;//要插入列的个数
      
      String sql=" insert into "+sTable+" ( ";
      for(int i=0;i<iLength-1;i++){
       sql=sql+" "+strRowName[i]+",";
      }//end of for...
      
      sql=sql+strRowName[iLength-1]+") values (";
      for(int i=0;i<iLength-1;i++){
       sql=sql+" '"+strRowValue[i]+"',";
      }//end of for...
      
      sql=sql+"'"+strRowValue[iLength-1]+"')";
      try{
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if...
       if(conn==null){
        DatabaseLink();
       }//end of if...
       stmt=conn.createStatement();
       
       int result=stmt.executeUpdate(sql);
       if(result==0){
        conn.rollback();
        return false;
       }//end of if...
       conn.commit();   
      }catch(SQLException e){   
       return false;
      }//end of try...catch....  
      return true;
     }//end of the method insert(String)
     
     /*
      根据表名,列名和列名值组成插入语句。插入一批记 录
     */
     public boolean insertMany(String sTable,String strRowName[],String[][] strRowValue){
      int iNameLength=strRowName.length;//总共的表字段的个数
      int iValueLength=strRowValue.length;//所插入的行数
      
      String sql=" insert into "+sTable+" ( ";
      for(int i=0;i<iNameLength-1;i++){
       sql=sql+" "+strRowName[i]+",";
      }//end of for...
      
      sql=sql+strRowName[iNameLength-1]+") values (";
      
      for(int j=0;j<iValueLength-1;j++){
       for(int i=0;i<iNameLength-1;i++){
        sql=sql+" '"+strRowValue[j][i]+"',";
       }//end of for...
       sql=sql+" '"+strRowValue[j][iNameLength-1] +"'), (";
      }//end of outer for....
      
      for(int i=0;i<iNameLength-1;i++){
       sql=sql+" '"+strRowValue[iValueLength-1][i]+"',";
      }//end of for...
      
      sql=sql+" '"+strRowValue[iValueLength-1][iNameLength-1] +"')";
      
      try{
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if...
       if(conn==null)
        DatabaseLink();
       stmt=conn.createStatement();
       
       int result=stmt.executeUpdate(sql);
       if(result==0){
        conn.rollback();
        return false;
       }//end of if...
       conn.commit();   
      }catch(SQLException e){   
       return false;
      }//end of try...catch....  
      return true;
     }//end of the method insertMany(String)
     
     
     
     /*
        ////////////////////数据库记录的删除///////////////////////////
     */
     
     //删除一项记录
     public boolean delete(String sql){
      try{
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if...
       if(conn==null){
        DatabaseLink();
       }//end of if...
       
       stmt=conn.createStatement();
       int result=stmt.executeUpdate(sql);
       if(result==0){
        conn.rollback();
        return false;
       }//end of if...
       conn.commit();   
      }catch(SQLException e){   
       return false;
      }//end of try...catch....  
      return true;  
     }//end of the method delete(String)
     
     
     ////////////根据表名和条件删除记录/////////////////////
     public boolean delete(String sTable,String sCondition){
      try{
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if...
       if(conn==null)
        DatabaseLink();
       stmt=conn.createStatement();
       
       String sDelete="delete from"+sTable+" where "+sCondition;
       
       int result=stmt.executeUpdate(sDelete);
       if(result==0){
        conn.rollback();
        return false;
       }//end of if...
       conn.commit();   
      }catch(SQLException e){   
       return false;
      }//end of try...catch....  
      return true;
     }//end of the method delete(String,String,String)
     
     
     ///////////根据表名删除所有记录////////////////
     public boolean deleteAll(String sTable){
      try{
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if...
       if(conn==null){
        DatabaseLink();
       }//end of if...
       stmt=conn.createStatement();
       String sDelete=" delete from "+sTable;
       int result=stmt.executeUpdate(sDelete);
       if(result==0){
        conn.rollback();
        return false;
       }//end of if....
       conn.commit();
      }catch(SQLException e){   
       return false;
      }//end of try...catch..
      return true;
     }//end of the method deleteAll(String)
     
     
     
     /*
     //////////////更新数据库的记录///////////////////////
     */
     public boolean update(String sql){
      try{
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if...
       if(conn==null){
        DatabaseLink();
       }//end of if....
       stmt=conn.createStatement();
       
       int result=stmt.executeUpdate(sql);
       
       if(result==0){
        conn.rollback();
        return false;
       }//end of if....
       conn.commit();
      }catch(SQLException e){   
       return false;
      }//end of try...catch....
      return true;
     }//end of the mehtod update(String)
     
     /*
      根据表名,条件,(查找列,旧的值,新的值)
     */
     public boolean update(String sTable,String sColumn,String sOldColumn,String sNewColumn){
      try{
       if(stmt!=null){
        stmt.close();
        stmt=null;
       }//end of if....
       if(conn==null){
        DatabaseLink();
       }//end of if....
       String sQuery=" select * from "+sTable+" where "+sColumn+"="+sOldColumn;
       ResultSet rs=query(sQuery);
       if(rs.next()){
        rs.close();
        String sUpdate="update "+sTable+" set "+sColumn+" ="+sOldColumn+" where "+sColumn+" ="+sNewColumn;
        int result=stmt.executeUpdate(sUpdate);
        if(result==0){
         conn.rollback();
         return false;     
        }else{
         conn.commit();     
        }//end of if....
       }else{
        return false;
       }//end of if....
      }catch(SQLException e){  
       return false;
      }//end of try...catch....
      return true;
     }//end of the method update(String,String,String)
    }


  • liunx yum记忆

    2013-08-08 14:49:11

    1、路径
    /etc/yum*

    2、关闭防火墙

    service iptables stop

    3、碰到的问题

    问题:ValueError: No key found in given key data

    问题:Cannot retrieve repository metadata (repomd.xmlfor repository: addons   DNS导致
    解决:vim resolv.conf
    #search localdomain 
    nameserver 10.10.2.10 
    nameserver 10.10.2.11
    问题:ValueError: No key found in given key data

    解决方法:

    使用时加--nogpgcheck可以解决,即yum --nogpgcheck install [软件名]


    4、配置源
    [base]
    name=CentOS-$releasever - Base - 163.com
    baseurl=http://mirrors.cn99.com/centos/5/os/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
    gpgcheck=1
    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

    #released updates
    [updates]
    name=CentOS-$releasever - Updates - 163.com
    baseurl=http://mirrors.cn99.com/centos/5/updates/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
    gpgcheck=1
    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

    #packages used/produced in the build but not released
    [addons]
    name=CentOS-$releasever - Addons - 163.com
    baseurl=http://mirrors.cn99.com/centos/5/addons/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=addons
    gpgcheck=1
    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

    #additional packages that may be useful
    [extras]
    name=CentOS-$releasever - Extras - 163.com
    baseurl=http://mirrors.cn99.com/centos/5/extras/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
    gpgcheck=1
    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-$releasever - Plus - 163.com
    baseurl=http://mirrors.cn99.com/centos/5/centosplus/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
    gpgcheck=1
    enabled=0
    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

    #contrib - packages by Centos Users
    [contrib]
    name=CentOS-$releasever - Contrib - 163.com
    baseurl=http://mirrors.cn99.com/centos/5/contrib/$basearch/
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
    gpgcheck=1
    enabled=0
    gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5


    5、升级:
    yum update

    6、安装gcc
    yum install gcc
     



  • DBUnit入门【zt】

    2013-07-16 10:21:40

    http://www.cnblogs.com/ericsun/archive/2011/11/25/2263062.html

    原文地址:


    相信做过单元测试的人都会对JUnit非常的熟悉了,今天要介绍的DbUnit(http://dbunit.sourceforge.net/)则是专 门针对数据库测试的对JUnit的一个扩展,它可以将测试对象数据库置于一个测试轮回之间的状态。鉴于目前国内介绍DbUnit的系统教程比较少见,本文 将分从理论和实例两个方面带你领略DbUnit的精彩世界。

    DbUnit设计理念
    熟悉单元测试的开发人员都知道,在对数据库进行单元测试时候,通常采用的方案有运用模拟对象(mock objects)和stubs两种。通过隔离关联的数据库访问类,比如JDBC的相关操作类,来达到对数据库操作的模拟测试。然而某些特殊的系统,比如利 用了EJB的CMP(container-managed persistence)的系统,数据库的访问对象是在最底层而且很隐蔽的,那么这两种解决方案对这些系统就显得力不从心了。

    DBUnit的设计理念就是在测试之前,备份数据库,然后给对象数据库植入我们需要的准备数据,最后,在测试完毕后,读入备份数据库,回溯到测试前的状态;
    而且又因为DBUnit是对JUnit的一种扩展,开发人员可以通过创建测试用例代码,在这些测试用例的生命周期内来对数据库的操作结果进行比较。

    DbUnit测试基本概念和流程
    基于DbUnit 的测试的主要接口是IDataSet。IDataSet代表一个或多个表的数据。
    可以将数据库模式的全部内容表示为单个IDataSet 实例。这些表本身由Itable 实例来表示。
    IDataSet 的实现有很多,每一个都对应一个不同的数据源或加载机制。最常用的几种 IDataSet实现为: 
    FlatXmlDataSet:数据的简单平面文件 XML 表示 
    QueryDataSet:用 SQL 查询获得的数据 
    DatabaseDataSet:数据库表本身内容的一种表示 
    XlsDataSet :数据的excel表示

    一般而言,使用DbUnit进行单元测试的流程如下:
    1 根据业务,做好测试用的准备数据和预想结果数据,通常准备成xml格式文件。
    2 在setUp()方法里边备份数据库中的关联表。
    3 在setUp()方法里边读入准备数据。
    4 对测试类的对应测试方法进行实装:执行对象方法,把数据库的实际执行结果和预想结果进行比较。
    5 在tearDown()方法里边,把数据库还原到测试前状态。

    DbUnit开发实例
    下面通过一个实例来说明DbUnit的实际运用。

    实例准备
    比如有一个学生表[student],结构如下:


    id char(4) pk 学号
    name char(50) 姓名
    sex char(1) 性别
    birthday date 出生日期


    准备数据如下:


    id name sex birthday
    0001 翁仔 m 1979-12-31
    0002 王翠花 f 1982-08-09


    测试对象类为StudentOpe.java,里边有2个方法:
    findStudent(String id) :根据主键id找记录
    addStudent(Student student) :添加一条记录

    在测试addStudent方法时候,我们准备添加如下一条数据


    id name sex birthday
    0088 王耳朵 m 1982-01-01


    那么在执行该方法后,数据库的student表里的数据是这样的:


    id name sex birthday
    0001 翁仔 m 1979-12-31
    0002 王翠花 f 1982-08-09 
    0088 王耳朵 m 1982-01-01


    然后我们说明如何对这2个方法进行单元测试。

    实例展开
    1 把准备数据和预想数据转换成xml文件
    student_pre.xml


    <?xml version='1.0' encoding="gb2312"?>
    <dataset>
    <student id="0001" name="翁仔" sex="m" birthday="1979-12-31"/>
    <student id="0002" name="王翠花" sex="f" birthday="1982-08-09"/>
    </dataset>



    student_exp.xml


    <?xml version='1.0' encoding="gb2312"?>
    <dataset>
    <student id="0001" name="翁仔" sex="m" birthday="1979-12-31"/>
    <student id="0002" name="王翠花" sex="f" birthday="1982-08-09"/>
    <student id="0088" name="王耳朵" sex="m" birthday="1982-01-01"/>
    </dataset>


    2 实装setUp方法,详细见代码注释。


    protected void setUp() {
    IDatabaseConnection connection =null;
    try{
    super.setUp();
    //本例使用postgresql数据库 
    Class.forName("org.postgresql.Driver");
    //连接DB 
    Connection conn=DriverManager.getConnection("jdbc:postgresql:testdb.test","postgres","postgres");
    //获得DB连接
    connection =new DatabaseConnection(conn);

    //对数据库中的操作对象表student进行备份
    QueryDataSet backupDataSet = new QueryDataSet(connection);
    backupDataSet.addTable("student");
    file=File.createTempFile("student_back",".xml");//备份文件
    FlatXmlDataSet.write(backupDataSet,new FileOutputStream(file));

    //准备数据的读入
    IDataSet dataSet = new FlatXmlDataSet( new FileInputStream("student_pre.xml"));
    DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);

    }catch(Exception e){
    e.printStackTrace();
    }finally{
    try{
    if(connection!=null) connection.close();
    }catch(SQLException e){}
    }
    }


    3 实装测试方法,详细见代码注释。

    *检索类方法,可以利用assertEquals()方法,拿表的字段进行比较。


    // findStudent 
    public void testFindStudent() throws Exception{
    //执行findStudent方法
    StudentOpe studentOpe=new StudentOpe();
    Student result = studentOpe.findStudent("0001");

    //预想结果和实际结果的比较
    assertEquals("翁仔",result.getName());
    assertEquals("m",result.getSex());
    assertEquals("1979-12-31",result.getBirthDay());
    }



    *更新,添加,删除等方法,可以利用Assertion.assertEquals()方法,拿表的整体来比较。


    public void testAddStudent() throws Exception{
    //执行addStudent方法
    StudentOpe studentOpe=new StudentOpe();
    //被追加的记录
    Student newStudent = new Student("0088","王耳朵","m","1982-01-01");
    //执行追加方法 
    Student result = studentOpe.addStudent(newStudent);

    //预想结果和实际结果的比较
    IDatabaseConnection connection=null;

    try{

    //预期结果取得
    IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream("student_exp.xml"));
    ITable expectedTable = expectedDataSet.getTable("student");

    //实际结果取得
    Connection conn=getConnection();
    connection =new DatabaseConnection(conn);

    IDataSet databaseDataSet = connection.createDataSet();
    ITable actualTable = databaseDataSet.getTable("student");

    //比较
    Assertion.assertEquals(expectedTable, actualTable);

    }finally{
    if(connection!=null) connection.close();
    }
    }



    *如果在整体比较表的时候,有个别字段不需要比较,可以用DefaultColumnFilter.excludedColumnsTable()方法,
    将指定字段给排除在比较范围之外。比如上例中不需要比较birthday这个字段的话,那么可以如下代码所示进行处理:


    ITable filteredExpectedTable = DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"birthday"});
    ITable filteredActualTable = DefaultColumnFilter.excludedColumnsTable(actualTable,new String[]{"birthday"});
    Assertion.assertEquals(filteredExpectedTable, filteredActualTable);



    4 在tearDown()方法里边,把数据库还原到测试前状态


    protected void tearDown() throws Exception{

    IDatabaseConnection connection =null;
    try{
    super.tearDown();
    Connection conn=getConnection();
    connection =new DatabaseConnection(conn);

    IDataSet dataSet = new FlatXmlDataSet(file);
    DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);

    }catch(Exception e){
    e.printStackTrace();
    }finally{
    try{
    if(connection!=null) connection.close();
    }catch(SQLException e){}
    }

    }



    posted @ 2011-11-25 12:55 Crazy Eric 阅读(1016) 评论(0编辑 收藏

  • 数据库expdp导出和impdp导入

    2013-04-16 08:38:10

    详细的用法需要大量文字描述,本文档中主要用一个实际案例和指导性的语言说明详细用法请大家查阅相关资料:

    1、为什么要用***dp这种方式导出,导入数据?

    主要解决碰到的一个分区表不能导出数据的问题,至于其他用法,需要百度。

    2、具体操作?

    第一步:登录oracle数据库服务器,做如下操作:

    sqlplus  "/as sysdba"

    SQL> create directory dbout as '/u01/dbout';

    SQL> grant read,write on directory dbout to wt; 

    SQL> quit

    上述代码主要建一个导出的存储空间

    第二步:执行导出命令

    expdp wt/1 directory=dbout  dumpfile=wt.dmp

    此时已经把wt数据库的数据表导入到:/u01/dbout目录下,=

    第三步:继续权限设置

    sqlplus  "/as sysdba"

    SQL> create directory dbout as '/u01/dbout';

    SQL> grant read,write on directory dbout to public;

    SQL> commit;

    SQL> quit

    第四步:执行导入命令

    impdp wt1/1@ORCL dumpfile=wt.dmp directory=dbout remap_schema=wt:wt1

    注意:remap_schema=wt:wt1 这个用户转换的参数一定要加。

    说明:命令中包括很多参数,可以满足用户的时间需求,建议大家在使用中,查看您具体的参数文档。

  • oracle 导入 报错

    2013-03-04 15:49:07


    问题:

    报错信息为此对象由sa导出,而不是当前用户,请问为什么?

    解决:
    imp system/system@tyq file=e:\abc.dmp ignore=y fromuser=sa touser=system 
  • ORACLE存储过程基本语法

    2013-02-25 14:34:02

    存储过程

      1  CREATE OR REPLACE PROCEDURE 存储过程名

       IS

       BEGIN

      4  NULL;

       END;

     

    行1:

      CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;

    行2:

      IS关键词表明后面将跟随一个PL/SQL体。

    行3:

      BEGIN关键词表明PL/SQL体的开始。

    行4:

      NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;

    行5:

      END关键词表明PL/SQL体的结束

    存储过程创建语法:

     create or replace procedure 存储过程名(param1 in typeparam2 out type) 

    as 

    变量1 类型(值范围); --vs_msg   VARCHAR2(4000); 

    变量2 类型(值范围);

    Begin

    Select count(*) into 变量1 from 表A where列名=param1

     

        If (判断条件) then

           Select 列名 into 变量2 from 表A where列名=param1

           Dbms_outputPut_line(‘打印信息’);

        Elsif (判断条件) then

           Dbms_outputPut_line(‘打印信息’);

        Else

           Raise 异常名(NO_DATA_FOUND;

        End if;

    Exception

        When others then

           Rollback;

    End;

     

     

     

    注意事项:

    1, 存储过程参数不带取值范围,in表示传入,out表示输出

    类型可以使用任意Oracle中的合法类型。

    2,  变量带取值范围,后面接分号

    3,  在判断语句前最好先用count(*)函数判断是否存在该条操作记录

    4,  用select 。。。into。。。给变量赋值

    5,  在代码中抛异常用 raise+异常名

     

    CREATE OR REPLACE PROCEDURE存储过程名
    (

    --定义参数
     is_ym  IN CHAR(6) ,

    the_count OUT NUMBER,

    AS 
    --定义变量 
    vs_msg   VARCHAR2(4000);   --错误信息变量
    vs_ym_beg  CHAR(6);      --起始月份
    vs_ym_end  CHAR(6);      --终止月份
    vs_ym_sn_beg CHAR(6);     --同期起始月份
    vs_ym_sn_end CHAR(6);     --同期终止月份

    --定义游标(简单的说就是一个可以遍历的结果集) 


    CURSOR cur_1 IS 
      SELECT 。。。 
      FROM 。。。 
        WHERE 。。。
       GROUP BY 。。。; 

    BEGIN 


    --用输入参数给变量赋初值,用到了OralceSUBSTR TO_CHAR ADD_MONTHS 

     

    TO_DATE 等很常用的函数。 
    vs_ym_beg := SUBSTR(is_ym,1,6); 
    vs_ym_end := SUBSTR(is_ym,7,6); 
    vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'), -12),'yyyymm'); 
    vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'), -12),'yyyymm'); 


    --先删除表中特定条件的数据。 


    DELETE FROM 表名 WHERE ym = is_ym; 


      --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount 


    DBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||''); 

    INSERT INTO表名(area_code,ym,CMCODE,rmb_amt,usd_amt) 
    SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000 
    FROM BGD_AREA_CM_M_BASE_T 
      WHERE ym >= vs_ym_beg 
      AND ym <= vs_ym_end 
    GROUP BY area_code,CMCODE; 

    DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||''); 
    --遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种

     
    FOR rec IN cur_1 LOOP 
      UPDATE 表名
      SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn 
       WHERE area_code = rec.area_code 
       AND CMCODE = rec.CMCODE 
       AND ym = is_ym; 
    END LOOP; 

    COMMIT; 


    --错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。 


    EXCEPTION 


       WHEN OTHERS THEN 
          vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);

     
       ROLLBACK; 


       --把当前错误记录进日志表。 


       INSERT INTO LOG_INFO(proc_name,error_info,op_date) 
       VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE); 
       COMMIT; 
       RETURN; 


    END;

  • ORACLE数据库导出导入

    2013-01-21 18:17:05

     数据导出:

      1、将数据库test完全导出,用户名system 密码manager 导出到d:/daochu.dmp中

      exp system/manager@test file=d:/daochu.dmp full=y

      2、将数据库中system用户与sys用户的表导出

      exp system/manager@test file=d:/daochu.dmp wner=(system,sys)

      3、将数据库中的表inner_notify、notify_staff_relat导出

      exp aichannel/aichannel@testdb2 file= d:/data/newsmgnt.dmp tables=(inner_notify,notify_staff_relat)

      4、将数据库中的表table1中的字段filed1以"00"打头的数据导出

      exp system/manager@test file=d:/daochu.dmp tables=(table1) query=/" where filed1 like 00%/"

      上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。也可以在上面命令后面 加上 compress=y 来实现。

      数据导入:

      1、将d:/daochu.dmp 中的数据导入 test数据库中。

      imp system/manager@test  file=d:/daochu.dmp   imp aichannel/aichannel@hust full=y  file=file= d:/data/newsmgnt.dmp ignore=y

      上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。在后面加上 ignore=y 就可以了。

      2、将d:/daochu.dmp中的表table1 导入

      imp system/manager@test  file=d:/daochu.dmp  tables=(table1)

      基本上上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。

      注意: 操作者要有足够的权限,权限不够它会提示。数据库时可以连上的。可以用tnsping test 来获得数据库test能否连上。

      以上记载,只是oracle数据导入导出的最基本方法,在实际应用中会有各种因素影响导入导出的结果,所以要灵活运用这些最基本的命令,但也要统筹整个oracle运行的环境来考虑问题。

  • 环境文件权限问题

    2012-12-10 16:52:37

    今天要给新搭建的环境文件目录分权限,搞了半天,都分不成功,最后发现,要给目录分权限,要在chmod后加上参数:-R,唉,上次就这个问题已经搞定过,这次又忘记了,真的老了
  • Tomcat中Java垃圾收集调优『ZT』

    2012-12-08 13:41:29

    1 JVM内存JAVA_OPTS参数说明  
    设置服务器端的JVM参数一般在catalina.bat文件中:JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss512k"   JVM中对象的划分及管理介绍  JVM根据运行于其中的对象的生存时间大致的分为3种。并且将这3种不同的对象分别存放在JVM从系统分配到的不同的内存空间。这种对象存放空间的管理方式叫做Generation管理方式。 
        1). Young Generation年轻代用于存放“早逝”对象即瞬时对象。例如在创建对象时或者调用方法时使用的临时对象或局部变量。 
        2). Tenured Generation(年老代)用于存放“驻留”对象即较长时间被引用的对象。往往体现为一个大型程序中的全局对象或长时间被使用的对象。 
        3). Perm Generation(永久保存区域)用于存放“永久”对象。这些对象管理着运行于JVM中的类和方法。
     ------------------------------------------------------------------------------ 
    在命令行下用 java -XmxXXXXM -version 命令来测试java可用最大内存测试可逐渐增大XXXX的值如果执行正常就表示指定的内存大小可用否则会打印错误信息。  通常测试windows系统(32位)最大内存为1500M,但系统一般到1280M就差不多了 ------------------------------------------------------ 
     关于垃圾收集分类介绍  在JVM中有两种垃圾方式: 
        1). 一种叫做Minor次收集。Minor在Young Generation年轻代的空间被对象全部占用后执行主要是对Young Generation中的对象进行垃圾收集。 
        2). 一种叫做Major主收集。Major是针对于整个Heap size(Xms和Xmx设置为JVM使用的内存但不包括永久保存区域使用的内存)的垃圾收集。 其中Minor方式的收集经常发生并且Minor收集所占用的系统时间小。而Major方式的垃圾收集则是一种“昂贵”的垃圾收集方式因为在Major要对整个Heap size进行垃圾收集,这会使得应用停顿的时间变得较长。  关于TOMCAT内存占用介绍  Tomcat运行占用内存= Xmx占用的内存 + Perm Generation(永久保存区域)占用内存 + 所有Java应用创建线程数x 1M Java应用每创建一个线程在JVM的内存里也会创建一个Thread对象但是同时也会在操作系统里创建一个真正的物理线程参考JVM规范操作系统会在TOMCAT余下的内存里创建这个物理线程而不是在JVM的Xmx设置的内存堆里创建。在jdk1.4里头默认的栈大小是256KB但是在jdk1.5里头默认的栈大小为1M每线程。因此如果系统剩余内存为400M的可用内存则Java应用最多创建400个可用线程。结论要想创建更多的线程必须减少分配给JVM的最大内存。  
    参数说明如下  
    -server:一定要作为第一个参数在多个CPU时性能佳  
    -Xms初始Heap大小使用的最小内存,cpu性能高时此值应设的大一些  
    -Xmxjava heap最大值使用的最大内存  上面两个值是分配JVM的最小和最大内存取决于硬件物理内存的大小建议均设为物理内存的一半,最大不要超过可用物理内存的80。 
     -Xmnyoung generation年轻代的heap大小一般设置为Xmx的3、4分之一此值对系统性能影响较大Sun官方推荐配置为整个堆的3/8 (可使用-XX:NewSize和-XX:MaxNewsize设置年轻代的初始值和最大值) 
    -Xincgc :启动增量垃圾收集器缺省是关闭的。增量垃圾收集器能减少偶然发生的长时间的垃圾回收造成的暂停时间。但增量垃圾收集器和应用程序并发执行因此会占用部分CPU在应用程序上的功能。 
    -XX:CMSInitiatingOccupancyFraction=70 发现引起promotion failed错误的原因是CMS来不及回收CMS默认在年老代占到90%左右才会执行年老代又没有足够的空间供GC把一些活的对象从年轻代移到年老代所以执行Full GC。CMSInitiatingOccupancyFraction=70表示年老代占到约70%时就开始执行CMS这样就不会频繁出现Full GC了。 上两个参数设置有很大技巧基本上满足: (Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。如果在应用中设置Xmx最大内存是1500mXmn年轻代是340m那么Xmx-Xmn是1160m也就是年老代有1160 兆CMSInitiatingOccupancyFraction=70说明年老代到70%满的时候开始执行对年老代的并发垃圾回收CMS这时还剩30%的空间是1160*30%=348兆所以即使Xmn也就是年轻代共340兆里所有对象都搬到年老代里348兆的空间也足够了所以只要满足上面的公式就不会出现垃圾回收时的promotion failed     -XX:PermSize= xxxm:设定xxx兆内存的永久保存区域 -XX:MaxPermSize=xxxm:设定xxx兆最大内存的永久保存区域  PermSize和MaxPermSize指明虚拟机为java永久生成对象Permanate generation如class对象、方法对象这些可反射reflective对象分配内存限制这些内存不包括在Heap堆内存区之中。上述参数如果不设定永久保存区域默认大小-server选项下默认MaxPermSize为64m-client选项下默认MaxPermSize为32m。运行程序时jvm会调整永久保存区域的大小以满足需要。每次调整时jvm会对堆进行一次完全的垃圾收集。    -XX:+UseConcMarkSweepGC 选择CMS收集器并发回收缩短major收集的时间  提示此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。 【-XX:+UseParNewGC 对年轻代采用多线程并行回收这样收得快缩短minor收集的时间如果设置-XX:+UseConcMarkSweepGC无须设置-XX:+UseParNewGC是默认的】 -XX:MaxTenuringThreshold=5  CMS收集器中新生代对象撑过过多少次minor gc才进入年老代的。默认为0或另一说法一个对象如果在救助空间移动5次还没有被回收就放入年老代。如果设置为0就是去掉了新生代空间存活的临时对象不经过Survivor区直接进入年老代不久就占满年老代发生full gc -XX:GCTimeRatio=19 表示java可以用5%的时间来做垃圾回收1/(1+19)=1 /20=5% -XX:CMSFullGCsBeforeCompaction=N表示执行N次Full GC后执行内存压缩免得产生内存碎片               (案例都设置为-XX:CMSFullGCsBeforeCompaction=0) -XX:+UseCMSCompactAtFullCollection表示执行Full GC后对内存进行整理压缩免得产生内存碎片 -Xnoclassgc禁用类垃圾回收性能会高一点 -verbose:gc 显示垃圾收集信息 在虚拟机发生内存回收时在输出设备显示信息 
    -Xloggc:gc.log 指定垃圾收集日志文件   -XX:+DisableExplicitGC禁止System.gc()免得程序员误调用gc方法影响性能 -XX:+ExplicitGCInvokesConcurrentSystem.gc()可以与应用程序并发执行。 System.gc()来收回不用的内存是写在程序里的。System.gc()只是“建议”JVM回收内存不是强制。禁止System.gc()要看实际开发的程序如何处理。因此编程要养成习惯创建一个对象不再用时指向null这样jvm发现它不再使用时会更早的把它放进回收队列才能更早的进行回收。 例如 你要销毁一个对象可以  代码:  String a = "ksadjflasdf";  //do something.  //  a=null;  这不是销毁一个对象 仅仅是把对一个对象的引用去掉了 在java中一个对象可以被多个对象引用的只有一个对象不在被引用时才可以被垃圾收集  -XX:SoftRefLRUPolicyMSPerMB=N 这个参数比较有用的官方解释是Soft reference在虚拟机中比在客户集中存活的更长一些。其清除频率可以用命令行参数 -XX:SoftRefLRUPolicyMSPerMB=<N>来控制这可以指定每兆堆空闲空间的 soft reference 保持存活一旦它不强可达了的毫秒数这意味着每兆堆中的空闲空间中的 soft reference 会在最后一个强引用被回收之后存活1秒钟。注意这是一个近似的值因为 soft reference 只会在垃圾回收时才会被清除而垃圾回收并不总在发生。系统默认为一秒我觉得没必要等1秒客户集中不用就立刻清除改为-XX:SoftRefLRUPolicyMSPerMB=0   -Xss 15120 这使得JBoss每增加一个线程thread)就会立即消耗15M内存而最佳值应该是128K,默认值好像是512k.  +XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。 -Xss每个线程的Stack大小    显示日志参数 -verbose:gc在虚拟机发生内存回收时在输出设备显示信息格式如下 [Full GC 268K->168K(1984K), 0.0187390 secs] 该参数用来监视虚拟机内存回收的情况。-XX:+PrintGCDetails  -XX:+PrintGCTimeStamps(GC发生的时间)  -XX:+PrintGCApplicationStoppedTime(GC消耗了多少时间)  -XX:+PrintGCApplicationConcurrentTime(GC之间运行了多少时间) -XX:+PrintTenuringDistribution 参数观察各个Age的对象总大小   2 GC日志打印   GC调优是个很实验很伽利略的活儿GC日志是先决的数据参考和最终验证 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps(GC发生的时间) -XX:+PrintGCApplicationStoppedTime(GC消耗了多少时间) -XX:+PrintGCApplicationConcurrentTime(GC之间运行了多少时间)  
     3 收集器选择 
    CMS收集器并发回收暂停时间优先  
      配置参数
    -XX:+UseConcMarkSweepGC    已默认无需配置的参数
    -XX:+UseParNewGC(Parallel收集新生代)         
    -XX:+CMSPermGenSweepingEnabled(CMS收集持久代) 
    -XX:UseCMSCompactAtFullCollection(full gc时压缩年老代)    初始效果1g堆内存的新生代约60mminor gc约5-20毫秒full gc约130毫秒。  Parallel收集器并行回收吞吐量优先     
    配置参数 
    -XX:+UseParallelGC 
    -XX:+UseParallelOldGC(Parallel收集年老代从JDK6.0开始支持)     已默认无需配置的参数 -XX:+UseAdaptiveSizePolicy(动态调整新生代大小)     初始效果1g堆内存的新生代约90-110m(动态调整)minor gc约5-20毫秒full gc有无UseParallelOldGC 参数分别为1.3/1.1秒差别不大。 另外
    -XX:MaxGCPauseMillis=100 设置minor gc的期望最大时间JVM会以此来调整新生代的大小但在此测试环境中对象死的太快此参数作用不大。  

    4 调优实战       
      Parallel收集高达1秒的暂停时间基本不可忍受所以选择CMS收集器。       
         在被压测的Mule 2.0应用里每秒都有大约400M的海量短命对象产生 因为默认60M的新生代太小了频繁发生minor gc大约0.2秒就进行一次。 因为CMS收集器中MaxTenuringThreshold(新生代对象撑过过多少次minor gc才进入年老代的设置)默认0存活的临时对象不经过Survivor区直接进入年老代不久就占满年老代发生full gc。      
        对这两个参数的调优既要改善上面两种情况又要避免新生代过大复制次数过多造成minor gc的暂停时间过长。 使用-Xmn调到1/3 总内存。观察后设置-Xmn500M新生代实际约460m。(用-XX:NewRatio设置无效只能用 -Xmn)。 添加-XX:+PrintTenuringDistribution 参数观察各个Age的对象总大小观察后设置-XX:MaxTenuringThreshold=5。        
        优化后大约1.1秒才发生一次minor gc且速度依然保持在15-20ms之间。同时年老代的增长速度大大减缓很久才发生一次full gc       
        参数定稿  
        -server -Xms1536m -Xmx1536m -Xmn512m -XX:+UseConcMarkSweepGC   -XX:MaxTenuringThreshold=5  -XX:+ExplicitGCInvokesConcurrent -XX:GCTimeRatio=19 -XX:CMSInitiatingOccupancyFraction=70  -XX:CMSFullGCsBeforeCompaction=0 -Xnoclassg        

         最后服务处理速度从1180 tps 上升到1380 tps调整两个参数提升17%的性能还是笔很划算的买卖。        
        另外JDK6 Update 7自带了一个VisualVM工具内里就是之前也有用过的Netbean Profiler类似JConsole一样使用可以看到线程状态内存中对象以及方法的CPU时间等调优重要参考依据。免费捆绑啊Sun 这样搞法其他做Profiler的公司要关门了。  

    标准参数设置参考样本tomcat可用8G内存案例 

    set JAVA_OPTS=%JAVA_OPTS%  -server –Xms8192m –Xmx8192m –Xmn1890m -verbose:gc -XX:+UseConcMarkSweepGC   -XX:MaxTenuringThreshold=5  -XX:+ExplicitGCInvokesConcurrent -XX:GCTimeRatio=19 -XX:CMSInitiatingOccupancyFraction=70 -XX:CMSFullGCsBeforeCompaction=0 –Xnoclassgc -XX:SoftRefLRUPolicyMSPerMB=0 


  • oracle 11g常用命令

    2012-11-30 16:21:25


    1.监听
    启动监听
    lsnrctl start
    停止监听 
    lsnrctl stop 
    查看监听状态 
    lsnrctl status 

    2.启动
    用oracle用户进入
    su - oracle
    运行sqlplus命令,进入sqlplus环境,nolog参数表示不登录;
    sqlplus /nolog
    以管理员模式进入
    conn /as sysdba
    启动数据库
    startup;
    停止数据库
    SHUTDOWN IMMEDIATE

    远程连接数据库
    sqlplus /nolog
    conn sys/sys@IP:1521/orainstance as sysdba

    也可以直接运行:
    dbstart //启动数据库脚本 
    dbshut //停止数据库脚本 


    参考:
    STARTUP [FORCE][RESTRICT][NOMOUNT][MIGRATE][QUIET]
    [PFILE=<file_name>]
    [MOUNT [EXCLUSIVE] <database_name>x |
    OPEN <READ {ONLY | WRITE [RECOVER]} | RECOVER>
    <database_name>]

    SHUTDOWN <NORMAL|ABORT | IMMEDIATE | TRANSACTIONAL[LOCAL]>

    3.用户管理
    创建用户
    create user "username" identified by "userpassword" ;
    注:后面可带表空间
    删除用户
    drop user “username” cascade;
    注:cascade 参数是级联删除该用户所有对象,经常遇到如用户有对象而未加此参数则用户删不了的问题,所以习惯性的加此参数 
    授权
    grant connect,resource,dba to "username" ;
    查看当前用户的角色
    select * from user_role_privs;
    select * from session_privs; 
    查看当前用户的系统权限和表级权限
    select * from user_sys_privs;
    select * from user_tab_privs;
    查询用户表
    select username from dba_users; 
    修改用户口令
    alter user "username" identified by "password"; 
    显示当前用户
    show user;


    4.表及表空间
    创建表空间
    CREATE TABLESPACE data01 DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M;
    删除表空间
    DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
    修改表空间大小
    alter database datafile '/path/NADDate05.dbf' resize 100M;
    增加表空间 
    ALTER TABLESPACE NEWCCS ADD DATAFILE '/u03/oradata/newccs/newccs04.dbf' SIZE 4896M; 
    查询数据库文件
    select * from dba_data_files; 
    查询当前存在的表空间
    select * from v$tablespace;
    表空间情况
    select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name;
    查询表空间剩余空间
    select tablespace_name,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;
    查看表结构
    desc table;

    修改连接数:要重启数据库
    alter system set processes=1000 scope=spfile;
    shutdown immediate;
    startup;
    查看用户当前连接数
    select count(*) from sys.v_$session;

    PL/SQL

    [DECLARE
    /*申明部分,一般是变量及常量*/]
    [ BEGIN
    /*执行部分,流程结构控制,SQL部分*/]
    [EXCEPTION
    /*异常处理部分*/]
    END


    SET SERVEROUTPUT ON //打开输出开关
    BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello world!'); //输出结果
    END;

  • Jmeter后置处理器之--正则表达式

    2012-10-31 13:07:47

        测试需要用到Jmeter自动生效一张单据,系统中用FlowTableID把各个环节串联起来,其中编辑保存的时候自动生成一个FlowTableID,后面审批,生效环节用到这个动态生成的ID,故用Jmeter的正则表达是自动匹配这个id:

    ~~~~·~~~~·~~~~·~~~~

    引用名称:FlowTableID
    正则表达式:<FlowTableID>(.+?)</FlowTableID>
    模板:$1$
    匹配数字:0

    ~~~~·~~~~·~~~~·~~~~
    在需要的地方用${FlowTableID}替代即可

  • 日志信息查询

    2012-09-10 10:56:53

    一、抓取日志中关键行并写如到log.sh文件中
    echo "#######reading content for pageNo=##########" >> log.sh
    find . -name "reportexport.log" | xargs grep "reading content for pageNo=" >> log.sh

    echo "###########Ending export excel:PID=############" >> log.sh
    find . -name "reportexport.log" | xargs grep "Ending export excel:PID=" >> log.sh

    echo "############export excel pid: =##############" >> log.sh
    find . -name "reportexport.log" | xargs grep "export excel pid: =" >> log.sh

    二、结果
    ###################Ending export excel:PID=##################
    2012-09-10 10:48:08,737  INFO [easytrade.reportexport.ReportProcessor@pool-1-thread-10] - <Ending export excel:PID=1006 casted 2657ms.>    -->easytrade.reportexport.ReportProcessor.run(ReportProcessor.java:280)
    ###################export excel pid: =##################
    2012-09-10 10:48:09,125  INFO [easytrade.reportexport.ReportProcessor@TP-Processor19] - <export excel pid: = 1006 total casted 44446ms.>    -->easytrade.reportexport.ReportProcessor.destory(ReportProcessor.java:453)
    三、抓取关键字段,取值
    字段:值 格式,这个还需要研究一下
  • Oracle用户、权限、角色管理【zt】

    2012-09-07 10:58:15

    Oracle 权限设置
    一、权限分类:
    系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。

    实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。

    二、系统权限管理:
    1、系统权限分类:
    DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。

    RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。

    CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。

    对于普通用户:授予connect, resource权限。
    对于DBA管理用户:授予connect,resource, dba权限。

    2、系统权限授权命令:
    [系统权限只能由DBA用户授出:sys, system(最开始只能是这两个用户)]
    授权命令:SQL> grant connect, resource, dba to 用户名1 [,用户名2]...;

    [普通用户通过授权可以具有与system相同的用户权限,但永远不能达到与sys用户相同的权限,system用户的权限也可以被回收。]

    例:

    1. connect / as sysdba
    2. Create user user50 identified by user50;
    3. grant connect, resource to user50;
    查询用户拥有哪些权限:

    1. select * from dba_role_privs;
    2. select * from dba_sys_privs;
    3. select * from role_sys_privs;
    删除用户:
    SQL> drop user 用户名 cascade;  //加上cascade则将用户连同其创建的东西全部删除

    3、系统权限传递:
    增加WITH ADMIN OPTION选项,则得到的权限可以传递。
    SQL> grant connect, resorce to user50 with admin option;  //可以传递所获权限。

    4、系统权限回收:系统权限只能由DBA用户回收
    命令:SQL> Revoke connect, resource from user50;

    说明:

    1)如果使用WITH ADMIN OPTION为某个用户授予系统权限,那么对于被这个用户授予相同权限的所有用户来说,取消该用户的系统权限并不会级联取消这些用户的相同权限。

    2)系统权限无级联,即A授予B权限,B授予C权限,如果A收回B的权限,C的权限不受影响;系统权限可以跨用户回收,即A可以直接收回C用户的权限。

    三、实体权限管理
    1、实体权限分类:select, update, insert, alter, index, delete, all  //all包括所有权限
    execute  //执行存储过程权限

    user01:

    1. grant select, update, insert on product to user02;
    2. grant all on product to user02;
    user02:

    1. select * from user01.product;
    // 此时user02查user_tables,不包括user01.product这个表,但如果查all_tables则可以查到,因为他可以访问。


    2. 将表的操作权限授予全体用户:
    SQL> grant all on product to public;  // public表示是所有的用户,这里的all权限不包括drop。

    [实体权限数据字典]:
    SQL> select owner, table_name from all_tables; // 用户可以查询的表
    SQL> select table_name from user_tables;  // 用户创建的表
    SQL> select grantor, table_schema, table_name, privilege from all_tab_privs; // 获权可以存取的表(被授权的)
    SQL> select grantee, owner, table_name, privilege from user_tab_privs;   // 授出权限的表(授出的权限)

    3. DBA用户可以操作全体用户的任意基表(无需授权,包括删除):
    DBA用户:

    1. Create table stud02.product(
    2.  id number(10),
    3.  name varchar2(20));

    4. drop table stud02.emp;

    5. create table stud02.employee
    6.  as
    7.  select * from scott.emp;
    4. 实体权限传递(with grant option):
    user01:

    SQL> grant select, update on product to user02 with grant option; // user02得到权限,并可以传递。

    5. 实体权限回收:
    user01:
    SQL>Revoke select, update on product from user02;  //传递的权限将全部丢失。

    说明

    1)如果取消某个用户的对象权限,那么对于这个用户使用WITH GRANT OPTION授予权限的用户来说,同样还会取消这些用户的相同权限,也就是说取消授权时级联的。

    Oracle 用户管理
    一、创建用户的Profile文件
    SQL> create profile student limit  // student为资源文件名
     FAILED_LOGIN_ATTEMPTS  3  //指定锁定用户的登录失败次数
     PASSWORD_LOCK_TIME 5  //指定用户被锁定天数
     PASSWORD_LIFE_TIME 30  //指定口令可用天数
     
    二、创建用户

    1. Create User username
    2.  Identified by password
    3.  Default Tablespace tablespace
    4.  Temporary Tablespace tablespace
    5.  Profile profile
    6.  Quota integer/unlimited on tablespace;

    例:
    SQL> Create user acc01
     identified by acc01   // 如果密码是数字,请用双引号括起来
     default tablespace account
     temporary tablespace temp
     profile default
     quota 50m on account;
    SQL> grant connect, resource to acc01;

    [*] 查询用户缺省表空间、临时表空间

    1. select username, default_tablespace, temporary_tablespace from dba_users;
    [*] 查询系统资源文件名:

    1. select * from dba_profiles;
    资源文件类似表,一旦创建就会保存在数据库中。

    1. select username, profile, default_tablespace, temporary_tablespace from dba_users;

    2. create profile common limit
    3.  failed_login_attempts 5
    4.  idle_time 5;
    5.  
    6. Alter user acc01 profile common;

    三、修改用户:
    SQL> Alter User 用户名
     Identified 口令
     Default Tablespace tablespace
     Temporary Tablespace tablespace
     Profile profile
     Quota integer/unlimited on tablespace;
     
    1、修改口令字:

    1. Alter user acc01 identified by "12345";
    2、修改用户缺省表空间:

    1. Alter user acc01 default tablespace users;
    3、修改用户临时表空间

    1. Alter user acc01 temporary tablespace temp_data;
    4、强制用户修改口令字:

    1. Alter user acc01 password expire;
    5、将用户加锁
    SQL> Alter user acc01 account lock;  // 加锁
    SQL> Alter user acc01 account unlock;  // 解锁

    四、删除用户
    SQL>drop user 用户名;  //用户没有建任何实体
    SQL> drop user 用户名 CASCADE;  // 将用户及其所建实体全部删除

    *1. 当前正连接的用户不得删除。

    五、监视用户:
    1、查询用户会话信息:

    1. select username, sid 查看(716) 评论(0) 收藏 分享 管理

    2. liunx系统管理【转账】

      2012-08-17 14:30:48

      http://blog.csdn.net/maidanm/article/details/7845685
    3. ruby_环境搭建

      2012-08-02 10:19:31

          最近闲的无聊,决定重新研究一下前面接触过的ruby。首先从环境开始:
          以前是用ruby自己的IDE,这些想用eclipse插件,公司不能上外网,不能通过eclipse的Help-softWareUpdates...安装,只好下载了一个插件——RDT
          解压后直接把features和plugins两个目录下的文件copy到eclipse对应目录下;重新打开eclipse,就可以新建ruby项目了,顺便配置一下ruby的编译环境:Preferences--Ruby--Installed Interpreters--add:选择ruby的安装路径即可
          接下来新建一个项目:rubyDemo
          新建第一个class:helloworld

      class HelloWorld
       puts "hi helloworld!"
              end
          鼠标右击class,run:在工作台中打印出:hi helloworld!
          ok,接下来可以继续了....



    4. Web服务器——nginx

      2012-06-20 11:03:00

      这两天又一次搭建了下nginx集群服务器,感慨些许,之所以说是又一次,是因为去年的时候在测试服务器上搭建过一次,当时得出的结论是,很简单,很easy就搞定了。这两天再研究的时候,却发现上传接触到的只是皮毛而已。于是在晚上找了份资料,回家也翻了下前段时间买的一本书,发现有点意思:

      1、它是个什么东东?

      俄国佬(名字不用管他了)开发的一款可以替代apache的高性能web服务器,支持高并发(50000),而CPU,内存等系统资源占用比较少,运行非常稳定。非常小,只有几百kb。国内很多知名门户都用它做web服务器或反向代理服务器。

      2、安装(基于liunxOS

      tar  zxvf  ***.tar.gz

      cd ***

      ./configure

      make

      make install

      以前都是通过上面的命令,以最简单的方法安装一个软件,这次发现:./configure后面有很多编译选项,可以指定不同配置文件安装到不同路径;指定不同用户,组;开启/禁用某些配置,模式等。


      3nginx配置

      编辑配置文件:nginx.conf ,下面列出目前用到的一些配置,其他的还在研究中

      1.下面这张图是根据自己理解画的,可能不完整或者有不足。

      2.打开配置文件:vim nginx.conf,配置如下


      #nginx 用户组
      user  nobody;
      #启动的nginx 进程数
      worker_processes  1;
      #nginx日志
      error_log  logs/error.log;
      error_log  logs/error.log  notice;
      error_log  logs/error.log  info;

      events {
         use epoll;# epoll Linux 下性能最好的event模式
          worker_connections  1024;
      }
      http {
          include       mime.types;
          default_type  application/octet-stream;
      #日志格式
          log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                            '"$status" $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';
          sendfile        on;
            keepalive_timeout  65;
      upstream bap {
      server 127.0.0.1:8082weight=20; #还有其他参数,暂时先不说明
      server 127.0.0.1:8081 weight=10;

        }

          server {
              listen       8088;
              server_name  192.168.90.181:8088;

              charset utf-8;

              #access_log  logs/host.access.log  main;
      location ~ ^/NginxStatus/ {
           stub_status on; #Nginx 状态监控配置
           access_log off;
        }

              #location1 / {
               #   root   html;
              #    index  index.html index.htm;
              location / {
                  proxy_pass      http://bap/;
                  proxy_set_header  X-Real-IP  $remote_addr;
                  client_max_body_size  100m;
              }
              error_page   500 502 503 504  /50x.html;
              location = /50x.html {
                  root   html;
              }
      }
      q
      3).配置好后,启动:

      /usr/local/nginx/sbin/nginx
      4.测试验证:
      在浏览器中输入,192.168.90.181:8088  ok,环境启动好了(预先在服务器上安装了两个BAP的环境),登录,正常。停掉其中任一台BAP环境,继续操作,没有问题。

      4、动静态页面分离
      1.静态页面处理
      通过正则表达式,我们可让 Nginx 识别出各种静态文件,例如 images 路径下的所有请求可以写为:

      location ~ ^/images/ {
          root /opt/webapp/images;
      }

      而下面的配置则定义了几种文件类型的请求处理方式。

      location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|ico|css|js|txt)$ {
          root /opt/webapp;
          expires 24h;
      }

      对于例如图片、静态 HTML 文件、js 脚本文件和 css 样式文件等,我们希望 Nginx 直接处理并返回给浏览器,这样可以大大的加快网页浏览时的速度。因此对于这类文件我们需要通过 root 指令来指定文件的存放路径,同时因为这类文件并不常修改,通过 expires 指令来控制其在浏览器的缓存,以减少不必要的请求 

      2.动态页面处理

      location / {
          proxy_pass        http://localhost:8080;
          proxy_set_header  X-Real-IP  $remote_addr;
      }


      上面的配置(最简单的),通过proxy_pass 指令传送给后端的服务器(virgo)来处理动态请求。

      5、负载均衡
      # ip_hash


      upstream bap {
      server 127.0.0.1:8082 weight=20; #还有其他参数,暂时先不说明
      server 127.0.0.1:8081 weight=10;
        }

      Weight --权重

      ip_hash--ip_hash无法实现负载均衡,而且后端服务器设置的权重将不起作用。那么ip_hash作用是什么呢?加上ip_hash可以保证一台客户端发送到请求始终被分配到同一后端服务器上。避免session失效。

      6、监控


      配置
      下面信息可以做到nginx的后台监控
      location ~ ^/NginxStatus/ {
           stub_status on; #Nginx 状态监控配置
           access_log off;
        }
      监控到的内容包括:
      当前nginx正处理的活动连接数
      处理总数,成功多少,失败多少
      l nginx 读取到客户端的 Header 信息数
      l nginx 返回给客户端的 Header 信息

      7、缓存(需要在网上下载依赖包,比较麻烦,还没有搞)

      8、其他深入研究,留待研究后再交流

      PS:发现word上画的图在这里都显示不出来,只好去掉了;样式真难搞,土了点 

    5. 常见liunx命令(个人总结)

      2012-05-22 09:43:05


      本文档适合初初学者,通过本文档,可以简单用命令操作liunx系统;

      一.系统基础操作命令:

      1、cd命令:进入某个目录

      cd /usr/local/tomcat/   --进入tomcat目录下,请注意区分 usr前面是否有‘/;

      2、ls / ll / ls -a 命令:查看当前目录下有哪些文件

      上述命令自己试一下就知道区别了,很简单的

      3、mkdir命令:新建目录

      mkdir /usr/local/test   --/usr/local/目录下新建test目录

      cd /usr/local/   mkdir test1   --进到local目录下,在当前目录下新建test1 目录

      4、touch命令:新建文件

      touch /usr/local/test/file.sh --/usr/local/test目录下新建file.sh文件

      5、cp命令:复制目录或者文件

      cp /usr/local/test/file.sh  /usr/local/test1/  --把文件file.shtest目录复制到test1目录下

      6、mv命令:复制目录或者文件

      mv  /usr/local/test/file.sh  /usr/local/test1/  --把文件file.shtest目录移动到test1目录下

      7...

      二.文档基本操作命令

      1、打开一个文件

      vi /usr/local/test/file.sh

      2、移动光标

      向上移动鼠标光标

      向下移动鼠标光标

      向左移动鼠标光标

      向右移动鼠标光标

      3、编辑文档

      在光标所在字符前面开始编辑;在光标所在字符后面开始编辑;新起一行编辑。

      ESC:退出编辑状态;在退出编辑状态情况下可以做下面几种操作

      :q 不保存退出文档;  :q!不保存强制退出文档;

      :wq 保存退出文档;  :wq!保存强制退出文档;

      还原编辑过的内容

      在文档中查询

      /test   在文档中查询test字符串   按向下查找相同的字符串

      PSvi下不支持小键盘

      鼠标光标移动也可以用键盘上移动键

      4、对于时时变化的文档,我们要查看最新的内容可以用下面的命令

      tailf /usr/local/tomcat/log/log.log

      5、echo命令

      echo "" > /usr/local/tomcat/log/log.log  --清空文档内容,在清空历史日志信息比较常用

      echo "this is new low" > /usr/local/tomcat/log/log.log  --log.log文档中写人:this is new low内容

      其他,比如在文件特定地方追加内容,自己百度一下

      三.服务器相关命令

      tomcat服务为例,讲几个常见的命令:

      1、查看tomcat是否启动:

      ps -ef |grep tomcat  或者 ps -ef |grep java   或者 ps -aux |grep tomcat

      2、启动tomcat

      /usr/local/tomcat/bin/startup.sh &  加上“&”表示从后台启动

      3、停止tomcat

      一般是直接kill掉进程:kill -9 *** ; "***" 可以通过ps -ef |grep tomcat 查到的进程号

      4、其他后续完善

      学会上面命令,再加上举一反三,估计日常对liunx的基础操作就差不多了,下一讲简单介绍各种服务的安装等。

    6. 消息服务器相关记忆:

      2012-05-11 14:47:59

      1.启动mq:/usr/local/activemq/bin/activemq-admin start

      2.Mq访问url:http://192.168.90.183:8161/admin/topics.jsp 

      3.配置邮件,pandion。短信:vim /usr/local/etsender/webapps/etsender/WEB-INF/classes/sender.properties

      4.登录etsender:用户名:密码在 sender.properties文件中配置

      5.问题:

      .war包一定要修改war包里面的,不要修改解压的

      邮件设置发送者要管理员

      Mq最先启动,etsender,和环境再启动


      PS:service iptables stop

961/512345>
Open Toolbar