<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    gdufo

     

    2016年2月6日

    Mondrian 使用教程

    http://blog.csdn.net/evangel_z/article/details/29585571

    通過本教程,您將了解到什么是Mondiran,及如何將mondrian支持添加到您的Java Web項目中。

    在閱讀本教程之前,您可能需要掌握以下概念:

    OLAP(聯機分析處理On-Line Analytical Processing),您可以通過閱讀ROLAP的概念.pptx來了解OLAP

    MDX多維表達式,您可以通過閱讀MDX的基本語法及概念.pptx來了解MDX


    1. Mondrian是什么?

    Mondrian是一個開源項目。一個用Java寫成的OLAP引擎。它用MDX語言實現查詢,從關系數據庫(RDBMS)中讀取數據。然后經過Java API以多維的方式對結果進行展示。

    Mondrian的使用方式同JDBC驅動類似??梢苑浅7奖愕呐c現有的Web項目集成

    1.1 Mondrian的體系結構(Architecture)

    Mondrian OLAP 系統由四個層組成; 從最終用戶到數據中心, 順序為: 
    1.1.1 表現層(the presentation layer)
    1.1.2 維度層(the dimensional layer)
    1.1.3 集合層(the star layer)
    1.1.4 存儲層(the storage layer)
    結構圖如下:


    1.1.1 表現層(the presentation layer)

    表現層決定了最終用戶將在他們的顯示器上看到什么, 及他們如何同系統產生交互。

    有許多方法可以用來向用戶顯示多維數據集, 有 pivot 表 (一種交互式的表), pie, line 和圖表(bar charts)。它們可以用Swing 或 JSP來實現。

    表現層以多維"文法(grammar)(維、度量、單元)”的形式發出查詢,然后OLAP服務器返回結果。

    1.1.1.1 Jpivot表現層

    JPivot 是Mondrian的表現層TagLib,一直保持著良好的開發進度。

    您可以通過訪問jpivot的官方網站http://jpivot.sourceforge.net/以獲得更多的幫助及支持

    jpivot使用XML/ XSLT渲染OLAP報表:

    JPivot 使用 WCF (Web Component Framework)  ,基于XML/XSLT來渲染Web UI組件。這使它顯得十分另類。不過,OLAP報表這種非常復雜但又有規律可循的東西,最適合使用XSLT來渲染。

    jpivot完全基于JSP+TagLib:

    JPivot另外一個可能使人不慣的地方是它完全基于taglib而不是大家熟悉的MVC模式。

    但它可以很方便的將多維數據展示給最終用戶,如下表格:


    jpivot其實是一個自定義jsp的標簽庫。它基于XML/XSLT配置來生成相應的html。所幸的是,我們并不需要了解太多關于這方面的內容,我們只要掌握相應jsp標簽的使用即可。

    在本教程的實例中,我們將會對一些常用到的jpivot標簽進行講解。

    您還可以通過漢化WEB-INF/jpivot下的xml文件來完成對jpivot的漢化工作

    1.1.2 維度層(the dimensional layer)

    維度層用來解析、驗證和執行MDX查詢要求。

    一個MDX查詢要通過幾個階段來完成:首先是計算坐標軸(axes),再者計算坐標軸axes 中cell的值。

     為了提高效率,維度層把要求查詢的單元成批發送到集合層,查詢轉換器接受操作現有查詢的請求,而不是對每個請求都建立一個MDX 聲明。

    1.1.3 集合層(the star layer)

    集合層負責維護和創建集合緩存,一個集合是在內存中緩存一組單元值, 這些單元值由一組維的值來確定。

    維度層對這些單元發出查詢請求,如果所查詢的單元值不在緩存中,則集合管理器(aggregation manager)會向存儲層發出查詢請求

    1.1.4 存儲層(the storage layer)

    存儲層是一個關系型數據庫(RDBMS)。它負責創建集合的單元數據,和提供維表的成員。

    1.2 API

    Mondrian 為客戶端提供一個用于查詢的API

    因為到目前為止,并沒有一個通用的用于OLAP查詢的API,因此Mondrian提供了它私有的API.

    盡管如此,一個常使用JDBC的人將同樣發現它很熟悉.不同之處僅在于它使用的是MDX查詢語言,而非SQL

    下面的java片段展示了如何連接到Mondrian,然后執行一個查詢,最后打印結果.

    1. import mondrian.olap.*;  
    2.     import java.io.PrintWriter;  
    3.     Connection connection = DriverManager.getConnection("Provider=mondrian;"   
    4.             +"Jdbc=jdbc:odbc:MondrianFoodMart;"   
    5.             +"Catalog=/WEB-INF/FoodMart.xml;",null,false);  
    6.     Query query = connection.parseQuery("SELECT {[Measures].[Unit Sales], [Measures].[Store Sales]} on columns,"   
    7.             +" {[Product].children} on rows "   
    8.             +"FROM [Sales] " +"WHERE ([Time].[1997].[Q1], [Store].[CA].[San Francisco])");  
    9.     Result result = connection.execute(query);  
    10.     result.print(new PrintWriter(System.out));  

    與JDBC類似,一個Connection由DriverManager創建,Query 對象類似于JDBC 的Statement,它通過傳遞一個MDX語句來創建.Result對象類似于JDBC的ResultSet,只不過它里面保存的是多維數據

    您可以通過查看Mondrian幫助文檔里的javadoc來獲取更多關于Mondrian API的資料

    通過上面的介紹,您應該對mondrian的體系有一個基本的了解。

    下面我們將通過一個簡單的例子來加深您的理解。


    2. 一個簡單的Mondrian例子

    現在讓我們用一個簡單的例子來說明將Mondrian支持添加到您java web的具體步驟。

    2.1 準備開發工具及環境

    本測試需要的環境:
    操作系統:Windows 2000;
    Web服務器:tomcat6.0;
    關系數據庫:sql server 2000;
    開發工具:eclipse + myeclipse;
          JDBC驅動:jtds-1.2.2;

             您可以在http://tomcat.apache.org/上下載到tomcat的最新版本及幫助;
          您可以在http://www.myeclipseide.com/上下載到myeclipse的最新版本及相應的eclipse開發平臺版本

    2.2 準備Mondrian資源:

    http://sourceforge.net/projects/mondrian/下載Mondrian的最新版本(目前版本為3.0,大約有50M+大小)。


    2.3 創建項目

    啟動eclipse。

    在eclipse中新創建一個web項目,名為Tezz。注意需要加入JSTL支持。

    具體步驟如下:

    2.3.1  打開新建web項目對話框



    一個新項目Tezz的文件結構如下:


    2.4 添加必須的文件

    將下載的壓縮包進行解壓。完成后,進入文件夾可以看到如下目錄結構。雙擊進入lib文件夾。


    Lib文件夾有如下內容:注意到這里的mondrian.war文件是一個可直接布署的項目,我們需要將它解壓,然后從中取出我們所需要的文件。(建議將其擴展名改成zip,然后直接右鍵解壓)


    進入解壓后的文件夾,選中jpivot、wcf二個文件夾及busy.jsp、error.jsp、testpage.jsp三個文件,我們需要將這些資源復制到我們測試項目的WebRoot文件夾中。按ctrl+C鍵復制。


    注:jpivot、wcf這兩個文件夾包含mondrian使用的圖像和css文件。Busy.jsp顯示等待頁面、error.jsp顯示出錯頁面、testpage.jsp這文件的用處將在后面介紹。

    切換到eclipse界面,在我們的Tezz項目的WebRoot文件夾處右擊鼠標,在彈出的菜單中選擇Paste(粘貼)即可


    粘貼完成后的項目結構如下


    注意:因為我們還未將所有資料復制到項目中,因此eclipse會顯示錯誤圖標

    最后進入WEB-INF文件夾(在上面步驟中解壓的項目文件mondrian.war里),選中jpivot、lib、wcf這三個文件夾,同樣需要復制它們到測試項目的WEB-INF文件夾中。


    Jpivot、wcf這兩個文件夾包含jpivot和wcf用于生成用戶界面的配置文件(*.xml、*.xsl)及標簽文件(*.tld)的定義。Lib文件夾包含的是mondrian所要用的java包。

    切換到eclipse界面,在我們的Tezz項目的WebRoot文件夾處右擊鼠標,在彈出的菜單中選擇Paste(粘貼)


    至此Mondrian的支持添加完畢,下面我們將配置web.xml,讓我們的項目能夠使用到mondrian的功能。

    2.5 配置web.xml

    用eclipse打開我們在上面解壓的布署項目的WEB-INF/web.xml文件


    過濾器(filter)

    復制如下所示的xml代碼到我們測試項目Tezz的web.xml文件中。

    作用:這個過濾器在訪問/testpage.jsp前被調用。它被設計成jpivot的前端控制器,用于判斷并將用戶的請求發送到某個頁面。

    注:在實際項目中可以使用您自己定義的servlet或使用其他技術來替代它以提供更多的功能

    1.  <filter>  
    2.     <filter-name>JPivotController</filter-name>  
    3.     <filter-class>com.tonbeller.wcf.controller.RequestFilter</filter-class>  
    4.     <init-param>  
    5.       <param-name>indexJSP</param-name>  
    6.       <param-value>/index.html</param-value>  
    7.       <description>如果這是一個新的會話,則轉到此頁面</description>  
    8.     </init-param>  
    9.     <init-param>  
    10.       <param-name>errorJSP</param-name>  
    11.       <param-value>/error.jsp</param-value>  
    12.       <description>出錯時顯示的頁面</description>  
    13.     </init-param>  
    14.     <init-param>  
    15.       <param-name>busyJSP</param-name>  
    16.       <param-value>/busy.jsp</param-value>  
    17.       <description>這個頁面用于當用戶點擊一個查詢時,在這個查詢還未將結果還回給用戶時所顯示的界面</description>  
    18.     </init-param>  
    19. </filter>  
    20.   
    21.   <filter-mapping>  
    22.     <filter-name>JPivotController</filter-name>  
    23.     <url-pattern>/testpage.jsp</url-pattern>  
    24.   </filter-mapping>  
    復制下面的listener到我們的web.xml文件中(用于初始化一些資源)
    1. <listener>  
    2.     <listener-class>mondrian.web.taglib.Listener</listener-class>  
    3.   </listener>  
    4.   
    5.   <!– 資源初始化-->  
    6.   <listener>  
    7.     <listener-class>com.tonbeller.tbutils.res.ResourcesFactoryContextListener</listener-class>  
    8.   </listener>  
    Print  servlet,該servlet用于將數據生成Excel文件或pdf文件并返回給用戶,如果您需要用到該功能,則需要將其copy到您項目的web.xml文件中
    1. <servlet>  
    2.     <servlet-name>Print</servlet-name>  
    3.     <display-name>Print</display-name>  
    4.     <description>Default configuration created for servlet.</description>  
    5.     <servlet-class>com.tonbeller.jpivot.print.PrintServlet</servlet-class>  
    6.   </servlet>  
    7.  <servlet-mapping>  
    8.     <servlet-name>Print</servlet-name>  
    9.     <url-pattern>/Print</url-pattern>  
    10.   </servlet-mapping>  
    MDXQueryServlet用于接受并執行一個MDX查詢,然后將該查詢以Html表格的形式返回。其中的參數connectString用于指定連接到數據庫的字符串,例如使用jtds驅動連接到sql server 2000的字符串如下:

    Provider=mondrian;Jdbc=jdbc:jtds:sqlserver://localhost/Tezz;user=sa;password=123456;Catalog=/WEB-INF/queries/tezz.xml;JdbcDrivers=net.sourceforge.jtds.jdbc.Driver; 

    如果您需要用到該功能,則需要將其copy到您項目的web.xml文件中。

    1. <servlet>  
    2.     <servlet-name>MDXQueryServlet</servlet-name>  
    3.     <servlet-class>mondrian.web.servlet.MDXQueryServlet</servlet-class>  
    4.     <init-param>  
    5.       <param-name>connectString</param-name>  
    6.       <param-value>@mondrian.webapp.connectString@</param-value>  
    7.     </init-param>  
    8.   </servlet>  
    9.  <servlet-mapping>  
    10.     <servlet-name>MDXQueryServlet</servlet-name>  
    11.     <url-pattern>/mdxquery</url-pattern>  
    12.   </servlet-mapping>  
    DisplayChart 和GetChart 這兩個Servlet 用于生成圖表和將其顯示給最終用戶,如果您需要用到該功能,則需要將其copy到您項目的web.xml文件中。
    1. <!-- jfreechart provided servlet -->  
    2.   <servlet>  
    3.     <servlet-name>DisplayChart</servlet-name>  
    4.     <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>  
    5.   </servlet>  
    6.   <!-- jfreechart provided servlet -->  
    7.   <servlet>  
    8.     <servlet-name>GetChart</servlet-name>  
    9.     <display-name>GetChart</display-name>  
    10.     <description>Default configuration created for servlet.</description>  
    11.     <servlet-class>com.tonbeller.jpivot.chart.GetChart</servlet-class>  
    12.   </servlet>  
    13. <servlet-mapping>  
    14.     <servlet-name>DisplayChart</servlet-name>  
    15.     <url-pattern>/DisplayChart</url-pattern>  
    16.   </servlet-mapping>  
    17. <servlet-mapping>  
    18.     <servlet-name>GetChart</servlet-name>  
    19.     <url-pattern>/GetChart</url-pattern>  
    20.   </servlet-mapping>  
    它們用于向用戶生成和顯示如下所示的各種圖表:

    最后添加以下標簽庫到我們的web.xml項目中即可

    1. <taglib>  
    2.    <taglib-uri>http://www.tonbeller.com/wcf</taglib-uri>  
    3.    <taglib-location>/WEB-INF/wcf/wcf-tags.tld</taglib-location>  
    4.  </taglib>  
    5.   
    6.  <taglib>  
    7.    <taglib-uri>http://www.tonbeller.com/jpivot</taglib-uri>  
    8.    <taglib-location>/WEB-INF/jpivot/jpivot-tags.tld</taglib-location>  
    9.  </taglib>  
    到這里,您應該對mondrian在web.xml的配置有一定的了解,并可按需要添加相應的功能。

    接下來我們將要創建本例子所要用到的表格及數據。

    2.6 準備測試用表

    本例使用的表結構如下所示:


    Sale是事實表,它有兩個維:客戶(customer)維和由兩個表組成的產品(Product)維。

    表格的創建很簡單,您只需要將下面的sql語句導入數據庫即可

    2.6.1 使用以下sql語句創建表

    1. /**銷售表*/  
    2. create table Sale (  
    3.     saleId int not null,  
    4.     proId int null,  
    5.     cusId int null,   
    6.     unitPrice float null,    --單價  
    7.     number int null,     --數量  
    8.     constraint PK_SALE primary key (saleId)  
    9. )  
    10.     /**用戶表*/  
    11. create table Customer (  
    12.     cusId int not null,  
    13.     gender char(1) null,    --性別  
    14.     constraint PK_CUSTOMER primary key (cusId)  
    15. )  
    16. /**產品表*/  
    17. create table Product (  
    18.     proId int not null,  
    19.     proTypeId int null,  
    20.     proName varchar(32) null,  
    21.     constraint PK_PRODUCT primary key (proId)  
    22. )  
    23. /**產品類別表*/  
    24. create table ProductType (  
    25.     proTypeId int not null,  
    26.     proTypeName varchar(32) null,  
    27.     constraint PK_PRODUCTTYPE primary key (proTypeId)  
    28. )  

    2.6.2 使用以下sql語句導入數據

    1. insert into Customer(cusId,gender) values(1,'F')  
    2. insert into Customer(cusId,gender) values(2,'M')  
    3. insert into Customer(cusId,gender) values(3,'M')  
    4. insert into Customer(cusId,gender) values(4,'F')  
    5. insert into producttype(proTypeId,proTypeName) values(1,'電器')  
    6. insert into producttype(proTypeId,proTypeName) values(2,'數碼')  
    7. insert into producttype(proTypeId,proTypeName) values(3,'家具')  
    8. insert into product(proId,proTypeId,proName) values(1,1,'洗衣機')  
    9. insert into product(proId,proTypeId,proName) values(2,1,'電視機')  
    10. insert into product(proId,proTypeId,proName) values(3,2,'mp3')  
    11. insert into product(proId,proTypeId,proName) values(4,2,'mp4')  
    12. insert into product(proId,proTypeId,proName) values(5,2,'數碼相機')  
    13. insert into product(proId,proTypeId,proName) values(6,3,'椅子')  
    14. insert into product(proId,proTypeId,proName) values(7,3,'桌子')  
    15. insert into sale(saleId,proId,cusId,unitPrice,number) values(1,1,1,340.34,2)  
    16. insert into sale(saleId,proId,cusId,unitPrice,number) values(2,1,2,140.34,1)  
    17. insert into sale(saleId,proId,cusId,unitPrice,number) values(3,2,3,240.34,3)  
    18. insert into sale(saleId,proId,cusId,unitPrice,number) values(4,3,4,540.34,4)  
    19. insert into sale(saleId,proId,cusId,unitPrice,number) values(5,4,1,80.34,5)  
    20. insert into sale(saleId,proId,cusId,unitPrice,number) values(6,5,2,90.34,26)  
    21. insert into sale(saleId,proId,cusId,unitPrice,number) values(7,6,3,140.34,7)  
    22. insert into sale(saleId,proId,cusId,unitPrice,number) values(8,7,4,640.34,28)  
    23. insert into sale(saleId,proId,cusId,unitPrice,number) values(9,6,1,140.34,29)  
    24. insert into sale(saleId,proId,cusId,unitPrice,number) values(10,7,2,740.34,29)  
    25. insert into sale(saleId,proId,cusId,unitPrice,number) values(11,5,3,30.34,28)  
    26. insert into sale(saleId,proId,cusId,unitPrice,number) values(12,4,4,1240.34,72)  
    27. insert into sale(saleId,proId,cusId,unitPrice,number) values(13,3,1,314.34,27)  
    28. insert into sale(saleId,proId,cusId,unitPrice,number) values(14,3,2,45.34,27)  

    2.7 建立模式(schema)文件

    一個模式定義了一個多維數據庫. 它包含一個邏輯模型(logical model)、一組數據立方(consisting of cubes)、層次(hierarchies)、和成員(members), 并映射到物理模型(關系數據庫)上。

    簡單的說,配置一個模式就是配置一個關系數據結構到多維數據結構的映射。

    注:關于mondrian的模式及模式的配置,您可以通過閱讀mondrian的基本模式.pptx來了解。這里我們只對其進行了簡單介紹。

    2.7.1 創建模式文件:

    模式文件的創建很簡單。首先在WEB-INF下新建一個queries的文件夾,然后在該文件夾下創建一個名為tezz.xml的文件。再按下面的步驟將xml元素添加入即可。


    2.7.2 配置模式文件:

    2.7.2.1 添加數據立方Sales:


    2.7.2.2 添加數據立方Sales的維:


    添加產品維(因為產品維由兩個表連接而成,因此比客戶維復雜些):


    添加度量(共有三個度量:數量、平均單價和總銷售額):


    最后生成的tezz.xml文件內容如下:

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <Schema name="tezz">  
    3. <Cube name="Sales">  
    4.     <!-- 事實表(fact table) -->  
    5.     <Table name="sale" />  
    6.     <!-- 客戶維 -->  
    7.     <Dimension name="客戶性別" foreignKey="cusId">  
    8.         <Hierarchy hasAll="true" allMemberName="所有性別" primaryKey="cusId">  
    9.             <Table name="Customer"></Table>  
    10.             <Level name="gender" column="gender"></Level>  
    11.         </Hierarchy>  
    12.     </Dimension>  
    13.     <!-- 產品類別維 -->  
    14.     <Dimension name="產品類別" foreignKey="proId">  
    15.         <Hierarchy hasAll="true" allMemberName="所有產品" primaryKey="proId" primaryKeyTable="product">  
    16.             <join leftKey="proTypeId" rightKey="proTypeId">  
    17.                 <Table name="product" />  
    18.                 <Table name="producttype"></Table>  
    19.             </join>  
    20.             <Level name="proTypeId" column="proTypeId"  
    21.                 nameColumn="proTypeName" uniqueMembers="true" table="producttype" />  
    22.             <Level name="proId" column="proId" nameColumn="proName"  
    23.                 uniqueMembers="true" table="product" />  
    24.         </Hierarchy>  
    25.     </Dimension>  
    26.     <Measure name="數量" column="number" aggregator="sum" datatype="Numeric" />  
    27.     <Measure name="總銷售額" aggregator="sum" formatString="¥#,##0.00">  
    28.         <!-- unitPrice*number所得值的列 -->  
    29.         <MeasureExpression>  
    30.             <SQL dialect="generic">(unitPrice*number)</SQL>  
    31.         </MeasureExpression>  
    32.     </Measure>  
    33.     <CalculatedMember name="平均單價" dimension="Measures">  
    34.         <Formula>[Measures].[總銷售額] / [Measures].[數量]</Formula>  
    35.         <CalculatedMemberProperty name="FORMAT_STRING" value="¥#,##0.00" />  
    36.     </CalculatedMember>  
    37. </Cube>  
    38. </Schema>  

    2.8 編寫MDX查詢語句

    在模式文件定義完成之后,我們就可以根據它來編寫相應MDX查詢語句了。

    本例所用的MDX語句如下:

    2.9 創建查詢文件

    現在我們將創建一個jsp文件,該jsp使用jpivot的mondrianQuery標簽來完成查詢。

    該文件最后將被testpage.jsp使用。

    在/WEB-INF/queries文件夾下面創建一名為tezz的jsp文件。該jsp包含如下內容:


    2.10 布署項目

    至此我們已經全部配置完成,文件結構如下:


    布署項目,啟動Tomcat,在瀏覽器上輸入http://localhost:8080/Tezz/testpage.jsp?query=tezz即可看到如下結果:


    注:testpage.jsp?query=tezz,這里的tezz即剛我們創建的用于查詢jsp文件名稱


    3.  testpage.jsp的流程

    testpage.jsp文件用于發出查詢及將結果轉換成html格式。它使用一組jsp標簽來完成這些復雜的工作。

    在本教程的最后一章里,我們對testpage.jsp的流程及用到的主要標簽進行簡單介紹。

    3.1 wcf:include標簽:


    3.2 jp:table標簽:

    <jp:table id="table01" query="#{query01}"/>

    jp:table根據query01中保存的結果(領域數據)準備顯示OLAP表格所需的數據(顯示數據)

    <wcf:render ref="table01" xslUri="/WEB-INF/jpivot/table/mdxtable.xsl"/>

    根據table01的結果,使用mdxtable.xsl中的配置,渲染出OLAP表格。

    3.3 其他jp、wcf標簽

    同樣,其他jp標簽,如<jp:chart id=“chart01“ ---/>等標簽準備待渲染的數據,再由相應的<wcf:render ref=“chart01” ---/>標簽將它們渲染成html格式。

    這樣,用戶將在瀏覽器上看到最終的結果。

    至此,一個完整的mondrian查詢結束。


    posted @ 2016-02-06 18:18 gdufo| 編輯 收藏

    2015年8月26日

    Java調用MQ隊列

    http://blog.csdn.net/ozwarld/article/details/7735915

    IBM MQ 6.0中設置兩個隊列,(遠程隊列、通道之類都不設置)。

    隊列管理器是XIR_QM_1502

    隊列名稱是ESBREQ

    IP地址是10.23.117.134(遠程的一臺電腦,跟我的電腦不在一個局域網內)

    端口1414

    CCSID 1208


    MQ配置可以參考這個,有配圖http://wenku.baidu.com/view/06d108d0360cba1aa811daa3.html

    程序如下,發送線程兩個,接收線程一個。接收完畢后就結束。


    1. /* 
    2.  * 創建日期 2012-7-10 
    3.  * 
    4.  * TODO 要更改此生成的文件的模板,請轉至 
    5.  * 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板 
    6.  */  
    7. package yerasel;  
    8.   
    9. /** 
    10.  * @author Fenglb E-mail:56553655@163.com 
    11.  * @version 創建時間:2009-4-30 下午04:13:38 類說明 
    12.  */  
    13.   
    14. import java.io.IOException;  
    15. import com.ibm.mq.MQC;  
    16. import com.ibm.mq.MQEnvironment;  
    17. import com.ibm.mq.MQException;  
    18. import com.ibm.mq.MQGetMessageOptions;  
    19. import com.ibm.mq.MQMessage;  
    20. import com.ibm.mq.MQPutMessageOptions;  
    21. import com.ibm.mq.MQQueue;  
    22. import com.ibm.mq.MQQueueManager;  
    23.   
    24. interface SomeConstants {  
    25.     String qManager = "XIR_QM_1502";//"XIR_QM"; //QueueManager name  
    26.     String qName = "ESBREQ";// Queue Name  
    27.     String strIP = "10.23.117.134";//"10.24.28.139";//"10.24.28.102";  
    28.     int iPort = 1502;//1414;  
    29.     String strChl = "SYSTEM.DEF.SVRCONN";// Server-Connection Channel  
    30.     int iCCSID = 1208;  
    31. }  
    32.   
    33. class Sender implements Runnable, SomeConstants {  
    34.     public void run() {  
    35.         sendMessage();  
    36.     }  
    37.   
    38.     public void sendMessage() {  
    39.   
    40.         String name = Thread.currentThread().getName();  
    41.         System.out.println("進入線程" + name);  
    42.   
    43.         MQQueueManager qMgr = null;  
    44.         // configure connection parameters  
    45.   
    46.         MQEnvironment.hostname = strIP;  
    47.         // Server name or IP  
    48.         MQEnvironment.port = iPort;  
    49.         MQEnvironment.channel = strChl;  
    50.         MQEnvironment.CCSID = iCCSID;  
    51.   
    52.         // java程序連接mq的方式有兩種,一是客戶機方式,一是綁定方式,  
    53.         // 默認是客戶機方式,當mq部署在本地的時候,就需要用綁定方式  
    54.         // 本機IP是10.24.28.139連接10.23.117.134的時候不需要下句  
    55.         //MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY,  
    56.         //MQC.TRANSPORT_MQSERIES_BINDINGS);  
    57.   
    58.         // Create a connection to the QueueManager  
    59.         System.out.println(name + " Connecting to queue manager: " + qManager);  
    60.         try {  
    61.             qMgr = new MQQueueManager(qManager);  
    62.             // Set up the options on the queue we wish to open  
    63.             int openOptions = MQC.MQMT_REQUEST | MQC.MQPMO_NEW_MSG_ID  
    64.                     | MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING  
    65.                     | MQC.MQOO_INPUT_AS_Q_DEF;  
    66.             // Now specify the queue that we wish to open and the open options  
    67.             System.out.println(name + " Accessing queue: " + qName);  
    68.             MQQueue queue = qMgr.accessQueue(qName, openOptions);  
    69.             // Define a simple WebSphere MQ Message ...  
    70.   
    71.             // Specify the default put message options  
    72.             MQPutMessageOptions pmo = new MQPutMessageOptions();  
    73.   
    74.             // Put the message to the queue  
    75.             System.out.println(name + " Sending a message...");  
    76.   
    77.             MQMessage msg = new MQMessage();  
    78.             msg.messageId = "MSGID".getBytes();  
    79.             msg.messageType = MQC.MQMT_REQUEST;  
    80.             msg.replyToQueueName = "ESBREQ";  
    81.   
    82.             // 在此測試一下 mq 的傳輸次列  
    83.             for (int j = 1; j < 5; j++) {  
    84.                 msg.messageSequenceNumber = j;  
    85.                 // write some text in UTF8 format  
    86.                 try {  
    87.                     String str = "Salemetsizbe Yerasel";  
    88.                     str = str + " " + j;  
    89.                     msg.writeUTF(str);  
    90.                     queue.put(msg, pmo);  
    91.                     msg.clearMessage();  
    92.                     System.out.println(name + " putting the message... " + j);  
    93.                 } catch (MQException mqe) {  
    94.                     mqe.printStackTrace();  
    95.                     break;  
    96.                 } catch (IOException e1) {  
    97.                     e1.printStackTrace();  
    98.                 }  
    99.             }  
    100.             qMgr.commit();  
    101.             System.out.println(name + " Done!");  
    102.             System.out.println("==========");  
    103.             System.out.println("");  
    104.         } catch (MQException e) {  
    105.             e.printStackTrace();  
    106.         }  
    107.     }  
    108. }  
    109.   
    110. class Receiver implements Runnable, SomeConstants {  
    111.   
    112.     public void run() {  
    113.         recvMessage();  
    114.     }  
    115.   
    116.     public void recvMessage() {  
    117.   
    118.         String name = Thread.currentThread().getName();  
    119.           
    120.         try {  
    121.             Thread.sleep(1000);  
    122.             MQQueueManager qMgr = null;  
    123.   
    124.               
    125.             System.out.println("進入線程" + name);  
    126.   
    127.             System.out.println(name + " Connecting to queue manager: "  
    128.                     + qManager);  
    129.             qMgr = new MQQueueManager(qManager);  
    130.             // 設置將要連接的隊列屬性  
    131.             // Note. The MQC interface defines all the constants used by the  
    132.             // WebSphere MQ Java programming interface  
    133.             // (except for completion code constants and error code constants).  
    134.             // MQOO_INPUT_AS_Q_DEF:Open the queue to get messages using the  
    135.             // queue-defined default.  
    136.             // MQOO_OUTPUT:Open the queue to put messages.  
    137.             int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT  
    138.                     | MQC.MQOO_INQUIRE;  
    139.   
    140.             // Now get the message back again. First define a WebSphere MQ  
    141.             // message to receive the data  
    142.             MQMessage rcvMessage = new MQMessage();  
    143.   
    144.             // Specify default get message options  
    145.             MQGetMessageOptions gmo = new MQGetMessageOptions();  
    146.             gmo.options = gmo.options + MQC.MQGMO_SYNCPOINT;// Get messages  
    147.                                                             // under sync point  
    148.                                                             // control(在同步點控制下獲取消息)  
    149.             gmo.options = gmo.options + MQC.MQGMO_WAIT; // Wait if no messages  
    150.                                                         // on the  
    151.                                                         // Queue(如果在隊列上沒有消息則等待)  
    152.             gmo.options = gmo.options + MQC.MQGMO_FAIL_IF_QUIESCING;// Fail if  
    153.                                                                     // Qeue  
    154.                                                                     // Manager  
    155.                                                                     // Quiescing(如果隊列管理器停頓則失?。?nbsp; 
    156.             gmo.waitInterval = 1000; // Sets the time limit for the  
    157.                                         // wait.(設置等待的毫秒時間限制)  
    158.   
    159.             System.out.println(name + " Accessing queue: " + qName);  
    160.             MQQueue queue = qMgr.accessQueue(qName, openOptions);  
    161.             int depth = 0;  
    162.   
    163.             // Get the message off the queue.  
    164.             System.out.println("... " + name + " getting the message back again");  
    165.             for (;;) {  
    166.                 try {  
    167.                     queue.get(rcvMessage, gmo);  
    168.                     System.out.println(" ID: "  
    169.                             + (new String(rcvMessage.messageId)).trim()  
    170.                             + " Num: " + rcvMessage.messageSequenceNumber  
    171.                             + " Type: " + rcvMessage.messageType + " Flag: "  
    172.                             + rcvMessage.messageFlags);  
    173.                     // And display the message text...  
    174.                     String msgText = rcvMessage.readUTF();  
    175.                     System.out.println("The message is: " + msgText);  
    176.                     rcvMessage.clearMessage();  
    177.   
    178.                     // Break if no MSG left in queue  
    179.                     depth = queue.getCurrentDepth();  
    180.                     if (depth == 0)  
    181.                         break;  
    182.   
    183.                 } catch (MQException mqe) {  
    184.                     mqe.printStackTrace();  
    185.                     break;  
    186.                     // null;  
    187.                 } catch (IOException e) {  
    188.                     e.printStackTrace();  
    189.                 }  
    190.             }  
    191.             // Close the queue  
    192.             System.out.println(name + " Closing the queue");  
    193.             queue.close();  
    194.             // Disconnect from the QueueManager  
    195.             System.out.println(name + " Disconnecting from the Queue Manager");  
    196.             qMgr.disconnect();  
    197.             System.out.println(name + " Done!");  
    198.             System.out.println("==========");  
    199.             System.out.println("");  
    200.         } catch (MQException ex) {  
    201.             System.out  
    202.                     .println("A WebSphere MQ Error occured : Completion Code "  
    203.                             + ex.completionCode + " Reason Code "  
    204.                             + ex.reasonCode + ex.getMessage());  
    205.         } catch (InterruptedException e1) {  
    206.             e1.printStackTrace();  
    207.         }  
    208.     }  
    209. }  
    210.   
    211. public class MQTest {  
    212.   
    213.     public static void main(String args[]) {  
    214.   
    215.         /* 
    216.          * MQTest first = new MQTest(); first.sendMessage(); 
    217.          * first.recvMessage(); 
    218.          */  
    219.         Sender sender = new Sender();  
    220.         Thread senderThread = new Thread(sender);  
    221.         senderThread.start();  
    222.         senderThread.setName("Sender");  
    223.           
    224.         Thread senderThread2 = new Thread(sender);  
    225.         senderThread2.start();  
    226.         senderThread2.setName("Sender2");  
    227.           
    228.         Receiver recv = new Receiver();  
    229.         Thread recvThread = new Thread(recv);  
    230.         recvThread.start();  
    231.         recvThread.setName("Receiver");  
    232.   
    233.         // Receiver recv = new Receiver();  
    234.         // new Thread(recv).start();  
    235.   
    236.     }  
    237.   
    238. }  


    運行結果如下:

    進入線程Sender2
    進入線程Sender
    Sender2 Connecting to queue manager: XIR_QM_1502
    Sender Connecting to queue manager: XIR_QM_1502
    Sender2 Accessing queue: ESBREQ
    Sender2 Sending a message...
    Sender Accessing queue: ESBREQ
    Sender Sending a message...
    Sender2 putting the message... 1
    Sender putting the message... 1
    Sender2 putting the message... 2
    Sender putting the message... 2
    Sender2 putting the message... 3
    Sender putting the message... 3
    Sender2 putting the message... 4
    Sender putting the message... 4
    Sender2 Done!
    ==========


    Sender Done!
    ==========


    進入線程Receiver
    Receiver Connecting to queue manager: XIR_QM_1502
    Receiver Accessing queue: ESBREQ
    ... Receiver getting the message back again
     ID: MSGID Num: 1 Type: 1 Flag: 0
    The message is: Salemetsizbe Yerasel 1
     ID: MSGID Num: 1 Type: 1 Flag: 0
    The message is: Salemetsizbe Yerasel 1
     ID: MSGID Num: 1 Type: 1 Flag: 0
    The message is: Salemetsizbe Yerasel 2
     ID: MSGID Num: 1 Type: 1 Flag: 0
    The message is: Salemetsizbe Yerasel 2
     ID: MSGID Num: 1 Type: 1 Flag: 0
    The message is: Salemetsizbe Yerasel 3
     ID: MSGID Num: 1 Type: 1 Flag: 0
    The message is: Salemetsizbe Yerasel 3
     ID: MSGID Num: 1 Type: 1 Flag: 0
    The message is: Salemetsizbe Yerasel 4
     ID: MSGID Num: 1 Type: 1 Flag: 0
    The message is: Salemetsizbe Yerasel 4
    Receiver Closing the queue
    Receiver Disconnecting from the Queue Manager
    Receiver Done!

    posted @ 2015-08-26 12:07 gdufo| 編輯 收藏

    2015年3月19日

    Linux 下 安裝 PHP 的 PDO_MYSQL 擴展

    Linux 下 安裝 PHP 的 PDO_MYSQL 擴展

    2013 年 3 月 11 日 – 09:41 | 2,420 views | Favorite收藏
    1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)

    PDO_MYSQL以下操作都在Linux 系統下操作

    1、下載 文件 或者 進入 在PHP源碼包中進入ext/pdo_mysql

    http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz

    2、解壓文件
    tar zxvf PDO_MYSQL-1.0.2.tgz

    3、配置和編譯文件
    #cd PDO_MYSQL-1.0.2
    #/usr/local/php5/bin/phpize
    #./configure –with-php-config=/usr/local/php5/bin/php-config –with-pdo-mysql=/usr/local/mysql
    #make
    #make install

    注: 我的PHP安裝在 : /usr/local/php5/ mysql 安裝在 : /usr/local/mysql 編譯的時候注意你自己的安裝目錄在哪里
    3、安裝到PHP配置下

    把這個記住,然后打開 php.ini文件,
    并添加一行

    extension=pdo_mysql.so

    并將上面編譯產生的so復制到 php.ini文件中extension_dir指定的目錄中

    重新啟動!

    posted @ 2015-03-19 10:30 gdufo| 編輯 收藏

    Linux下php安裝mcrypt擴展

    說明:

    操作系統:CentOS 5.x 64位

    已安裝php版本:php-5.4.4

    已安裝php路徑:/usr/local/php

    實現目的:

    在不影響網站訪問的情況下,重新編譯php,增加對mcrypt擴展的支持

    具體操作:

    一、下載軟件包

    1、下載php版本要與系統安裝的一致

    http://museum.php.net/php5/php-5.4.4.tar.gz

    2、下載libmcrypt安裝mcrypt需要此軟件包

    http://nchc.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz

    3、下載mhash安裝mcrypt需要此軟件包

    https://acelnmp.googlecode.com/files/mhash-0.9.9.9.tar.gz

    4、下載mcrypt

    https://lcmp.googlecode.com/files/mcrypt-2.6.8.tar.gz

    以上軟件包下載之后,上傳到/usr/local/src目錄

    二、安裝軟件包

    1、安裝libmcrypt

    cd /usr/local/src  #進入軟件包存放目錄

    tar zxvf libmcrypt-2.5.8.tar.gz  #解壓

    cd libmcrypt-2.5.8  #進入安裝目錄

    ./configure  #配置

    make  #編譯

    make install  #安裝

    2、安裝mhash

    cd /usr/local/src

    tar zxvf mhash-0.9.9.9.tar.gz

    cd mhash-0.9.9.9

    ./configure

    make

    make install

    3、安裝mcrypt

    cd /usr/local/src

    tar zxvf mcrypt-2.6.8.tar.gz

    cd mcrypt-2.6.8

    ln -s   /usr/local/bin/libmcrypt_config   /usr/bin/libmcrypt_config  #添加軟連接

    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH  #添加環境變量

    ./configure

    make

    make install

    三、重新編譯php

    1、查看系統之前安裝的php編譯參數

    系統運維  www.osyunwei.com  溫馨提醒:qihang01原創內容 版權所有,轉載請注明出處及原文鏈接

    /usr/local/php/bin/php -i |grep configure  #查看php編譯參數,記錄下編譯參數,后面會用到

    2、安裝php

    cd /usr/local/src

    tar zxvf php-5.4.4.tar.gz

    cd php-5.4.4

    './configure' '--prefix=/usr/local/php' '--enable-mbstring=all' '--with-config-file-path=/usr/local/php/etc' '--with-zlib' '--with-mysql=/usr/local/mysql-5.1.38/' '--with-gd' '--with-mysqli=/usr/local/mysql-5.1.38/bin/mysql_config' '--with-jpeg-dir=/usr' '--with-png-dir=/usr' '--enable-fpm' '--enable-soap' '--with-freetype-dir=/usr/lib64' '--with-iconv=/usr/local' '--with-curl' '--with-mcrypt'

    #在之前的編譯參數后面增加'--with-mcrypt' 回車

    make  #編譯

    make install  #安裝

    /usr/local/src/php-5.4.4/sapi/fpm/init.d.php-fpm  reload  #重新加載php-fpm

    四、測試mcrypt擴展是否已安裝成功

    在網站目錄下新建一個info.php測試頁面,寫上下面代碼,保存

    <?php

    phpinfo();

    ?>

    在瀏覽器中打開info.php 會看到如下的信息

    說明mcrypt擴展已經安裝成功

    至此,Linux下php安裝mcrypt擴展完成。

    posted @ 2015-03-19 10:20 gdufo| 編輯 收藏

    2015年1月23日

    OutLook中看不到圖片

    注冊表中查看outlook臨時目錄
    HK_CURRENT_USER\software\microsoft\Office\11.0\Outlook\Security\OutlookSecureTempFolder
    查看鍵值 OutlookSecureTempFolder
    C:\Documents and Settings\li.shi\Local Settings\Temporary Internet Files\OLK11\

    刪除臨時目錄下文件即可

    posted @ 2015-01-23 08:23 gdufo 閱讀(513) | 評論 (0)編輯 收藏

    2014年3月19日

    RedHat Linux6.0安裝Oracle 11g單機

    RedHat Linux6.0安裝Oracle 11g單機

     

    Ø 第一步配置YUM倉庫

    1、 掛載光盤

    mount /dev/cdrom /media

    2、 復制光盤里頭的rpm包到rpm包源目錄

    cp rf  /media/Packages  /mnt (也可以直接通過桌面COPY)

    (這里可以取消掛在了 umount /dev/cdrom,順便刪除media目錄 rm rf /media)

     

    3、 進入你自己創建的YUM倉庫,并安裝createrepo工具

    cd /mnt/Packages

    rpm ivh createrepo-0.4.11-3.e15.noarch.rpm(可以在桌面手動雙擊安裝)

    4、 重建倉庫信息配置文件

    createrepo  /mnt  (這個配置文件在 /mnt/repodata/下)

     

    5、 創建YUM配置文件

    cd  /etc/yum.repos.d/

    touch yumredhat.repo

    vim yumredhat.repo

    添加如下信息:

    [rhel6]

    name=Red Hat Enterprise Linux6

    baseurl=file:///mnt

    enabled=1

    gpgcheck=0

    gpgfile=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

     

    6、測試

    yum list

    yum clear all

     

    Ø 第二步Oracle安裝前系統參數的配置以及包的安裝

     

    (安裝Oracle必須關閉掉防火墻以及selinux)

    service iptables stop      

    vim /etc/selinux/config

    SELINUX=disabled

     

    ========================

    想辦法把下面2個文件傳進 Linux 操作系統里面去

    linux_11gR2_database_1of2.zip

    linux_11gR2_database_2of2.zip

    要借助一個軟件 FileZilla_3.3.3_win32-setup.exe  

    上傳完畢后, 使用 unzip 命令解壓剛才上傳的2個文件, 命令格式如下:

    unzip 文件名

     

    ======================================

    檢查相關的開發工具和一些包

    檢查命令格式如下:

    rpm -qa | grep 名字

     

    binutils-2.17.50.0.6

    compat-libstdc++-33-3.2.3

    elfutils-libelf-0.125

    elfutils-libelf-devel-0.125

    #elfutils-libelf-devel-static-0.125 (RedHat Linux6.0中無此包,CentOS中有)

    gcc-4.1.2

    gcc-c++-4.1.2

    glibc-2.5-24

    glibc-common-2.5

    glibc-devel-2.5

    glibc-headers-2.5

    kernel-headers-2.6.18

    ksh-20060214

    libaio-0.3.106 

    libaio-devel-0.3.106

    libgcc-4.1.2

    libgomp-4.1.2

    libstdc++-4.1.2

    libstdc++-devel-4.1.2

    make-3.81  

    numactl-devel-0.9.8.i386  

    sysstat-7.0.2

    unixODBC-2.2.11 

    unixODBC-devel-2.2.11

    ======================================

    利用配置好的YUM倉庫安裝包

    yum install (包名).rpm

    創建用戶以及修改配置參數

    groupadd oinstall

    groupadd dba

    mkdir -p /u01/oracle     //路徑可修改,看實際的生產環節

     

    添加一個oracle用戶, 根目錄是 /u01/oracle, 主的組是 oinstall 副的組是dba

    useradd -g oinstall -G dba -d /u01/oracle oracle

    cp /etc/skel/.bash_profile /u01/oracle

    cp /etc/skel/.bashrc /u01/oracle

    cp /etc/skel/.bash_logout /u01/oracle

     

    為oracle用戶設置密碼 123456   /111111

    passwd oracle

    /]#ls -l

    /]#chown -R oracle:oinstall u01

    /]#ls -l

     

    檢查 nobody 是否存在 ,  id nobody

    缺省存在的。如果不存在 # /usr/sbin/useradd -g nobody

    ========================================

    vi /etc/sysctl.conf

    fs.aio-max-nr = 1048576

    fs.file-max = 6815744

    kernel.shmall = 2097152

    kernel.shmmax = 536870912

    kernel.shmmni = 4096

    kernel.sem = 250 32000 100 128

    net.ipv4.ip_local_port_range = 9000 65500

    net.core.rmem_default = 262144

    net.core.rmem_max = 4194304

    net.core.wmem_default = 262144

    net.core.wmem_max = 1048586

    -------------

    vi /etc/security/limits.conf

     

    oracle           soft    nproc   2047

    oracle           hard    nproc   16384

    oracle           soft    nofile  1024

    oracle           hard    nofile  65536

    ------------

    vi /etc/pam.d/login 

    session    required     pam_limits.so

    =================================================

    設置oracle 用戶環境變量

    su - oracle

    pwd

    ls -la

    ---------------

    vi .bash_profile

     

    ORACLE_BASE=/u01

    ORACLE_HOME=$ORACLE_BASE/oracle

    ORACLE_SID=ORCLTEST

    PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin

     

    export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH

    ===================================

    mv database /u01/

    cd /u01

    ls -l

     chown -R oracle:oinstall database/

    ===========

     

    Ø 第三步正式開始安裝.Oracle.11g.r2(圖形界面安裝)

     

    使用oracle賬號 登陸圖形界面 進行安裝

    運行終端 Terminal

    cd /u01/database

    ./runInstaller

    運行./runInstallerINS-06101IP address of localhost could not be determined 

    Are you sure you want to continue?

    這里需要指定一個IP與localhost

    Vi /etc/hosts

    #127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

    10.110.12.132 ORCLDEV  ORCLDEV.ELLINGTON

    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

     

    運行./runInstaller出現中文漢字為方框

    在運行runinstaller之前,

    export LANG=C

    export LC_ALL=C

     

    Installation Optiong

    install database software only

     

    Grid Options

    Single instance database installation

     

    Product Languages

    English

     

    Database Edition

    Enterprise Edition (3.95)

     

    Installation Location

    Oracle Base: /u01

    Software Loacation: /u01/oracle

     

    提示: yes

     

    Create Inventory

    mkdir /oraInventory

     

    chown -R oracle:oinstall oraInventory

     

    Operating System Groups

    Next 

     

    Prerequis ite Checks

    Ignore All

     

    Summary

    Finish

     

    Install Product

    安裝完畢, 提示執行 2個腳本

    //root用戶執行

    /oraInventory/orainstRoot.sh

    /u01/oracle/root.sh

    直接按回車, 缺省值就可以

     

    Finish

    The installation of Oracle Database was successful

    ====================================

    上面只是安裝了軟件, 數據庫沒有創建, 還有配置 監聽器 Listener

    netca

    一直默認下一步 , 呵呵, 最后 Finish

     

    ps -ef 可以查看Listener是否配置成功

     

    -----------

    dbca

    一直 Next, Global Database Name 和 SID 都是輸入 wilson

     

    選擇 User the Same.....All Accounts

     

    密碼: 123456

    選擇 Sample Schemas

     

    Memory 內存分配,默認就可以了

    Character Sets 選擇 中文GBK  Use Unicode(AL32UTF8)

     

    然后一直 Next , 到最后 Finish

     

    彈出一個 Confirmation , 點擊 OK 就可以了, 然后自動進行安裝

     

    安裝到目錄 /u01/oradata/wilson

       /u01/等等。。。 會發現多了很多文件。

     

    [oracle@localhost ~]$ sqlplus /nolog

     

    //中文字符顯示?號解決方法

    編輯并運行.bash_profile

     

    export NLS_LANG=AMERICAN_AMERICA.UTF8

    (如果是GBK     

    export NLS_LANG=american_america.ZHS16GBK)

    export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

    注銷后生效

    這樣再重新進入sqlplus

    已經不會是亂碼。

     

    SQL*Plus: Release 11.2.0.1.0 Production on Fri Jun 25 15:05:54 2010

     

    Copyright (c) 1982, 2009, Oracle.  All rights reserved.

     

    SQL> conn / as sysdba

    Connected to an idle instance.

    出現錯誤 

     

    SQL> startup

     

    查看當前用戶的表名

    SQL> select table_name from user_tables;

     

    SQL> create table testUser( id integer,name char(10));

     

    Table created.

     

    SQL> insert into testUser values(0,'Jack');

     

    1 row created.

     

    SQL> commit;

     

    Commit complete.

     

    SQL> select * from testUser;

     

            ID NAME

    ---------- ----------

             0 Jack

     

    關閉數據庫

    SQL>  shutdown immediate

     

    SQL>  quit

     

    posted @ 2014-03-19 10:41 gdufo 閱讀(1554) | 評論 (0)編輯 收藏

    2014年2月27日

    SQL-Server查詢失效索引

    SELECT  TOP 10
            [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
            , avg_user_impact
            , TableName = statement
            , [EqualityUsage] = equality_columns
            , [InequalityUsage] = inequality_columns
            , [Include Cloumns] = included_columns
    FROM        sys.dm_db_missing_index_groups g
    INNER JOIN    sys.dm_db_missing_index_group_stats s
           ON s.group_handle = g.index_group_handle
    INNER JOIN    sys.dm_db_missing_index_details d
           ON d.index_handle = g.index_handle
    ORDER BY [Total Cost] DESC;
    ================================
    CREATE NONCLUSTERED INDEX IX_Kq_RecordQk_QKRMan
         ON Kq_RecordQk ([QKRMan])
         include([COMP_CODE], [QKREMPID], [ApStatus])

    posted @ 2014-02-27 08:53 gdufo 閱讀(982) | 評論 (0)編輯 收藏

    2014年1月27日

    mysql配置參數性能優化選項:Max_connections特性和配置優化

    http://www.itokit.com/2012/1018/74794.html

    MySQL的max_connections參數用來設置最大連接(用戶)數。每個連接MySQL的用戶均算作一個連接,max_connections的默認值為100。本文將講解此參數的詳細作用與性能影響。
    max_connections配置參數的相關的特性
    1、MySQL無論如何都會保留一個用于管理員(SUPER)登陸的連接,用于管理員連接數據庫進行維護操作,即使當前連接數已經達到了max_connections。因此MySQL的實際最大可連接數為max_connections+1;
    2、這個參數實際起作用的最大值(實際最大可連接數)為16384,即該參數最大值不能超過16384,即使超過也以16384為準;
    3、增加max_connections參數的值,不會占用太多系統資源。系統資源(CPU、內存)的占用主要取決于查詢的密度、效率等;
    4、該參數設置過小的最明顯特征是出現“Too many connections”錯誤;
     
    如何去調整max_connections參數的值有以下三個方法可調整
    調整此參數的方法有幾種,既可以在編譯的時候設置,也可以在MySQL配置文件 my.cnf 中設置,也可以直接使用命令調整并立即生效。
     
    1、在編譯的時候設置默認最大連接數
    打開MySQL的源碼,進入sql目錄,修改mysqld.cc文件:
    C/C++ Code復制內容到剪貼板
    1. {“max_connections”, OPT_MAX_CONNECTIONS,  
    2. “The number of simultaneous clients allowed.”, (gptr*) &max_connections,  
    3. (gptr*) &max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,  
    4. 0},  
    紅色的“100”即為該參數的默認值,修改為想要的數值,存盤退出。然后執行
    C/C++ Code復制內容到剪貼板
    1. ./configure;make;make install  
     
    重新編譯安裝MySQL;注意,由于編譯安裝且修改了MySQL源碼,此操作最好在安裝MySQL之前進行;

    2、在配置文件my.cnf中設置max_connections的值
    打開MySQL配置文件my.cnf
    1. [root@www ~]# vi /etc/my.cnf  
     
    找到max_connections一行,修改為(如果沒有,則自己添加),
    max_connections = 1000
    上面的1000即該參數的值。
     
    3、實時(臨時)修改此參數的值
    首先登陸mysql,執行如下命令:
    C/C++ Code復制內容到剪貼板
    1. [root@www ~]# mysql -uroot -p  
     
    然后輸入MySQL Root的密碼。
    查看當前的Max_connections參數值:
    1. mysql> SELECT @@MAX_CONNECTIONS AS 'Max Connections';  
     
    設置該參數的值:
    1. mysql> set GLOBAL max_connections=1000;  
    (注意上面命令的大小寫)
    修改完成后實時生效,無需重啟MySQL。

    mysql的max_connections的總結
    總體來說,該參數在服務器資源夠用的情況下應該盡量設置大,以滿足多個客戶端同時連接的需求。否則將會出現類似“Too many connections”的錯誤。

    posted @ 2014-01-27 15:12 gdufo 閱讀(1038) | 評論 (1)編輯 收藏

    2013年11月15日

    SPComm的一點小訣竅 spcomm的問題導致數據丟失

    SPComm的一點小訣竅 spcomm的問題導致數據丟失  

    2010-01-08 09:50:51|  分類: 串口 |字號 訂閱

    最近幾天完成了BiasDAC的程序編寫。調試的過程還算比較順利,除了幾個有點bt的小問題。其中一個困擾了我兩三天的時間,今天上午終于將其解決。

    由于BiasDAC是用RS232 Serial Port通信的,延用之前的程序,使用了Delphi的SPComm控件。在之前的使用中,SPComm控件一直工作正常,使用的是一般的string進行消息的傳遞。

    而BiasDAC由于通信協議的限制,消息的發送使用的是hex方式,會用到從0x00到0xFF所有的這些字符。在調試中發現,發送0x11和0x13之后,SPComm的工作就會不正常。

    首先是0x11發送之后,返回的0x11消息會被忽略;其次0x13發送之后,只能返回很有限的消息,而且似乎Serial Port就此關閉,如果再發送消息,就會造成Serial Port失去響應,只能通過重新啟動計算機才能恢復。

    后來上網上查詢,原來不能正常處理0x11和0x13的問題早就存在,原因是SPComm空間中兩個屬性的存在。

    OutX_XonXOffFlow/InX_XonXoffFlow:這個屬性是指進行發送/接收時的軟件握手標志,兩個握手信號之間的數據被認為是通訊數據,收到握手信號后,通訊就中止了。

    FOutx_XonXoffFlow := True;
    FInx_XonXoffFlow := True;

    默認的初始化中,這兩個屬性是默認開啟的。

    XOffChar/XOnChar:這是指握手的字節,默認的初始中,有

    FXonChar := chr($11);
    FXoffChar := chr($13);

    至此,真相大白。0x11,0x13被占用為通訊握手信號,自然不會得到正確的處理。

    問題找到了,解決也很容易。只需要在Comm的初始化中,自己定義

    Comm.Inx_XonXoffFlow:=False;
    Comm.Outx_XonXoffFlow:=False;

    關閉軟件握手功能即可。在一般通訊中,硬件已經具備了握手功能,所以也不會影響到正常的Comm通訊。

    posted @ 2013-11-15 11:13 gdufo 閱讀(681) | 評論 (0)編輯 收藏

    2013年10月30日

    通達OA中,“數據選擇控件”中增加第三方的數據來源

    在通達OA2009中,“數據選擇控件”目前只有自帶的三種類型數據。

    現增加第三方的數據來源,以增強其功能。

    一、MYOA\webroot\general\system\workflow\flow_form\cool_form\data\config.php
    在Config.php 增加
    'TX_USERS' => array("NAME" => "同享系統用戶" , "CONTENT" => array("EMP_NAME" => "工號姓名",
       "DEPT_NAME" => "部門","ZHIWEI" => "職位","ZHIWU" => "職務","ZHIJI" => "職級"))
    二、MYOA\webroot\general\workflow\list\input_form

    增加連接MSSQL-SERVER的輸出
    if ($dataSrc == 'TX_USERS') {
    if($act=="count")
       $query = "select count(*) from OA_Employee_View where 1=1";
    else
       $query = "select top 10 $dataField from OA_Employee_View where 1=1";

    if(strstr($dataQuery,"1,"))
    {
      $array1 = explode(",",$dataQuery);
      $array2 = explode(",",$dataField);
      $array3 = explode(",",$dataFieldName);

      foreach($array1 as $k => $v)
      {
       if($v==1)
       {
        $name = $array2[$k];
        $value = $$name;
        if($value!="")
           $query .= " and $name like '%$value%'";
       }
      }
    }
      $txconn=mssql_connect($MSSQL_TX_SERVER,$MSSQL_TX_USER,$MSSQL_TX_PASS);
      mssql_select_db($MSSQL_TX_DB,$txconn);
      if($act=="count")
      {
      $cursor = mssql_query($query);
     if($ROW=mssql_fetch_array($cursor))
        $COUNT=$ROW[0];
     echo $COUNT;
     exit;
    }

    $cursor = mssql_query($query);
    $COUNT=0;
    $dataField_arr = explode(",",$dataField);
    $dataFieldName_arr = explode(",",$dataFieldName);
    while($ROW=mssql_fetch_array($cursor))
    {
      $COUNT++;
       if($COUNT%2==1)
          $TableLine="TableLine1";
       else
          $TableLine="TableLine2"; 
       foreach($dataField_arr as $k=> $v)
       {
         if($v=="") continue;
         if($COUNT==1)
         {
           if($k==0)
              $thead.='<table class="TableList" align="center" width="90%"><tr class="TableHeader">';
           $thead.='<td nowrap align="center">'.$dataFieldName_arr[$k].'</td>';
         }
         if($k==0)
           $tbody.='<tr class="'.$TableLine.'">';
         $tbody.='<td nowrap align="center">'.$ROW[$v].'</td>';
       }
      
       if($COUNT==1) $thead.='<td nowrap align="center">操作</td></tr>';
       $tbody.='<td nowrap align="center"> <a href="#" class="orgAdd" onclick="addData(this)">添加</a></td></tr>';
    }
    $tbody.="</table>";
    echo $thead.$tbody;

    posted @ 2013-10-30 11:03 gdufo 閱讀(1742) | 評論 (0)編輯 收藏

    僅列出標題  下一頁

    導航

    統計

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    Hibernate

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本道免费精品一区二区| 亚洲噜噜噜噜噜影院在线播放| 免费大片黄手机在线观看| 最新仑乱免费视频| 日韩中文字幕精品免费一区| 免费无码VA一区二区三区| 免费日本一区二区| 全免费a级毛片免费看| 91在线视频免费观看| 在线观看免费黄色网址| 国产激情久久久久影院老熟女免费| 精品成人一区二区三区免费视频| 亚洲.国产.欧美一区二区三区| 亚洲av无码一区二区三区在线播放 | 在线播放国产不卡免费视频| 午夜成人无码福利免费视频| 一级毛片在播放免费| av午夜福利一片免费看久久| 狠狠躁狠狠爱免费视频无码| 你是我的城池营垒免费看| 成全在线观看免费观看大全| 国产白丝无码免费视频| 99视频有精品视频免费观看| 亚洲精品视频在线观看免费| 免费下载成人电影| 成人五级毛片免费播放| 国产zzjjzzjj视频全免费 | 曰批全过程免费视频网址| 免费视频爱爱太爽了| 午夜两性色视频免费网站| 又粗又大又硬又爽的免费视频 | 国产人在线成免费视频| 热久久精品免费视频| 亚洲午夜福利精品无码| 亚洲色图国产精品| 亚洲免费福利在线视频| 爱爱帝国亚洲一区二区三区| 国产性生大片免费观看性| 天天影院成人免费观看| 四虎永久免费网站免费观看| 国产精品亚洲аv无码播放|