精华内容
下载资源
问答
  • BHO--嵌入资源管理器窗口

    千次阅读 2015-05-20 11:25:35
    添加子窗口,使插件窗口与资源管理器的文件列表窗口共同拆分右侧窗口。 二. 技术实现 1. 创建程序 新建ATL程序,去除attributed选项(如果有)。   2. 添加方法 添加简单ATL对象MyBar,勾选Iobjec

    参考了别人提供的方法,自己补充完整了一些,就算作翻译吧。

    资源管理器嵌入插件实现说明

    一.           核心思想

    添加子窗口,使插件窗口与资源管理器的文件列表窗口共同拆分右侧窗口。

    二.           技术实现

    1.     创建程序

    新建ATL程序,去除attributed选项(如果有)。

     

    2.     添加方法

    添加简单ATL对象MyBar,勾选IobjectWithSite。

    .h文件中添加成员变量

    CComQIPtr<IWebBrowser2> mWebBrowser2;

    CComPtr<IConnectionPoint>m_spWebBrowser;

    DWORD mCookie;

    IDispatch *m_pdisp;

    HWND m_hWndShellView;//文件列表控件指针

    HWND m_hWndShellViewParent;//文件列表控件父窗口指针

    TCHARm_CurrDir[MAX_PATH];//当前文件夹路径

    HWND m_hOldWndShellViewParent; // 记录上一次父窗口句柄

     

    为MyBar对象添加SetSite方法:STDMETHOD(SetSite)(IUnknown *pUnkSite);

    该方法在BHO对象载入的时候会调用一次,这里可以保存Iunknown指针、判断是不是资源管理器在载入、建立事件响应连接点(用于接收浏览器消息)。

    STDMETHODIMPCMyBar::SetSite(IUnknown *pUnkSite)

    {

           if (pUnkSite)

           {

                  pUnkSite->QueryInterface(IID_IDispatch,(void**)&m_pdisp);

                  pUnkSite->QueryInterface(IID_IWebBrowser2,(void **)&mWebBrowser2);

                  //Receives the connection point for WebBrowser events

                  CComQIPtr<IConnectionPointContainer,&IID_IConnectionPointContainer> spCPC(mWebBrowser2);

                  spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&m_spWebBrowser);

                  //Pass the event handlers to the container

                  m_spWebBrowser->Advise(reinterpret_cast<IDispatch*>(this),&mCookie);

     

                  return S_OK;

           }

           return E_FAIL;

    }

    添加invoke响应

    STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid,

                  WORD wFlags, DISPPARAMS *pDispParams,

                  VARIANT * pvarResult,EXCEPINFO *pexcepinfo,

                  UINT * puArgErr);

     

    STDMETHODIMPCHello::Invoke(DISPID dispidMember,REFIID riid, LCID lcid,

                                                       WORDwFlags, DISPPARAMS * pDispParams,

                                                       VARIANT * pvarResult,EXCEPINFO * pexcepinfo,

                                                       UINT * puArgErr)

    {

           USES_CONVERSION;

     

           if(!pDispParams)

                  returnE_INVALIDARG;

     

           switch(dispidMember)

           {

           caseDISPID_BEFORENAVIGATE2 :

                  break;

           caseDISPID_NAVIGATECOMPLETE2:

                  break;

           caseDISPID_DOCUMENTCOMPLETE: //完成打开文件夹时收到的消息,注意会收到2

                  break;

           caseDISPID_DOWNLOADBEGIN:

                  break;

           caseDISPID_DOWNLOADCOMPLETE:

                  break;

           caseDISPID_NEWWINDOW2:

                  break;

           caseDISPID_WINDOWREGISTERED:

                  break;

           caseDISPID_ONQUIT: //关闭浏览器收到的消息

                  break;

           default:

                  break;

           }

     

           returnS_OK;

    }

     

     

     

    获取资源管理器窗口信息

    添加一个成员函数,来实现资源管理器窗口信息的获取工作。

    这个函数,最好在收到DISPID_DOCUMENTCOMPLETE消息时调用。

    小提示:每次点击文件夹,进入不同路径时,都会响应DISPID_DOCUMENTCOMPLETE消息,且之前的窗口被销毁(资源管理器右侧文件列表窗口及其父窗口),创建新的窗口。

    通过左侧导航窗口,反复点击同一个节点,即反复显示同一个路径,也会响应DISPID_DOCUMENTCOMPLETE消息,但窗口不被销毁。

     

    void HwDISPID_DOCUMENTCOMPLETE();

    void CMyBar::HwDISPID_DOCUMENTCOMPLETE()

    {

           // DISPID_DOCUMENTCOMPLETE: 完成打开文件夹时收到的消息,注意会收到二次

           // 我们在第二次消息时做处理,如果第一次消息时做处理,会导致explorer闪退(原因暂时不明,可能和父窗口句柄有关).

           ……// 添加条件处理,不满足条件的,则返回。

     

           IWebBrowserApp*pwba;

           if(SUCCEEDED(m_pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba)))

           {

                  IServiceProvider*psp;

                  if(SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp)))

                  {

                         IShellBrowser*psb;

                         if(SUCCEEDED(psp->QueryService(SID_STopLevelBrowser,

                                IID_IShellBrowser,(void**)&psb)))

                         {

                                IShellView*psv;

                                if(SUCCEEDED(psb->QueryActiveShellView(&psv)))

                                {

                                       psv->GetWindow(&m_hWndShellView);//保存shellview句柄

                                       m_hWndShellViewParent= GetParent(m_hWndShellView);//保存shellview父窗口句柄

     

                                       IFolderView*pfv;

                                       if(SUCCEEDED(psv->QueryInterface(IID_IFolderView,

                                              (void**)&pfv)))

                                       { 

                                              IPersistFolder2*ppf2;

                                              if(SUCCEEDED(pfv->GetFolder(IID_IPersistFolder2,

                                                     (void**)&ppf2)))

                                              {

                                                     LPITEMIDLISTpidlFolder;

                                                     if(SUCCEEDED(ppf2->GetCurFolder(&pidlFolder)))

                                                     {

                                                            if(SHGetPathFromIDList(pidlFolder, m_CurrDir)) //保存当前窗口路径

                                                            {

                                                            }

                                                            CoTaskMemFree(pidlFolder);

                                                     }

                                                     ppf2->Release();

                                              }

                                              pfv->Release();

                                       }

                                       psv->Release();

                                }

                                psb->Release();

                         }

                         psp->Release();

                  }

                  pwba->Release();

           }

     

           // 窗口切换或新打开一个explorer时,才创建插件窗口,反复显示同一个路径窗口时,不创建,否则会闪退。

           // 窗口切换或新打开explorer时,句柄会变化。

           if(m_hWndShellViewParent!= m_hOldWndShellViewParent)

           {

                  …….//调用创建插件窗口函数,也可自行添加条件,设定某些路径下才创建显示插件。

                 

                  m_hOldWndShellViewParent= m_hWndShellViewParent;

           }

    }

     

     

    创建插件窗口

    在ATL项目中,添加dlg资源,设置style为child,其它属性根据需求进行设定,我都设置为false。

    添加成员函数创建窗口。

    小提示:如果创建的dlg类,是继承自CDialog,在使用时,先调用一句AFX_MANAGE_STATE(AfxGetStaticModuleState( ));防止出错。

     

    void InitBar();

    void CMyBar::InitBar()

    {

           AFX_MANAGE_STATE(AfxGetStaticModuleState());

           //m_hWndShellView的父窗口作为父窗口,当切换目录时会自动销毁窗口

           m_InfoBar = new CMyBarDlg;

           m_InfoBar->Create(IDD_MyBarDlg,CWnd::FromHandle(m_hWndShellViewParent));

     

    //可以调用movewindow调整我们的插件与资源管理器文件列表窗口的位置关系。

           CRect ParentRect;

           GetWindowRect(m_hWndShellViewParent,ParentRect);

     

           MoveWindow(m_hWndShellView,0,30,abs(ParentRect.Width()),abs(ParentRect.Height()),TRUE);

           MoveWindow(m_InfoBar->GetSafeHwnd(),0,0,abs(ParentRect.Width()),30,TRUE);

           ExchangeWndProc();

    }

     

    使插件响应资源管理器窗口的变化

    我们可以通过函数替换的方法,替换窗口过程函数,使得插件窗口可以响应到资源管理器窗口的变化,从而跟随改变窗口大小。

    添加成员函数:

    voidExchangeWndProc();

    voidCHwDocBar::ExchangeWndProc()

    {

           // 替换窗口过程函数

           SetProp(m_hWndShellView,_T("MyBarObj"),m_InfoBar);//保存对话框句柄到文件列表控件的属性表中

           WNDPROC oldWndProc =(WNDPROC)::GetWindowLong(m_hWndShellView, GWL_WNDPROC);//获取原窗口过程

           SetProp(m_hWndShellView, _T("MyPROPNAME_OLDPROC"),oldWndProc);//保存原窗口过程到文件列表控件的属性表中

           SetWindowLong((HWND)m_hWndShellView,GWL_WNDPROC, (LONG)BrowserWndProc);//替换窗口过程

    }

     

     

    实现我们的窗口过程函数:

    staticLRESULT CALLBACK BrowserWndProc(HWND hWnd,

                  UINT uMsg,

                  WPARAM wParam,

            LPARAMlParam);

    LRESULTCALLBACK CHwDocBar::BrowserWndProc(HWND hWnd,     //handle to window

                                                                          UINTuMsg,      //message identifier

                                                                          WPARAMwParam,  //first message parameter

                                                                          LPARAMlParam)  //second message parameter

    {

           LRESULT result = NULL;

           WNDPROC pfnOldWndProc = (WNDPROC)::GetProp(hWnd,_T("MyPROPNAME_OLDPROC"));//读出原窗口过程

           CHwDocBarDlg *dlg = (CHwDocBarDlg*)::GetProp(hWnd,_T("MyBarObj"));//读出对话框句柄

           switch(uMsg)

           {

           case WM_SIZE:

                  {

                         if (dlg != NULL)

                         {

                                ::MoveWindow(dlg->m_hWnd,0, 0, LOWORD(lParam), 30, TRUE);//控制对话框宽度

                         }

                         CallWindowProc(pfnOldWndProc,hWnd, uMsg, wParam, lParam);//调用原窗口过程

                  }

                  break;

     

           case WM_WINDOWPOSCHANGED:

           case WM_WINDOWPOSCHANGING:

                  {

                         LPWINDOWPOS pPos =(LPWINDOWPOS)lParam;

                         pPos->cy -= 30;

                         CallWindowProc(pfnOldWndProc,hWnd, uMsg, wParam, (LPARAM)pPos);//调用原窗口过程

                  }

                  break;

     

           default:

                  returnCallWindowProc(pfnOldWndProc, hWnd, uMsg, wParam, lParam);//调用原窗口过程

           }

           return result;

    }

    3.     注册

    打开我们创建的ATL对象MyBar的rgs文件。

    在后面加上BHO的注册信息。

    其中的ForceRemove后的一串编号,换成自己插件的CLSID。

    HKLM

    {

           NoRemove SOFTWARE

           {

                  NoRemove Microsoft

                  {

                         NoRemove Windows

                         {

                                NoRemoveCurrentVersion

                                {

                                       NoRemoveExplorer

                                       {

                                              NoRemove'Browser Helper Objects'

                                              {

                                                     ForceRemove'{1B69C6B6-01E4-443B-8F18-F8DB9AEC6D65}'

                                              }

                                       }

                                }

                         }

                  }

           }

    }

     

     

    展开全文
  • 重启windows资源管理器命令

    千次阅读 2020-08-24 21:55:19
    关闭windows资源管理器,推荐这个 taskkill /f /im explorer.exe 强制终止某个进程,pid为11196 taskkill /pid 11196 /f 控制台中,输入如下命令,启动windows资源管理器 explorer.exe 查找exp开头的程序名称 ...

    按windows键+R进入输入cmd,在控制台中输入下面命令
    关闭windows资源管理器,推荐这个
    taskkill /f /im explorer.exe

    强制终止某个进程,pid为11196
    taskkill /pid 11196 /f

    控制台中,输入如下命令,启动windows资源管理器
    explorer.exe

    查找exp开头的程序名称
    tasklist /m exp*

    查看进程列表,包含pid
    tasklist

    强制关闭进程和有关的子进程,慎用,执行了很多都用不起了,黑屏了
    /t是关闭包括子进程
    taskkill /f /im explorer.exe /t

    taskkill命令参考:

    C:\Users\10717>taskkill -?
    
    TASKKILL [/S system [/U username [/P [password]]]]
             { [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]
    
    描述:
        使用该工具按照进程 ID (PID) 或映像名称终止任务。
    
    参数列表:
        /S    system           指定要连接的远程系统。
    
        /U    [domain\]user    指定应该在哪个用户上下文执行这个命令。
    
        /P    [password]       为提供的用户上下文指定密码。如果忽略,提示
                               输入。
    
        /FI   filter           应用筛选器以选择一组任务。
                               允许使用 "*"。例如,映像名称 eq acme*
    
        /PID  processid        指定要终止的进程的 PID。
                               使用 TaskList 取得 PID。
    
        /IM   imagename        指定要终止的进程的映像名称。通配符 '*'可用来
                               指定所有任务或映像名称。
    
        /T                     终止指定的进程和由它启用的子进程。
    
        /F                     指定强制终止进程。
    
        /?                     显示帮助消息。
    
    筛选器:
        筛选器名      有效运算符                有效值
        -----------   ---------------           -------------------------
        STATUS        eq, ne                    RUNNING |
                                                NOT RESPONDING | UNKNOWN
        IMAGENAME     eq, ne                    映像名称
        PID           eq, ne, gt, lt, ge, le    PID 值
        SESSION       eq, ne, gt, lt, ge, le    会话编号。
        CPUTIME       eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                                hh:mm:ss。
                                                hh - 时,
                                                mm - 分,ss - 秒
        MEMUSAGE      eq, ne, gt, lt, ge, le    内存使用量,单位为 KB
        USERNAME      eq, ne                    用户名,格式为 [domain\]user
        MODULES       eq, ne                    DLL 名称
        SERVICES      eq, ne                    服务名称
        WINDOWTITLE   eq, ne                    窗口标题
    
        说明
        ----
        1) 只有在应用筛选器的情况下,/IM 切换才能使用通配符 '*'。
        2) 远程进程总是要强行 (/F) 终止。
        3) 当指定远程机器时,不支持 "WINDOWTITLE""STATUS" 筛选器。
    
    例如:
        TASKKILL /IM notepad.exe
        TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
        TASKKILL /F /IM cmd.exe /T
        TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
        TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
        TASKKILL /S system /U 域\用户名 /FI "用户名 ne NT*" /IM *
        TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"
    

    创建批处理文件,比如:重启winodws资源管理器.bat
    重启原理:先关闭资源管理器,然后再启动。文件中命令,用记事本编辑:

    rem @echo off
    taskkill /f /im explorer.exe
    explorer.exe
    
    
    展开全文
  • Clover 是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能。 方便的 Tab 页功能 要掌握功能强大,操作简单的标签页,只需记住Ctrl+T新开页面,Ctrl+W关闭页面,Ctrl+Tab...

    为您的 Windows Explorer 插上翅膀!

    Clover 是 Windows Explorer 资源管理器的一个扩展,为其增加类似谷歌 Chrome 浏览器的多标签页功能。

    方便的 Tab 页功能

    要掌握功能强大,操作简单的标签页,只需记住Ctrl+T新开页面,Ctrl+W关闭页面,Ctrl+Tab切换页面,工作效率提高何止一倍!

    下载链接:http://cn.ejie.me

     

    展开全文
  • Oracle资源管理器在HIS系统中的应用

    千次阅读 2014-03-20 17:02:15
    导致整个HIS系统的操作变慢甚至影响正常业务使用的情况,其实这是典型的服务器资源争用和等待的案例,如何合理的分配和管理有限的服务器资源,让更重要的业务更充分的利用资源,这是本文Oracle资源管理所实现的功能...

    【摘要】系统管理员是否遇到过执行某个大数据量统计报表查询或者进行全库RMAN备份的时候,导致整个HIS系统的操作变慢甚至影响正常业务使用的情况,其实这是典型的服务器资源争用和等待的案例,如何合理的分配和管理有限的服务器资源,让更重要的业务更充分的利用资源,这是本文Oracle资源管理所实现的功能。

    关键词:Oracle,资源管理

    1.  前言

    众所周知,业务系统的任何操作都需要消耗服务器资源,当一个服务器部署完成后,其总的可利用资源是一个有限值,所有的业务操作资源消耗都需要在这个范围内进行分配,如果同一时间业务对资源的消耗超过了服务器资源供给,势必会出现资源争用和等待,更为严重的时候,这个时候前台应用最直观的表现就是’慢’,更严重的后果这种争用和等待可能导致整个服务器性能急剧下降,出现性能问题,甚至导致服务器宕机。

    最近几年,中联用户随着业务量增大和信息系统应用深入,对服务器的资源需求也越来越大,医院除了加大硬件投入逐步提高服务器的性能,增加服务器资源外,对资源的管理和分配完全依赖于操作系统的动态适应,这势必带来一些不合理的情况,如果让这些资源的管理和分配更加合理,这也是信息系统管理值得思考的问题。

    1.1.          影响HIS系统的资源

    资源是一个比较笼统的概念,它指可进行处理以更改应用程序行为的计算系统的任何方面。因此可以说资源就是应用程序隐式或显式请求的功能,如果拒绝或约束了此类功能,则应用程序就会无法执行或者变慢,例如是当服务器进程数很多时,操作系统进程和数据库服务进程间的来回切换会导致CPU占用率或内存使用率高,这时候整个服务器反应就会变慢,这就是我们常说的资源消耗。

    ZLHIS系统是一个复杂的业务应用系统,其依托于Oracle数据库部署在服务器上,因此服务器上任何一个对HIS系统的运行起到至关重要的影响都可以说是HIS系统的资源,这类资源可以简单的分为硬件和非硬件两类,我们这里说得资源特别指非硬件类,比较常见有CPU使用率、内存消耗、IO操作以及网络等等。这些资源相对独立又互相关联,任何一点出现瓶颈都可能影响整个HIS系统业务的运行。

    HIS系统的每个会话操作可以定义为一个‘业务’,整个HIS系统是一个业务系统的集合,其中的每个业务生命周期内会对资源的总体需求是不同的,而且这种需求也不是平均,可能某个时间点特别需要资源,其它时间又相对资源的需求不是很强烈,如下图是某三甲医院整点CPU使用率的采样,从中可以大致看出一天内(24小时)HIS系统对CPU资源的需求概况。


    图1:某医院一天CPU使用率采样

    从上图可以看到HIS系统对CPU资源的需求是波动的,同样的道理对其它资源如内存、IO操作需求也是一样,都不会是平稳不变,而是根据业务操作的不同进行波动,这些业务的重要程度各不相同,比如我们最看重的是窗口业务,如门诊收费、住院结账、记账、医嘱发送等,这些业务直接影响医院医疗效率和收入,应该保证有最充足的资源获取,而另外一些业务,如数据统计、数据备份、后勤业务等重要程度相对偏低,但是往往其对资源的消耗又比较大,这样就产生了一些矛盾,如果这些业务同时进行,势必会影响重要业务对资源的获取,如何让最重要的业务有充足的资源使用、其它业务的运行不对其资源造成影响,让资源的利用尽可能的平稳,合理有效的分配和利用资源,就是资源管理所要达到的目的。

    1.2.          常用的资源管理方法

    操作系统对资源的分配和回收是完全动态的,取决于业务请求的先后顺序,操作系统会尽可能的满足请求的资源,一旦资源被先请求的业务占用,后面的业务在获取资源不充足的情况下,只有等待之前的业务释放资源。这就会出现两个问题:1.业务请求的资源过多,将资源耗尽;2.资源被占用,重要业务无法获取资源,只有等待;以上两种情况都是我们不想看到的,但是操作系统又无法避免,这就需要管理员对资源进行管理,目前医院常见的管理方式有以下几种:

    人为计划管理

    这是最简单、最直观的一种管理方式,把对资源消耗多、重要性偏低的业务放在相对空闲的时间段进行,如系统备份、费用汇总表、数据采样等,这些操作对资源的需求高、但是时效性要求相对低,一般情况下医院都把这些操作放在晚上通过计划任务进行,因为对医院来说晚上常规业务如收费、记账、医嘱等业务量比较小,这时候空闲资源相对较多,能够满足备份操作都业务的资源需求,同时这些操作对常规业务的影响在这个时间段也相对较少。

    第三方软件管理

    现在虚拟化技术越来越多的得到应用,通过虚拟化软件,能够把多台服务器资源进行整合,达到资源共享的目的,类似的软件比较多,比较常见的如VMware vSphere虚拟化管理软件,其就是通过虚拟化技术,把多个服务器的资源整合为一个资源池,所有的业务操作所需的资源都是通过资源池进行管理和分配,其能够根据业务划分和资源的调度对资源进行合理的分配,达到合理利用,这也是现在比较推崇的一种管理模式。

    概要文件资源限制

    除了上面的两种方式,Oracle还有个概要文件,其可以对指定的用户连接操作的资源进行限制,如下图:


    通过概要文件,限制非重点业务用户对资源的使用,也就间接控制了资源的分配,从而让更重要的业务优先和最大程度的使用资源。

    1.3.          存在那些问题

    这些常见的资源管理方式其都能对服务器资源进行一定的管理和分配,但是针对HIS服务器特有的业务环境,其也存在一些显而易见的问题,主要表现在以下几点:

    管理局限

    虽然有些业务可以通过人为的计划调动进行时段的分配,但是另外一些业务如报表查询统计、瞬时的大数据过滤、频繁的轮询查询等,这些没有特定的操作规律,根本无法通过用户方式进行控制,还有就是针对一些Oracle数据库的特有资源,例如:并行执行的服务数和活动的会话数等,这些管理都无法实现。

    低效管理

    利用操作系统管理调度数据库服务本身就占用一定的资源,最直接的其会占用CPU资源,而这些个资源是非常有限,而且效率还非常的低,当出现资源瓶颈后从而导致保持闩锁的数据库服务器进程会暂停,而且其从发现资源出现瓶颈到进行管理重新分配,这个时间过程也会比较长,在三甲医院高峰期窗口关键业务中,这样的业务暂停和等待是不可接受的。

    成本过高

    虚拟化虽然能够对业务的动态操作进行管理,但是其高昂软件的价格和部署成本对医院来说确实接受起来非常困难,另外虚拟化资源间相互的影响也非常大,常常出现‘木桶效应’,这也是为什么很多Oltp系统不愿意构建在虚拟化环境中的原因。

    Oracle 资源管理(Oracle DatabaseResource Manager,简称DBRM)通过它的管理把硬件等资源的分配交给数据库服务器本身来解决以上问题,在某个数据库环境中,可能同时存在着多个用户请求数据库服务,并且他们所要完成的任务优先级不同,那么我们就应该区别对待这些会话请求。Oracle RMDB能让你根据各个会话的应用属性,将它们分组,然后为每组分配不同的数据库资源,最大化提高你的数据库应用性能。

    2.  oracle资源管理(RMDB)

    2.1.          概述和特点

    Oracle 资源管理用于管理混合的工作量,控制系统的性能,与通常只通过操作系统管理资源相比,可以对计算机资源的分配进行更多的控制,其最大的特点就是通过分组模式,把会话按照一定优先级进行分组,分成若干的用户组,再以组为单位对其进行资源的分配和限制,例如下图把HIS用户根据操作的业务属性的不同分为窗口用户组、医技用户组、后勤用户组,再结合其业务特点和重要性按优先级和份额对资源进行分配,如下图:


    当然这样的组分配资源的规则也不会一成不变,通过控制数据库内部的执行调度,达到控制资源在各个会话之间的动态分布,确保资源分布与业务的实际需求相匹配。因此利用数据库资源管理器,无论系统的负载和用户的数量如何,都可以保证用户组的处理资源达到要求,满足业务的需求,资源管理是怎么实现这种动态的分配的呢?其主要通过资源计划和资源计划指令实现,通过其同资源使用者组的配合,达到灵活的动态管理资源的目的,这三者的关系如下:


    “资源使用者组”:定义了具有相似的系统或数据库资源使用需求的一组用户或会话。

    “资源计划指令”:指定如何在使用者组或子计划之间共享某个特定资源。通过计划指令,可以将资源使用者组及子计划与特定的资源计划关联起来。

    “资源计划”:指定如何在各个资源使用者组之间分配资源。使用数据库资源管理器还可以在计划中创建计划,这称为“子计划”。

     

    其中资源计划指令和资源计划共同组成了对资源用户组的“资源分配方法”,确定分配任何特定资源时使用的策略。

    2.2.          资源管理的内容

    Oracle资源管理器相对于其它方式的资源管理,除了管理服务器资源外,还能够对数据库内部的资源进行管理,这一点就大大增强了其管理能力,总结下来其可以管理数据库和操作系统资源主要包括如下:

    1.        操作系统资源:

    • CPU 使用率:可以指定在使用者组和子计划之间如何分配CPU 资源。

    •I/O限制: Oracle资源管理器通过执行一个I/O密集的只读工作量来评估数据库服务器的存储系统的I/O性能,这个评估操作应该在非业务高峰期间执行,以确保校准不影响生产的工作量,以及生产的工作量对校准结果的影响,用户组可以基于I/O阀值(最大请求数或M字节)进行资源组自动切换。

    • 活动会话数限制:可以限制使用者组或子计划的并发活动会话数。如果某个组的会话数超过了允许的最大值,则新的会话将放在队列中,等待某个活动会话完成。

    2.        数据库资源:

    • 并行度限制:Oracle的并行机制可以把一个大操作分割成若干小操作进行,从而提升运行速度,但是并行本身也是一种资源消耗, Oracle资源管理可以控制使用者组中任何操作的最大并行度,对这种资源消耗进行限制。

    • 还原池:可以控制使用者组或子计划能够生成的还原操作的总数。当还原空间的总数超过UNDO_POOL指定的数量时,在同一组中其它会话释放还原空间或者增大使用者组的还原池之前,不允许执行任何新的INSERT、UPDATE或DELETE命令。如果使用者组在执行DML 语句时超过了限额,则中止操作并返回错误。此时仍可进行查询,即便使用者组已经超出其还原阈值。

    3.        时间资源:

    • 执行时间限制:可以指定操作所允许的最大执行时间。Oracle DB 使用基于成本的优化程序统计信息来估计操作所需的时间。如果耗时超过了所允许的最大时间(MAX_EST_EXEC_TIME),则操作返回错误并且不会启动。如果资源使用者组有多个指定了MAX_EST_EXEC_TIME的计划指令,则资源管理器将选择所有传入值中限制性最强的那个值。

    • 空闲时间限制:可以指定会话的空闲时间,超过该时间后将终止会话(MAX_IDLE_TIME)。你可以进一步限制资源管理器,使其只终止阻止其它会话的会话(MAX_IDLE_TIME_BLOCKER)。

    4.        用户组资源:

    • 使用者组切换:初始使用者组是在会话刚登录时所属的组。顶层调用被定义为将整个PL/SQL 块视为一个调用,或类似地,将客户机单独发出的SQL 语句视为单独调用。在中间层服务器实施会话共享的三层应用模型中,此功能的优势是最显而易见的。在这种情况下,中间层在为某个最终用户执行一个调用后,可使用相同的会话为另一个最终用户执行调用。因此,工作的分界线实际上为调用,并且上一个最终用户的操作不会影响下一个最终用户。可以创建一个计划指令,使资源管理器在顶层调用结束时将用户自动切换回初始使用者组。

    要想对应用的资源合理的分配和控制,以上的资源管理都不能单一的进行,只有通过合理的搭配,资源间相互配合,才能达到真正的有效管理的目的,而这些组合和配合则需要通过‘资源计划指令’和‘资源计划’实现。

    2.3.          资源管理的具体功能

    Oracle资源管理器就是为Oracle用户分配用户组,然后通过该用户组设置对应的‘资源计划’和‘资源计划指令’,通过其合理的组合,可以实现对资源的灵活控制和管理,结合上面资源管理可以管理的资源,我们来看下Oracle资源管理具体可以实现那些功能:

    1.       资源限制功能:

    可以在系统启动时,限制某些会话请求只分配到最少的进程资源和用户使用上限。

    限制同一组内用户对数据库操作的并行度。

    建立一个活动的会话池。会话池由一组用户活动会话组成,对某一组用户来说,同一时间活动的会话数有特别的数量上限。如果会话池满了,新的会话请求会被放入等待队列,而且你还可以设置一个时间上限,超过这个上限,等待队列会被停止。会话池限制了同一时间活动的会话请求数量,保证了活动的会话请求更快的完成任务。

    限制一个会话的空闲等待时间。

    2.       资源分配功能:

    为不同的用户或应用分配不同的CPU时间。在HIS应用中,门诊业务的CPU使用率的优先级应该最高,任何操作如报表查询、备份等都不能影响门诊业务的使用。

    管理长时间未响应的会话或请求,这些会话或请求往往占用了很多的CPU或I/O资源。这些会话能被自动的结束掉,或者将它们换到其他低级的组去。

    根据不同的资源分配需求,配置不同的模式。你可以动态的改变这些模式,例如,从白天运行模式变到夜间运行模式,而不用重启数据库服务。你还可以通过Oracle调度器来管理模式的改变。

    3.       资源消耗估算:

    Oracle资源控制器还有一个最大的功能就是可以对一些资源消耗进行估算,根据估算结果对用户进行一些控制,从而不必真正在运行过程中发现资源瓶颈,如通过优化器估算请求的运行时间,如果超出了某个限制,Oracle资源管理器会阻止它的请求。

    以上就是Oracle资源管理器能够实现的几大功能,不过要想在实际过程中对HIS应用资源进行合理的管理,我们还要了解这些功能实现的具体细节和方式,以及对它们合理的运用和组合,才能实现真正的有效管理的目的。

    2.4.          资源管理器的组成元素

    我们前面介绍了,Oracle资源管理主要由资源使用组,资源计划和资源计划指令三个部分构成,这也是资源管理构成的三个主要的元素,接下来我们就分别对这三个元素进行介绍。

    资源使用组(Resource Consumer Groups)

    资源使用组是由许多用户会话组成,这些会话有相同的资源使用请求。新创建一个会话时,资源管理器会自动或者根据你的指定把它分配到某个组,你可以对这个组进行资源限制和分配,从而对该组的所有会话进行配置,一个用户可以隶属于多个组,但一个会话同一时间只能隶属于一个组,Oracle资管理器中默认有三类特别的组是系统组,它们不能被修改或删除,它们的名称和所起的作用如下表:

    组名称

    作用

    SYS_GROUP

    所有通过SYS和SYSTEM用户创建的会话的默认组,它可以设置会话资源使用规则。

    DEFAULT_CONSUMER_GROUP

    所有非SYS和SYSTEM用户创建会话的默认组,它可以设置会话资源使用规则,但是不能设置命名资源计划指令。

    OTHER_GROUP

    OTHER_GROUP不能算是一个独立的资源使用者组,准确的说应该算是资源使用组其它原则,当前非活动资源计划的会话都属于该资源使用组,它必须有一个资源计划指令中指定每一个计划。

    除了以上三个系统默认的资源使用组,用户可以根据自己的需要,创建其它符合业务会话需求的资源使用组,这些组可以单独的命名,然后将相关的会话分配到该组中即可。

    资源计划指令(Resource Plan Directives)

     资源计划指令指定了资源计划和使用组之间的映射关系。同时通过存储过程来实现对资源的分配和限制的功能,如可以通过指令给对应的资源使用组分配一定百分比的总的CPU时间,或者限制一个组内最大活动的会话数等,资源计划和资源计划指令间有着一对多的关系,当然为了避免冲突资源计划中不能包含两条相同的资源计划指令,但是它可以包含多个不同资源的分配指令。

    资源计划(Resource Plan)

    包含一系列指令,这些指令决定了每个使用者组的资源使用分配,在一个数据库中,同一段时间内只能启用一个资源计划,但一个资源计划里面可以包含多个子资源计划,每个资源计划都必须包含给OTHER_GROUP分配的指令,如下图就是一个包含子计划的CPU使用率限制资源计划的例子。


     可以看到,‘SALES_TEAM plan’是‘GREAT BREAD plan’子计划,其对应的是‘WHLESALE group’使用组,它的50%CPU的使用率限制是整个资源计划60%的使用限制而定,也就是这里的50%CPU其实最多也就是整个服务器30%CPU的使用率。

    3.  典型的资源管理创建

    那么说了这么多,如何来创建一个人资源管理模型呢?Oracle提供了两种方式,一种是通过EM创建,图形界面,操作直观而且简单,另外就是通过DBMS包创建,这个相对比较麻烦,要对一些参数有所了解才行,下面我们就演示下2种方式创建资源管理的过程。

    3.1.          通过EM创建

    以SYS用户登录数据库的EM,确认连接实例,点击【服务器】,就可以看到资源管理操作选项,如下图



    这里有【入门】、【使用者组】、【使用者组映射】、【计划】、【设置】、【统计信息】6个选项,我们首先点击【入门】选项,这里面对资源管理器的作用和其它5个选择的作用作了简单的说明,如下:


    通过这里的介绍,我们大致知道每个选项的功能,接下来我们就点击【使用者组】开始创建使用者组,点击进去后进入如下主界面,这里面已经有了很多系统初始化创建的使用者组,如AUTO_TASK_CONSUMER_GROUP、BATCH_GROUP等等,这些使用者组的作用在‘说明’列中有简单的介绍,不过我们从中可以看出,资源管理其实默认在数据库创建后就已经在使用,如晚上的统计信息收集、SQL自动调优等,都是建立了资源用户使用组,只是我们日常管理中没有留意而已。


    这里我们点击<创建>按钮,进入资源使用者组创建界面,如下图,当然这里可以选择类似创建或者生成DDL语句创建,这个根据使用者自己的需求选择,在使用者组输入创建组的名称,说明那里对组进行简单的说明,可以把角色添加到该组中,也可以通过把用户添加到该组中,如下


    在允许在该使用者组中运行的用户那里点击<添加>,为该组添加用户,如下


    当然也可以按角色添加,如下


    除了上面在创建使用者组的时候,就通过用户和角色指定那些对象属于这个使用者组之外,还可以通过会话的方式来指定,需要在【使用者组映射】中设置,这里提供了6种映射资源用户的方法。这6种映射方法分别是:

    oracle用户:指定通过某个特定操作系统用户登录到数据库所产生的session属于某个用户组;

    客户机操作系统用户:指定某个特定的客户端计算机名称登录的数据库所产生的session属于某个用户组;

    客户机程序:指定某个应用程序登录到数据库所产生的session属于某个用户组。

    服务:指定通过某个服务名登录到数据库所产生的session属于某个用户组;

    模块:指定通过特定模块登录到数据库所产生的session属于某个用户组;

    模块和操作:指定通过特定模块并执行特定动作登录到数据库所产生的session属于某个用户组。


    我们可以在这里按照HIS系统运行的一定的规则,把对应的会话指定到不同的使用者组中,你可以通过用户,也可以通过机器名称还可以通过模块和操作等等,注意到这里有个【优先级】,就是有可能你设置的条件有冲突的情况,比如U00001用户在住院的机器上登录,如果你通过用户名映射的门诊窗口使用组,通过计算机机器名映射的住院用户组,那这时候就要根据优先级来判断该会话到底是属于那个资源组,默认情况下,用户的优先级是6,客户机的优先级是9,这个时候就要以优先级更高的用户为准。

    对会话进行了资源组的分配,接下来就是要对资源组的资源进行管理,这就需要设置资源计划,我们进入【资源计划】界面,如下:


    点击【创建】,进入资源计划创建界面,添加你想创建的计划的名称和说明,然后就是对资源进行分配,当然首先要对应资源使用者组,默认情况下只有一个系统必须的OTHER_GROUPS,点击【修改】按钮,添加上对应你的资源组,如这里添加我们之前创建的窗口用户组,然后就需要对资源进行分配,【一般信息】这里是对CPU的分配,有2种模式百分比和高级,如下:


    百分比这个比较简单,我们重点讲下高级,如果选择高级,在资源计划中我们一共可以设置8个CPU使用的优先级,级别1为最高,级别8为最低,如下


    注意,在不同级别中CPU的总额不能超过100%。同时,只有在CPU使用率达到100%的时候,这里指定的不同级别所使用的CPU百分值才会生效。也就是说,即使系统完全空闲时,那么Other_Groups的用户登录系统一样也可以使用100%的CPU。而如果当Other_Groups用户在执行操作过程中‘窗口用户组’用户登录数据库,造成系统CPU满负荷运转。那么Oracle会优先为‘窗口用户组’分配CPU,只有当‘窗口用户组’执行完毕后才会为other_group组成员分配CPU。

    拿上面的例子来说,假设‘窗口用户组’消耗了系统的50%,那么‘住院用户组’和‘后勤用户组’就只能使用剩下的50%的资源,然后在这个50%的基础上,再进行分配,也就是分配能使用 40%和10%的CPU资源,如果‘住院用户组’和‘后勤用户组’已经完全使用了这些资源,那么作为下一级LEVEL 3的OTHER_GROUPS将不会获得任何CPU的资源。当‘窗口用户组’、‘住院用户组’和‘后勤用户组’总过只消耗了5%的CPU资源,那么作为下一级LEVEL 2的OTHER_GROUPS将会可以消耗95%的CPU资源。

    换句话说,LEVEL 2所能获得的全部资源就是LEVEL 1所未能使用的那部分资源。

    优先级:LEVEL1 > LEVEL 2 > LEVEL 3……LEVEL N-1>LEVELN

    需要强调的一点是OTHER_GROUPS这个资源用户组。任何一个资源计划必须要包括这个OTHER_GROUPS用户组,如果你的资源计划没有包括这个用户组,那么将会得到一个ORA-07453的错误,要求你必须添加此用户组。这个用户组的作用就是作为一个候选项,当一个没有匹配到任何资源用户组的SESSION连接到数据库的时候会自动的匹配到OTHER_GROUPS下面,按照OTHER_GROUPS的资源限定执行SQL。

    另外一个需要强调的是用户资源限定的生效条件。拿上面的例子来说,当系统的CPU使用率没有达到100%的时候,‘窗口部门资源计划’这个资源计划并不会生效,各个资源用户也不会按照限定来分配CPU的使用。仅仅当CPU的使用率为100%的时候,资源计划才可以发挥功效,来限制各个资源用户组的CPU分配。这点是常常被大家忽略的,一定特别注意下。

    除了CPU的资源分配,还有【并行度】、【会话池】、【还原池】、【阈值】和【空闲时间】的设置,如下为我对‘窗口部门资源计划’的案例资源分配设置情况,整体预览如下:


    在日常管理过程中,如果有EM的话,肯定可以非常直观的看到我们资源管理计划的详细情况,如果没有EM方式,建议大家制作一个如下的表格,可以一目了然的展示当前资源管理的设置情况,如下:

    组或子计划

    CPU资源

    Level 1

    Level 2

    Level 3

    组切换

    最大并行度

    最大会话数

    最大空闲时间

    窗口用户组

     100

     

    终止会话

    1

    100

    600

    住院用户组

     

    80%

    终止会话

    1

    100

    3600

    后勤用户组

     

    20%

     切换到:OTHER_GROUPS

    1

    400

    3600

    OTHER_GROUPS

     

     100

     

    无限制

    无限制

    无限制

    最后就是把该计划激活,这里已启用自动计划切换,是指可以通过oracle内部的作业调动,使数据库在多个资源计划中进行切换,这里要注意,一个时间段oracle只能有一个资源计划为激活状态,当然,该资源计划可以包含若干子计划,这里我们就不再演示,计划的操作非常简单,如下

     

    一个典型的资源管理创建就完成了,我们可以通过查询v$session会话视图,来观察下目前数据库会话属于那个资源组,可以看到U000001按照我们之前的映射,属于窗口用户组,而且其它没有映射的用户,默认会属于OTHER_GROUPS组,如下:


    3.2.          通过DBMS包创建

    除了通过EM创建资源管理以外,还可以通过DBMS_RESOURCE_MANAGER包在命令模式下进行创建,执行这个包的用户必须要有ADMINISTER_RESOURCE_MANAGER权限,这个包常用的功能介绍如下:

    Procedure

    Description

    CREATE_SIMPLE_PLAN

    创建一个简单的资源计划,包含8个使用者组,在一个步骤中完成。这是开始使用Oracle数据库资源管理器最快的方式。

    CREATE_PLAN

    创建一个资源计划,并指定它的分配方法。

    UPDATE_PLAN

    修改一个资源计划

    DELETE_PLAN

    删除资源计划和指令。

    DELETE_PLAN_CASCADE

    删除资源计划和及其它的子计划。

    CREATE_CONSUMER_GROUP

    创建一个用户使用组

    UPDATE_CONSUMER_GROUP

    修改用户使用组

    DELETE_CONSUMER_GROUP

    删除用户使用组

    CREATE_PLAN_DIRECTIVE

    指定资源计划指令,分配资源资源消费者团体或一个计划的子计划。

    UPDATE_PLAN_DIRECTIVE

    修改计划指令

    DELETE_PLAN_DIRECTIVE

    删除计划指令

    CREATE_PENDING_AREA

    创建一个等待区,还可以更改计划模式

    VALIDATE_PENDING_AREA

    验证变更等待区计划模式

    CLEAR_PENDING_AREA

    清除所有未决变更等待区

    SUBMIT_PENDING_AREA

    提交所有更改计划模式

    SWITCH_CONSUMER_GROUP_FOR_SESS

    切换的使用者组特定的会话

    SWITCH_PLAN

    设置当前的资源管理器的计划

    SET_CONSUMER_GROUP_MAPPING

    会话映射到使用者组

    SET_CONSUMER_GROUP_MAPPING_PRI

    建立会话属性映射的优先事项

    从上面的介绍可以看到,如果我们是要建一个最简单的资源管理计划,使用一个CREATE_SIMPLE_PLAN就可以实现,但是这个简单的计划只限制CPU的使用,显然很多时候我们不光要限制CPU还需要限制其它的资源,下面我们就利用包来进创建一个典型的资源管理计划,要想创建资源管理计划,至少要经过下面几个步骤:

    Step 1: 建立一个等待区(pendingarea).

    Step 2: 创建、修改或者删除一个用户使用组

    Step 3: 创建一个资源计划

    Step 4: 创建资源计划指令

    Step 5: 验证等待区(pendingarea

    Step 6: 提交等待区(pendingarea

    这里我们看到有所区别,第一步就是要创建一个等待区(pending area),什么是等待区?等待区是一个暂存区域,您可以创建一个新的资源计划,更新现有计划,或删除一个计划不影响当前正在运行的应用程序。当您创建一个等待区、数据库初始化,然后把现有计划复制到等待区,这样现有计划就可以更新。等待地区做出更改后,您验证等待区域,然后提交。提交后,所有未决变更应用到数据字典,和等待区域清理干净并停用。

    如果您尝试创建、更新或删除一个计划(或创建、更新或删除使用者组或资源计划指令)没有首先创建等待区,就会收到一条错误消息。

    提交等待区域并不激活您所创建的任何新计划;它只是存储新的或更新的计划信息数据字典。另外同一时间您只能创建一个等待区域 ,直到你提交或清除悬而未决的区域或注销。

    第一步:创建一个等待区

    使用CREATE_PENDING_AREA包创建等待区,在plsql执行的命令如下:

    BEGIN

    DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();

    END;

    第二步:创建使用者组

    使用CREATE_CONSUMER_GROUP包创建使用者组,在plsql执行下面的命令,创建一个默认的使用者组(备份用户组),如下:

    BEGIN
    DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP (
       CONSUMER_GROUP => '备份用户组',
       COMMENT        => '该组用户备份时使用');
    END;

    同样的方法可以创建其它如‘窗口用户组’、‘住院用户组’等,如果要修改或者删除使用者组,就需要用到UPDATE_CONSUMER_GROUP和DELETE_CONSUMER_GROUP包,这里就不再单独介绍。

    第三步:创建个资源计划

    使用CREATE_PLAN包创建资源计划,在plsql执行如下命令创建一个‘中联资源管理计划’的资源计划,之前我们用EM创建计划的时候CPU使用率用的是分级法,这里我们用比例法(RATIO),如下:

    BEGIN
    DBMS_RESOURCE_MANAGER.CREATE_PLAN
       (PLAN             => '中联资源管理计划',
        MGMT_MTH         => 'RATIO', 
        COMMENT          => 'HIS系统用户资源管理');
    END;

    同样的如果要修改或者删除资源计划,需要用到UPDATE_PLAN和DELETE_PLAN包,这里也不再单独介绍。

             第四步:创建资源计划指令

    使用CREATE_PLAN_DIRECTIVE程序创建资源计划指示,这个包的参数比较多,这里不多作介绍,有兴趣的可以下来单独研,用户组还是用我们之前创建的用户组,举个简单的例子:

    BEGIN
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE
       (PLAN             => '中联资源管理计划',
        GROUP_OR_SUBPLAN => '窗口用户组', 
        COMMENT          => '窗口用户使用者',
        MGMT_P1          => 50);
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE
       (PLAN             => '中联资源管理计划',
        GROUP_OR_SUBPLAN => '住院用户组', 
        COMMENT          => '住院用户使用者',  
        MGMT_P1          => 20);
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE
       (PLAN             => '中联资源管理计划',
        GROUP_OR_SUBPLAN => '后勤用户组', 
        COMMENT          => '后勤用户使用者',
    MGMT_P1          => 10);
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE
       (PLAN             => '中联资源管理计划',
        GROUP_OR_SUBPLAN => '备份用户组', 
        COMMENT          => '为备份专门提供的资源',
        MGMT_P1          => 10);
    DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE
        (PLAN            => '中联资源管理计划', 
        GROUP_OR_SUBPLAN => 'OTHER_GROUPS',
        COMMENT          => '其它用户',
        MGMT_P1          => 10);
    END;

    这里只对CPU的比例进行了分配,窗口用户组,住院用户组,后勤用户组, 备份用户组,和OTHER_GROUPS分别分配为50:20:10:10:10,如果会话只存在于窗口用户组和住院用户组,CPU分配的比例就是50:20,这只是最简单的分配,如果涉及到其它资源,比如IO、空闲时间这些,就会要求一旦达到阈值资源组切换方式,这里的切换有SWITCH_TIME, SWITCH_IO_MEGABYTES和SWITCH_IO_REQS等一些参数控制,这些比较设置相对比较复杂,这里就不再举例。

    第五步:验证等待区

    通过前面的操作我们就完成了资源管理的创建,之后我们就是要验证创建的资源管理是够有效,这就需要我们进行验证,验证的方法就是在VALIDATE_PENDING_AREA看其是否有效,当然验证也必须遵守以下规则,否则会提示错误:

    l  不包含任何循环的计划。一个循环发生在辅助方案包含一个指令,引用一个计划,计划层次的辅助方案。例如,一个辅助方案不能参考计划。

    l  所有被计划指定的子计划和使用者组必须存在。

    l  所有的计划都必须有计划指示,指出计划或使用者组。

    l  CPU所有的百分比不得超过100。

    l  如果一个计划,目前被用作一个活动实例的高级计划不能被删除。

    除了这些还有一些参数只能出现在使用者组的计划指示中,不能出现在其它资源计划中如:PARALLEL_DEGREE_LIMIT_P1,ACTIVE_SESS_POOL_P1,SWITCH_GROUP等等,具体可以参见Oracle® DatabaseAdministrator's Guide11g Release 1 (11.1)  Creating a Complex Resource Plan,验证的方法很简单,就是执行下面一条命令,如下:

    BEGIN
    DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
    END

    验证完了并没有生效,如果要生效需要提交等待区,然后切换到所创建的资源管理,也是一个包执行以下:

    -----提交等待区
    BEGIN
    DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
    END;
    ----切换资源管理
    BEGIN
    dbms_resource_manager.switch_plan( plan_name => '中联资源管理计划', sid => 'orcl' )
    END;

    最后就是清除等待区,完成整个资源管理的创建。

    BEGIN
    DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
    END;

    这样一个最简单的通过DBMS包的方式创建资源管理的案例就完成了,如果清除了等待区,要对现有的计划进行调整,还需要重新创建等待区。当然真实环境下这样简单的资源管理肯定会有很多问题,我们需要根据具体的业务特性进行分析后进行设置才是真正有效的资源管理。

    4.  资源管理效果案例测试

    前面我们对资源管理的理论知识和创建过程进行了介绍,我们来做几个相对简单的资源(空闲时间、执行时间和并行度)管理测试,展示下资源管理的效果。

    4.1.          空闲时间和执行时间限制

    思路,我们就利用之前创建的用户组,然后分配用户到对用的使用者组中,对该组进行空闲时间和执行时间的限制(60秒),让其中一个用户连接不做任何操作,另外1个用户运行loop.sql脚本,该脚本为死循环脚本,可保持该会话一直处于执行状态,脚本内容如下:

    loop.sql脚本如下:
    declare
     i number;
     j number;
    begin
     i:=0;
     loop
      j :=sqrt(i);
      i :=i+1;
     end loop;
    end;
    / 

    脚本准备好后,接着我们来看下当前激活的资源计划的管理计划情况,我们这里只关注准备做实验的使用组‘窗口用户组’,资源限制如下:

             重点关注红色的几个部分,其中执行时间如果超过60秒,当前会话的用户组就转到‘备份用户组’,设置完成后我们以U000001用户登录数据库,查看下登录会话所属的使用用户组,确认为我们需要的用户组,如下:


             可以看到,接着我们一个不做操作,另外一个执行刚才的死循环脚本,等待60秒后,再次查询这个会话,结果如下:


    我们可以看到60秒后,执行死循环的会话用户组已经切换到‘备份用户组’上,这个切换不会永久性的,当执行完成后,对资源进行了释放,该会话再次执行其它操作,会切换回原来的使用者组,而另外一个没做任何操作的空闲会话貌似没有什么变化,其实不然,我们到这个会话上去操作会提示ORA-02396: 超出最大空闲时间, 请重新连接,如下:


    4.2.          并行度实验

    并行度(parallel)是Oracle数据库的一个特有属性,通过合理的运用可以加快查询、备份、创建对象的效率,当然同时付出消耗资源的代价,如果过分的设置并行度可能会导致资源消耗过多,因此我们又是会对并行度进行限制,如下,我们这里对窗口用户组的并行度就进行了限制,最多只能3个并行:


    以U000001(窗口用户组)用户登录一个会话1执行下列命令,进行并行度为5的查询

    SQL>select /*+parallel(住院费用记录,5) */ * from 住院费用记录;

    在会话2中执行下列命令

    SQL> selectsid,qcsid,degree from v$px_session;

     

    其中sid为从属进程所对应的SID,QCSID为这些从属进程所对应的父SID,DEGREE表示并行度,如果我们以另外一个用户U000002(非窗口用户组),执行同样的查询语句,得到的结果就不一样,如下:


    通过上面的对比我们可以看到,同样是在hints里面指定了5个并行度,但是由于资源管理的限制,前面的在实际执行过程中只能最多3并发度的查询,而后面这个由于不受限制,因此可以按照设置的要求,实现了5个并行度的查询,通过这个事实证明资源管理确实生效。

    5.  可应用于HIS系统的资源管理计划

    通过上面的案例讲解,其实都是以我们ZLHIS系统为基础的资源管理计划设置,当然真实环境不可能这么简单,如果资源管理计划设置不合理,不但不能起到应有的作用,反而会对实际应用造成一定的影响,如何针对我们的HIS系统进行资源管理,那些情况适合资源管理,我们这里也作一定的分析,希望能够大家一些参考。

    5.1.          现有资源和应用评估

    如果一个用户服务器资源非常丰富,应用又非常简单,这时候再用资源管理就是多此一举,如果确实资源有限,并且在某些时候出现了资源瓶颈,这时候就要对资源进行管理,但也要根据资源管理的类型,认真评估下当前服务器在运行环境,做到有的放矢,可以简单的列一个表格进行分析。

    项目

    评估方法

    ZLHIS一般情况

    服务器资源瓶颈

    通过AWR性能报告获取

    根据服务器配置(内存、IO)

    应用分类

    业务分类

    门诊、住院、备份、后勤

    资源消耗大的操作

    业务分析

    统计、备份等

    资源消耗大的时间段

    通过AWR性能报告获取

    上午、月末

    当然这里只是进行了简单的列举,如果要真正、有效和合理的对资源进行控制,使其发挥最佳的效果,还要作更多的分析才行。

    5.2.          典型的HIS资源管理思路

    ZLHIS的应用对资源的消耗还是比较有规律,大部分属于OLTP操作,因此除非设计问题,单个操作对性能的瞬时消耗并不大,但是另一部分操作如查询、过滤等会根据条件的差异对性能的消耗有所需求,这部分就是我们重点关注,一般采用2种方式进行管理:

    Ø  业务划分法:

    这种方式就是我们前面案例采用的方式,根据业务对资源的消耗和需求进行分类,然后根据类别对资源进行管理。

    Ø  时间划分法:

    如果大家仔细观察数据库alert日志记录可以发现,其实11g开始,oracle默认就是启用了资源管理,采用调度的方式,在晚上启用了,如下日志记录的摘要:


    这个自带的资源计划的目的是对后台的一些作业如:统计信息收集、SQL自动优化等资源消耗过大的操作进行管理,其实对于我们ZLHIS系统,道理是一样的,在业务高峰期对一些操作进行管理,避免其对正常业务的影响,这也是一种有效的资源管理方式。

    当然创建资源管理计划以上两种方式都不是孤立的,我们需要有效的组合才能做到最佳的应用效果,下面就以一个典型案例来理解如何合理的构建符合用户需求的资源管理方案。

    案例是这样去年某市级医院进行三甲资格评审,需要收集大量的信息,为此技术人员为用户订制了非常多的统计报表,这些报表都是大范围的数据统计,由于用户存储IO性能一般,在收集过程中,医院反馈HIS程序操作经常卡顿,通过性能报告发现出现大量IO等待,但是这些统计操作一段时间内又无法限制,为了不影响医院正常业务的使用,需要通过资源管理来限制业务高峰期这些资源消耗性统计操作。

    第一步:明确目标

    首先我们要明确我们本次资源管理所要达到的目标,控制资源消耗性报表统计在业务高峰期对HIS系统的影响,这点我们首先就要进行分类,HIS业务操作的优先级肯定是最高、其次我们这里只需要对资源消耗性报表统计这类业务进行控制,首先要明确使用者,然后明确控制的范围,才能使得资源管理真正起到效果,同时对其它业务不产生影响。

    第二步:确定使用者

    前面说了,我们要确定使用者的范围,范围越小,资源管理越有效,同时对其它业务的影响也越小,分析下这次要控制的操作,资源消耗性报表的统计,这些操作肯定只有某些特定用户或者角色才能使用,而且如果能够进一步控制,只有这些特定用户在一些特定的客户端的操作,才可能会执行资源消耗性报表,确定范围后就可以创建资源用户,然后在资源用户组和资源使用者组映射中进行设置。

    资源消耗性统计使用者组

    用户

    角色

    特定客户端

    U00001

    ~

    U00002

    Zl_评审报表

    192.168.4.21

    192.168.4.20

    第三步:控制范围

    这一步就是资源计划的范围,根据资源计划控制的范畴,确定如何对资源进行控制,也就是对资源消耗性报表的特点进行分析,确定阈值指标,同时在确定阈值的过程中确定控制的方式和时间。

    时间范围

    指标

    控制方式

    早上:8~12点

    执行时间:30分钟(估算)

    SQL取消

    IO限制(MB)(物理读*块)

    限制登录会话数:5 sessions

    下午:12点~18点

    执行时间:30分钟(估算)

    切换到OTHER资源使用者组,只限制CPU的使用率

    IO限制(MB)(物理读*块)

    其它时间段

    不限制

    不限制

    这里我们特别讲下时间范围:资源管理计划可以通过oracle的内部调度作业窗口进行控制,确定什么时间段激活,激活持续时间等,通过合理的设置调度,可以让资源管理计划按照设定的要求生效和持续时间,如下:


             通过这样的设置,就可以按时间控制资源管理,使得管理维度更加精细,也更符合实际业务的应用,满足我们控制业务高峰期资源消耗性报表的使用。

    6.  维护视图

    资源创建后,肯定随着业务的应用和环境的变更,需要对资源管理计划进行维护和调整,大部分情况都是通过包和EM进行操作,也比较简单,我们这里就不再进行演示,这里介绍下一些常用的查看资源管理计划的视图,这些视图方便大家对资源管理进行管理。

    视图

    描述

    DBA_RSRC_CONSUMER_GROUPS

    列出存在在数据库中所有资源使用者组

    DBA_RSRC_PLAN_DIRECTIVES

    列出存在在数据库中所有资源计划指示。

    DBA_RSRC_PLANS

    列出存在在数据库中所有资源计划。

    DBA_RSRC_GROUP_MAPPINGS

    列出所有的会话的各种映射属性。

    DBA_RSRC_MAPPING_PRIORITY

    列出了每个属性的当前优先级映射.

    V$PARALLEL_DEGREE_LIMIT_MTH

    显示所有可用的并行度限制资源分配方法

    V$RSRC_CONSUMER_GROUP_CPU_MTH

    显示所有可用的CPU资源分配方法资源使用者组。

    V$RSRC_SESSION_INFO

    显示为每个会话数据资源情况,可用于调优和设置资源计划映射用

    V$SESSION

    列出每个当前会话的会话信息。具体来说,列出了每个当前会话的资源消费者团体的名称。

    当然不止这些视图,还有一些不常用的视图如查看资源使用者组历史的V$RSRC_CONS_GROUP_HISTORY、资源计划历史的V$RSRC_PLAN_HISTORY等等,这些就需要各位在实际运用过程中去尝试理解。

    7.  存在的不足

    当然我们在看到在资源管理的优点的同时,在进行案例构建的时候,也看到了一些不足之处,主要表现在以下几点:

    7.1.          HIS程序提示窗口不明显

    由于资源管理的限制,根据我们的控制方式(特别是SQL取消和会话终止),我们的ZLHIS程序在执行过程中肯定会异常终止,前台表现会弹出错误提示,如下对资源消耗性报表进行控制后,执行报表SQL会提示如下窗口:


    这样的提示给操作端人员的感觉就是程序出现了未知错误,如果在管理之前没有进行必要的告知,势必会增加管理员的解释工作量。

    7.2.          管理方式的局限

    在实际应用过程中,还是会感受到资源管理的一些局限,特别是资源管理的方式上,除了CPU的分配方式外,大部分还是以简单的阈值限制为主,如最简单的IO操作,目前看只能达到阈值就取消操作或者切换到其它会话使用者组,无法保持会话IO在一定限制范围内持续执行,另外目前的分组只能通过会话区分,没有对具体的操作模式进行区分,应该进一步的对DDL操作进行划分,因此现在的资源管理方式对于精细化管理的需求还无法满足。

    7.3.          额外的消耗

    在启用了资源管理后,资源管理本身会有一定的消耗,如果设置不合理可能会导致额外的性能问题,这在AWR报告中会有显示如下:

             可以看到,这些以resmgr:*开头的事件就是资源管理特有的等待事件,如果这些等待事件占据了TOP5,那就证明资源管理设置可能存在问题或者遇到BUG,这样势必导致额外的消耗。

             不过综合来说,Oracle资源管理器如果合理的利用确实能够解决HIS业务的一些实际问题,特别是针对一些整体资源本身有限,有启用了大量应用模式的医院,其不失为一种解决问题的措施和方法。

    1.  编写参考文献

    官方文档:ManagingResource Allocation with Oracle Database Resource Manager

    网络博客:http://czmmiao.diandian.com/post/2011-04-18/17026473


    展开全文
  • MUI框架-08-窗口管理-创建页面

    千次阅读 2018-09-25 22:45:59
    MUI框架-08-MUI窗口管理-创建页面 官方文档:http://dev.dcloud.net.cn/mui/window/ 今天主角是通过页面的方式,实现在切换时头部或者底部标签,固定不闪的效果,虽然和原生 app 有一些差别,但是我能通过...
  • SOUI创建子窗口和父子窗口通讯

    千次阅读 2016-10-25 13:32:04
    SOUI中创建有窗口句柄的xml布局的子窗口 为了运用SOUI完成基本的父子窗口切换问题,同时能够利用xml文件布局窗口界面,就要用到有窗口句柄的真窗口(SOUI这么叫)。每一个使用SOUI创建的界面都是从SHostWnd派生...
  • 对于广大使用 Windows 系统的同学们来说,「资源管理器」一定是大家再熟悉不过的一位老伙计了,说起名字可能还会有不知道的同学,但我要是说起「文件夹」,大家的脑海里应该立刻就能浮现出熟悉的画面:一个四四方方...
  • 电脑窗口切换

    千次阅读 2012-10-15 15:48:46
    F4 显示“我的电脑”和“Windows 资源管理器”中的“地址”栏列表。 Shift + F10 显示所选项的快捷菜单。 Alt + 空格键 显示当前窗口的“系统”菜单。 Ctrl + Esc 显示“开始”菜单。 ALT + 菜单名中带下划线的...
  • 第九章 子窗口控件
  • Oracle DB 资源管理

    千次阅读 2013-10-26 13:04:23
    • 配置数据库资源管理器 • 访问和创建资源计划 • 创建使用者组 • 指定用于向使用者组分配资源的指令 • 将使用者组映射到计划 • 激活资源计划 • 监视资源管理器 数据库资源管理器:概览 资源管理器可用于...
  • Ctrl+shift+esc 按此键 —》 执行此操作 Ctrl + X —》 剪切选定项 Ctrl + C(或 Ctrl + Insert) —》 复制选定项 ...Alt + Tab —》 在打开的应用之间切换 Alt + F4 —》 关闭活动项,或者退...
  • Linux 前后台作业切换及脱机管理

    千次阅读 2013-05-06 09:43:48
    Linux bash shell单一终端界面下,我们经常...下面主要描述了Linux下前后台作业切换管理以及作业在脱机的情形下如何管理。 1、前后台作业的定义 前后台作业实际上对应的也就是前后台进程,因此也就有对应的pid。
  • windows10命令行窗口cmd路径切换

    千次阅读 2020-08-05 15:06:50
    回到根目录 cd/ C:\Users>cd/ C:\> 回到上一级目录 cd… C:\Users\administrator>...通过绝对路径切换目录 ...先进入指定盘区根目录,再用相对路径切换目录 E:\CARLA_0.9.9.4\WindowsNoEditor>d: D:\>cd
  • c++ builder 子窗口长期前置

    千次阅读 2013-11-22 13:36:28
    要真正的理解和解决这个问题,确实不容易。当我花了好几天时间才搞...首先说明下让窗口前置的方法非常多,但现有(2011年1月26号)网上(公开中文论坛资料)的99%(还有1%我是没发现)的回答和论点都是不全面或者错
  • pyqt5如何在同一个窗口切换不同界面

    千次阅读 多人点赞 2020-04-17 11:44:11
    网上找了半天也没发现什么靠谱的解答,自己捣鼓着花费了好几个小时,总算是发现了两种能用的方法,先假设一下使用的场景:现在窗口的右半部分有两个界面想要切换显示 我们主体窗口的控件为self.main_widget,网格...
  • DWM 是一种新界面,用于管理如何将运行和呈现的各种窗口合并到 Windows Vista 桌面上。Windows® Presentation Foundation (WPF) 提供了一种更高级别的层,控制着到桌面层的呈现,Windows Display Driver
  • win10在几个窗口切换的快捷键

    千次阅读 2016-03-18 10:32:16
    Alt+Tab — 在打开的项目之间切换 Win +Tab — 在 Aero Flip 3-D特效下浏览任务栏中的程序
  • Oracle 资源管理(resource manager) 假如管理一下具有如下问题的产品数据库: 后台批作业占用了大量的资源,将会阻碍了其他要同时运行的更重要的作业。 如要调度大型作业,但不能预计它们何时才能完成。 作业的...
  • 模仿QQ的左右滑动切换界面和下拉更新的效果

    千次阅读 热门讨论 2012-07-31 20:11:33
    今天没事就来写点东西,因为功能还没有完全实现,所以效果不是太好,不过呢,还是能实现,左右滑动时候切换界面和显示QQ好友列表的简单功能!!好了,废话不多说了看看实现的过程吧! 1.首先看看布局 主布局main.xml...
  • 显示一个模态窗口,正常而普遍的操作。然而却一直有一个难缠的 BUG:当关闭模态窗口时,父窗口有时会跑到其他程序窗口...切换到其他程序窗口中(比如 Windows 资源管理器窗口); 切换回此模态窗口,然后关闭这个模...
  • document.title="DIRECTX中独占模式与窗口模式的切换 - "+document.tit 最近在GAMEDEV上发现了这篇文章,觉得挺不错的,特此翻译过来,有不对的地方希望大家指正DIRECTX中独占模式与窗口模式的切换(一)介绍让...
  • 今天我们来看一下Kanzi的资源管理系统(Resource management)。 在kanzi中,资源是在我们的app中不同地方都可以复用的东西。比如,Mesh Data资源定义了Model节点的几何结构。kanzi的资源管理系统是用来在你的app...
  • UE4流关卡与无缝地图切换总结

    万次阅读 多人点赞 2017-11-08 23:08:40
    世界构成 World Composition 二.地图切换流程分析 ClientTravel ServerTravel Browse 三.无缝地图切换 无缝切换流程 无缝切换时保存Actor 无缝切换时的一些问题与解决方法 一.Level S.....
  • 文件资源管理器快捷键 虚拟桌面快捷键 任务栏快捷键 《设置》快捷键 第二部分:Windows10应用的快捷键 《Microsoft Edge浏览器》快捷键 《计算器》快捷键 游戏栏快捷键 《Groove》快捷键 《地图》快捷键 ...
  • miniGUI窗口管理及控件类

    千次阅读 2015-04-30 17:47:33
    窗口管理和控件及控件类 魏永明 蓝点软件(北京)研发中心技术主管 2001/01/06 目录:  引言  窗口 Z 序  窗口剪切算法  主窗口和控件、控件类  输入法模块大...
  • Win+D:切换桌面显示窗口或者gadgets小工具 Win+E:打开explorer资源浏览器 Win+F:搜索文件或文件夹 Win+G:切换边栏小工具 Win+L:如果你连接到网络,则锁定计算机,如果没有连接到网络的,则切换用户 Win+M:快速...
  • 前言: 前文拆解了2G GSM手机语音...本章将拆解2G GSM基站的工作原理以及多终端共享信道场景下的技术,主要拆解手机话音传输前的通信流程:包括小区建立过程、随机接入、呼叫建立过程等无线资源管理RRM相关的技术。
  • C#实现多语言切换详细教程(附源码)

    千次阅读 2019-10-26 15:40:39
    环境说明:Windows10,VS2017,.NET...2.在项目的解决方案资源管理器处,右键项目名称,依次选择添加、新建项。 3.在弹出的窗口中新建一个类,取名为LanguageMgr.cs. 向LanguageMgr.cs里面添加如下代码 using Syst...
  • 2、采用启动程序的方式启动和界面设置CPU亲和 3、易语言快速加载大漠类模块和免注册调用及修改大漠名称 4、一键开启关闭游戏 5、循环读取游戏账号密码到窗口超级列表框 6、引入线程创建、挂起、恢复、销毁等API 7...
  • 方法就可以关闭应用程序,释放掉资源。 WPF里Application类没有该方法,但是有一个Exit的事件驱动,在WPF应用程序里面关闭程序讲究很多: 在WPF应用程序的关闭是有ShutdownMode属性设置,具有3中枚举类型的值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,599
精华内容 19,039
关键字:

切换资源管理器的左右子窗口