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

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

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

    paulwong

    #

    ANDROID APP 與 WEB APP的比較

    ANDROID APP 與 WEB APP有相似之處,都是需要在容器內運行,都可以對事件進行響應。

    WEB APP的核心組件是SERVLET,這是對游覽器事件進行響應的一個類,事件有GET/POST等事件,不同的URL對應不同的SERVLET。
    如果要輸出不同的內容,則輸出不同的HTML即可。
    WEB APP的配置文件是WEB.XML,當容器啟動時,會從這讀取有多少個SERVLET。當瀏覽器發過來不同的URL請求時,會從中選擇相應的SERVLET執行。

    ANDROID APP的核心組件是ACTIVITY,這是一個對系統事件進行響應的一個類,事件有啟動事件,菜單點擊事件等,點擊不同的地方對應不同的ACTIVITY。
    如果要輸出不同的內容,則輸出不同的VIEW即可。
    ANDROID APP的配置文件是MAINFRE.XML,當應用被部署到系統時,系統會從這讀取有多少個ACTIVITY。當不同的事件發生時,系統會會從中選擇相應的ACTIVITY執行。

    posted @ 2013-05-26 00:59 paulwong 閱讀(375) | 評論 (0)編輯 收藏

    Architecture Representation

    The architecture representation will basically adopt the 4 + 1 View Model as 
    recommended, to organize the architectural description from different perspectives, each 
    of which addresses a specific set of concerns: 
    • Requirement View – describes the software requirements, functional and 
    non-functional, illustrated by significant use cases and scenarios. 

    • Logical View – describes the object model of the design, the system 
    decomposition into layers and subsystems, and the dependencies between them. 

    • Process View – describes the concurrency and synchronization aspects of the 
    design. 

    • Implementation View – describes the software’s static organization in the 
    development environment. 

    • Deployment View – describes the mapping of the software onto hardware. 

    • Data View – describes the database design for the software. 

    It allows various stakeholders to find what they need in the software architecture. System 
    engineers can approach it from the logical view, process view and deployment view. DBA 
    can approach it from the data view. Project managers and software configuration 
    managers can approach it from the development view.


    Demo:
    • CUHK RFID - White Paper 

    • Middleware Quick Start Guide 

    • Tag Capturer Quick Start Guide 

    • Middleware System Design Document 

    • Tag Capturer System Design Document 

    • Middleware Test Cases 

    • Middleware Test Plan 

    • Middleware Source Code 

    posted @ 2013-05-21 11:02 paulwong 閱讀(216) | 評論 (0)編輯 收藏

    MINA資源

    socket 通信
    http://yaojialing.iteye.com/category/115609

    使用 Apache MINA 2 開發網絡應用
    http://www.ibm.com/developerworks/cn/java/j-lo-mina2/

    直接操作mina的IoBuffer流
    http://autumnice.blog.163.com/blog/static/555200201011493410310/

    pache mina 學習(十一)-----狀態機(stateMachine)
    http://cages.iteye.com/blog/1530849

    運用 Apache MINA 2 開發網絡運用 [多圖]
    http://www.lj8lj8.com/chengxukaifa/Java/338853_13.html


    posted @ 2013-05-14 17:41 paulwong 閱讀(321) | 評論 (0)編輯 收藏

    Oracle數據庫備份與還原命令[轉]

    數據導出:

    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 owner=(system,sys)

    3 將數據庫中的表table1 、table2導出

    exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)

    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

    上面可能有點問題,因為有的表已經存在,然后它就報錯,對該表就不進行導入。

    在后面加上 ignore=y 就可以了。

    2 將d:\daochu.dmp中的表table1 導入

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

    基本上上面的導入導出夠用了。不少情況我是將表徹底刪除,然后導入。

    注意:

    你要有足夠的權限,權限不夠它會提示你。

    數據庫時可以連上的。可以用tnsping TEST 來獲得數據庫TEST能否連上

    附錄一:
    給用戶增加導入數據權限的操作
    第一,啟動sql*puls
    第二,以system/manager登陸
    第三,create user 用戶名 IDENTIFIED BY 密碼 (如果已經創建過用戶,這步可以省略)
    第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
    DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
    DBA,CONNECT,RESOURCE,CREATE SESSION TO 用戶名字
    第五, 運行-cmd-進入dmp文件所在的目錄,
    imp userid=system/manager full=y file=*.dmp
    或者 imp userid=system/manager full=y file=filename.dmp



    安裝oracle9I
    Szportdb\szportdb\szportdb
    用sysdba 登錄建立用戶:szportdb 表空間可以自己設定,也可以Users
    倒入數據庫。

    Imp szportdb/szportdb@szportdb full=y C:\szportdb.dmp ignore=

    posted @ 2013-05-12 15:07 paulwong 閱讀(1799) | 評論 (0)編輯 收藏

    基于Apache Mina實現的TCP長連接和短連接實例

    1、前言

    Apache MINA是Apache組織的一個優秀的項目。MINA是Multipurpose Infrastructure for NetworkApplications的縮寫。它是一個網絡應用程序框架,用來幫助用戶非常方便地開發高性能和高可靠性的網絡應用程序。在本文中介紹了 如何通過Apache Mina2.0來實現TCP協議長連接和短連接應用。

    2、系統介紹

    2.1系統框架

    整個系統由兩個服務端程序和兩個客戶端程序組成。分別實現TCP長連接和短連接通信。

    系統業務邏輯是一個客戶端與服務端建立長連接,一個客戶端與服務端建立短連接。數據從短連接客戶端經過服務端發送到長連接客戶端,并從長連接客戶端接收響應數據。當收到響應數據后斷開連接。

    系統架構圖如下:


    2.2處理流程

    系統處理流程如下:

    1) 啟動服務端程序,監聽8001和8002端口。

    2) 長連接客戶端向服務端8002端口建立連接,服務端將連接對象保存到共享內存中。由于采用長連接方式,連接對象是唯一的。

    3) 短連接客戶端向服務端8001端口建立連接。建立連接后創建一個連接對象。

    4) 短連接客戶端連接成功后發送數據。服務端接收到數據后從共享內存中得到長連接方式的連接對象,使用此對象向長連接客戶端發送數據。發送前將短連接對象設為長連接對象的屬性值。

    5) 長連接客戶端接收到數據后返回響應數據。服務端從長連接對象的屬性中取得短連接對象,通過此對象將響應數據發送給短連接客戶端。

    6) 短連接客戶端收到響應數據后,關閉連接。

    3、服務端程序

    3.1長連接服務端

    服務啟動

    public class MinaLongConnServer {

    private static final int PORT = 8002;



    public void start()throws IOException{

    IoAcceptor acceptor = new NioSocketAcceptor();



    acceptor.getFilterChain().addLast("logger", new LoggingFilter());

    acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



    acceptor.setHandler(new MinaLongConnServerHandler());

    acceptor.getSessionConfig().setReadBufferSize(2048);

    acceptor.bind(new InetSocketAddress(PORT));

    System.out.println("Listeningon port " + PORT);

    }

    }

    //消息處理

    public class MinaLongConnServerHandler extends IoHandlerAdapter {

    private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



    @Override

    public void sessionOpened(IoSession session) {

    InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();

    String clientIp = remoteAddress.getAddress().getHostAddress();

    logger.info("LongConnect Server opened Session ID ="+String.valueOf(session.getId()));

    logger.info("接收來自客戶端 :" + clientIp + "的連接.");

    Initialization init = Initialization.getInstance();

    HashMap<String, IoSession> clientMap =init.getClientMap();

    clientMap.put(clientIp, session);

    }



    @Override

    public void messageReceived(IoSession session, Object message) {

    logger.info("Messagereceived in the long connect server..");

    String expression = message.toString();

    logger.info("Message is:" + expression);

    IoSession shortConnSession =(IoSession) session.getAttribute("shortConnSession");

    logger.info("ShortConnect Server Session ID ="+String.valueOf(shortConnSession.getId()));

    shortConnSession.write(expression);

    }



    @Override

    public void sessionIdle(IoSession session, IdleStatus status) {

    logger.info("Disconnectingthe idle.");

    // disconnect an idle client

    session.close(true);

    }



    @Override

    public void exceptionCaught(IoSession session, Throwable cause) {

    // close the connection onexceptional situation

    logger.warn(cause.getMessage(), cause);

    session.close(true);

    }

    }

    3.2短連接服務端

    服務啟動

    public class MinaShortConnServer {

    private static final int PORT = 8001;



    public void start()throws IOException{

    IoAcceptor acceptor = new NioSocketAcceptor();



    acceptor.getFilterChain().addLast("logger", new LoggingFilter());

    acceptor.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



    acceptor.setHandler(new MinaShortConnServerHandler());

    acceptor.getSessionConfig().setReadBufferSize(2048);

    acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);

    acceptor.bind(new InetSocketAddress(PORT));

    System.out.println("Listeningon port " + PORT);

    }

    }

    消息處理

    public class MinaShortConnServerHandler extends IoHandlerAdapter {

    private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



    @Override

    public void sessionOpened(IoSession session) {

    InetSocketAddress remoteAddress = (InetSocketAddress)session.getRemoteAddress();

    logger.info(remoteAddress.getAddress().getHostAddress());

    logger.info(String.valueOf(session.getId()));

    }



    @Override

    public void messageReceived(IoSession session, Object message) {

    logger.info("Messagereceived in the short connect server");

    String expression = message.toString();

    Initialization init = Initialization.getInstance();

    HashMap<String, IoSession> clientMap =init.getClientMap();

    if (clientMap == null || clientMap.size() == 0) {

    session.write("error");

    else {

    IoSession longConnSession = null;

    Iterator<String> iterator =clientMap.keySet().iterator();

    String key = "";

    while (iterator.hasNext()) {

    key = iterator.next();

    longConnSession = clientMap.get(key);

    }

    logger.info("ShortConnect Server Session ID :"+String.valueOf(session.getId()));

    logger.info("LongConnect Server Session ID :"+String.valueOf(longConnSession.getId()));

    longConnSession.setAttribute("shortConnSession",session);

    longConnSession.write(expression);

    }

    }



    @Override

    public void sessionIdle(IoSession session, IdleStatus status) {

    logger.info("Disconnectingthe idle.");

    // disconnect an idle client

    session.close(true);

    }



    @Override

    public void exceptionCaught(IoSession session, Throwable cause) {

    // close the connection onexceptional situation

    logger.warn(cause.getMessage(), cause);

    session.close(true);

    }

    }



    4、客戶端程序

    4.1長連接客戶端

    使用java.net.Socket來實現向服務端建立連接。Socket建立后一直保持連接,從服務端接收到數據包后直接將原文返回。

    public class TcpKeepAliveClient {

    private String ip;

    private int port;

    private static Socket socket = null;

    private static int timeout = 50 * 1000;



    public TcpKeepAliveClient(String ip, int port) {

    this.ip = ip;

    this.port = port;

    }



    public void receiveAndSend() throws IOException {

    InputStream input = null;

    OutputStream output = null;



    try {

    if (socket == null || socket.isClosed() || !socket.isConnected()) {

    socket = new Socket();

    InetSocketAddress addr = new InetSocketAddress(ip, port);

    socket.connect(addr, timeout);

    socket.setSoTimeout(timeout);

    System.out.println("TcpKeepAliveClientnew ");

    }



    input = socket.getInputStream();

    output = socket.getOutputStream();



    // read body

    byte[] receiveBytes = {};// 收到的包字節數組

    while (true) {

    if (input.available() > 0) {

    receiveBytes = new byte[input.available()];

    input.read(receiveBytes);



    // send

    System.out.println("TcpKeepAliveClientsend date :" + new String(receiveBytes));

    output.write(receiveBytes, 0, receiveBytes.length);

    output.flush();

    }

    }



    catch (Exception e) {

    e.printStackTrace();

    System.out.println("TcpClientnew socket error");

    }

    }



    public static void main(String[] args) throws Exception {

    TcpKeepAliveClient client = new TcpKeepAliveClient("127.0.0.1", 8002);

    client.receiveAndSend();

    }



    }

    4.2短連接客戶端

    服務啟動

    public class MinaShortClient {

    private static final int PORT = 8001;



    public static void main(String[] args) throws IOException,InterruptedException {

    IoConnector connector = new NioSocketConnector();

    connector.getSessionConfig().setReadBufferSize(2048);



    connector.getFilterChain().addLast("logger", new LoggingFilter());

    connector.getFilterChain().addLast("codec", newProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));



    connector.setHandler(new MinaShortClientHandler());

    for (int i = 1; i <= 10; i++) {

    ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1", PORT));

    future.awaitUninterruptibly();

    IoSession session =future.getSession();

    session.write(i);

    session.getCloseFuture().awaitUninterruptibly();



    System.out.println("result=" + session.getAttribute("result"));

    }

    connector.dispose();



    }

    }

    消息處理

    public class MinaShortClientHandler extends IoHandlerAdapter{

    private final Logger logger = (Logger) LoggerFactory.getLogger(getClass());



    public MinaShortClientHandler() {



    }



    @Override

    public void sessionOpened(IoSession session) {

    }



    @Override

    public void messageReceived(IoSession session, Object message) {

    logger.info("Messagereceived in the client..");

    logger.info("Message is:" + message.toString());

    session.setAttribute("result", message.toString());

    session.close(true);

    }



    @Override

    public void exceptionCaught(IoSession session, Throwable cause) {

    session.close(true);

    }

    }

    5、總結

    通過本文中的例子,Apache Mina在服務端可實現TCP協議長連接和短連接。在客戶端只實現了短連接模式,長連接模式也是可以實現的(在本文中還是采用傳統的java Socket方式)。兩個服務端之間通過共享內存的方式來傳遞連接對象也許有更好的實現方式。

    posted @ 2013-05-11 21:56 paulwong 閱讀(560) | 評論 (0)編輯 收藏

    使用 Apache MINA 開發高性能網絡應用程序[轉]

    本文將通過一個簡單的問候程序 HelloServer 來介紹 MINA 的基礎架構的同時演示如何使用 MINA 開發網絡應用程序。
    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的項目,它為開發高性能和高可用性的網絡應用程序提供了非常便利的框架。當前發行的 MINA 版本支持基于 Java NIO 技術的 TCP/UDP 應用程序開發、串口通訊程序(只在最新的預覽版中提供),MINA 所支持的功能也在進一步的擴展中。

    目前正在使用 MINA 的軟件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

    本文將通過一個簡單的問候程序 HelloServer 來介紹 MINA 的基礎架構的同時演示如何使用MINA 開發網絡應用程序。

    環境準備

    首先到官方網站下載最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html。下載之前先介紹一下 MINA 的兩個版本:1.0.x 適合運行環境為 JDK1.4,1.1.x 適合 JDK1.5 的版本,兩者的編譯環境都需要 JDK1.5。JDK1.5 已經是非常普遍了,本文中使用 1.1.5 版本的 MINA,編譯和運行所需的文件是 mina-core-1.1.5.jar。
    下載 MINA 的依賴包 slf4j。MINA 使用此項目作為日志信息的輸出,而 MINA 本身并不附帶此項目包,請到http://www.slf4j.org/download.html 地址下載 slf4j 包,slf4j 項目解壓后有很多的文件,本例中只需要其中的 slf4j-api-1.4.3.jar 和 slf4j-simple-1.4.3.jar 這兩個 jar 文件。如果沒有這兩個文件就會導致啟動例子程序的時候報 org/slf4j/LoggerFactory 類沒找到的錯誤。
    當然要求機器上必須裝有 1.5 或者更新版本的 JDK。
    最好你應該選擇一個順手的 Java 開發環境例如 Eclipse 或者 NetBeans 之類的,可以更方便的編碼和調試,雖然我們的最低要求只是一個簡單的文本編輯器而已。



    編寫代碼并執行

    編寫代碼 HelloServer.java 如下

    package demo.mina.echo;

    import java.io.IOException;
    import java.net.InetSocketAddress;

    import org.apache.mina.common.*;
    import org.apache.mina.transport.socket.nio.*;
    import org.apache.mina.filter.codec.ProtocolCodecFilter;
    import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

    /**
     * HelloServer演示程序
     * 
    @author liudong (
                        
    http://www.dlog.cn/javayou
                    )
     
    */
    public class HelloServer {

        private static final int PORT = 8080;
    /**
     * 
    @param args
     * 
    @throws IOException 
     
    */
    public static void main(String[] args) throws IOException {
            IoAcceptor acceptor = new SocketAcceptor();        
            IoAcceptorConfig config = new SocketAcceptorConfig();
            DefaultIoFilterChainBuilder chain = config.getFilterChain();
            //使用字符串編碼
            chain.addLast("codec", 
    new ProtocolCodecFilter(new TextLineCodecFactory()));
            //啟動HelloServer
            acceptor.bind(new InetSocketAddress(PORT), new HelloHandler(), config);
            System.out
    .println("HelloServer started on port " + 
    PORT);
        }
    }

    /**
     * HelloServer的處理邏輯
     * 
    @author liudong
     
    */
    class HelloHandler extends IoHandlerAdapter {
    /**
     * 當有異常發生時觸發
     
    */
    @Override
        public void exceptionCaught(IoSession ssn, Throwable cause) {
            cause.printStackTrace();
            ssn.close();
        }

    /**
     * 有新連接時觸發
     
    */
    @Override
    public void sessionOpened(IoSession ssn) throws Exception {
        System.out.println("session open for " + ssn.getRemoteAddress());
        }

    /**
     * 連接被關閉時觸發
     
    */
    @Override
    public void sessionClosed(IoSession ssn) throws Exception {
        System.out.println("session closed from " + ssn.getRemoteAddress());
        }

    /**
     * 收到來自客戶端的消息
     
    */
    public void messageReceived(IoSession ssn, Object msg) throws Exception {    
        String ip = ssn.getRemoteAddress().toString();
    System.out.println("===> Message From " + ip +" : " + msg);    
        ssn.write("Hello " + msg);
        }
    }

    編譯執行
    先不用試著去讀懂每一行代碼的具體意思,用你順手的編譯器編譯 HelloServer.java,如果報錯請確認是否已將前面提到的三個 jar 文件添加至類路徑中。如果一切順利接著就可以啟動HelloServer 程序,啟動后提示:HelloServer started on port 8080 表示啟動成功,如果啟動失敗,問題無外乎是類沒找到或者端口占用。如果端口被占用的話,換一個羅,修改 PORT 常量值后再次編譯并啟動。

    測試服務器
    打開命令行窗口,輸入 telnet localhost 8080 后,輸入您的英文名或者其他一些亂七八糟的字符后回車再去看看剛啟動的服務程序有何反應。我的反應如下:

    HelloServer started on port 8080
    session open for /127.0.0.1:3023
    ===> Message From /127.0.0.1:3023 :hello
    ===> Message From /127.0.0.1:3023 :hello
    ===> Message From /127.0.0.1:3023 :liudong
    ===> Message From /127.0.0.1:3023 :Winter Lau



    好了,一切正常,恭喜你的第一個使用 MINA 開發的網絡程序已經成功運行了。




    MINA 基本類的描述

    在介紹架構之前先認識幾個接口:

    IoAccepter 相當于網絡應用程序中的服務器端

    IoConnector 相當于客戶端

    IoSession 當前客戶端到服務器端的一個連接實例

    IoHandler 業務處理邏輯

    IoFilter 過濾器用于懸接通訊層接口與業務層接口






    MINA 的基礎架構

    下圖是 MINA 的架構圖,


    圖 1:MINA 的架構圖


    在圖中的模塊鏈中,IoService 便是應用程序的入口,相當于我們前面代碼中的 IoAccepter,IoAccepter 便是 IoService 的一個擴展接口。IoService 接口可以用來添加多個 IoFilter,這些 IoFilter 符合責任鏈模式并由 IoProcessor 線程負責調用。而 IoAccepter 在 ioService 接口的基礎上還提供綁定某個通訊端口以及取消綁定的接口。在上面的例子中,我們是這樣使用 IoAccepter 的:

    IoAcceptor acceptor = new SocketAcceptor();



    相當于我們使用了 Socket 通訊方式作為服務的接入,當前版本的 MINA 還提供了除 SocketAccepter 外的基于數據報文通訊的 DatagramAccepter 以及基于管道通訊的 VmPipeAccepter。另外還包括串口通訊接入方式,目前基于串口通訊的接入方式已經在最新測試版的 MINA 中提供。你也可以自行實現 IoService 接口來使用自己的通訊方式。

    而在上圖中最右端也就是 IoHandler,這便是業務處理模塊。相當于前面例子中的 HelloHandler 類。在業務處理類中不需要去關心實際的通訊細節,只管處理客戶端傳輸過來的信息即可。編寫 Handler 類就是使用 MINA 開發網絡應用程序的重心所在,相當于 MINA 已經幫你處理了所有的通訊方面的細節問題。為了簡化 Handler 類,MINA 提供了 IoHandlerAdapter 類,此類僅僅是實現了 IoHandler 接口,但并不做任何處理。

    一個 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文檔):

    void exceptionCaught(IoSession session, Throwable cause)
    當接口中其他方法拋出異常未被捕獲時觸發此方法
    void messageReceived(IoSession session, Object message)
    當接收到客戶端的請求信息后觸發此方法.
    void messageSent(IoSession session, Object message)
    當信息已經傳送給客戶端后觸發此方法.
    void sessionClosed(IoSession session)
    當連接被關閉時觸發,例如客戶端程序意外退出等等.
    void sessionCreated(IoSession session)
    當一個新客戶端連接后觸發此方法.
    void sessionIdle(IoSession session, IdleStatus status)
    當連接空閑時觸發此方法.
    void sessionOpened(IoSession session)
    當連接后打開時觸發此方法,一般此方法與 sessionCreated 會被同時觸發


    前面我們提到 IoService 是負責底層通訊接入,而 IoHandler 是負責業務處理的。那么 MINA 架構圖中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一個用途卻是必須的,那就是作為 IoService 和 IoHandler 之間的橋梁。IoHandler 接口中最重要的一個方法是 messageReceived,這個方法的第二個參數是一個 Object 型的消息,總所周知,Object 是所有 Java 對象的基礎,那到底誰來決定這個消息到底是什么類型呢?答案也就在這個 IoFilter 中。在前面使用的例子中,我們添加了一個 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),這個過濾器的作用是將來自客戶端輸入的信息轉換成一行行的文本后傳遞給 IoHandler,因此我們可以在 messageReceived 中直接將 msg 對象強制轉換成 String 對象。

    而如果我們不提供任何過濾器的話,那么在 messageReceived 方法中的第二個參數類型就是一個 byte 的緩沖區,對應的類是 org.apache.mina.common.ByteBuffer。雖然你也可以將解析客戶端信息放在 IoHandler 中來做,但這并不是推薦的做法,使原來清晰的模型又模糊起來,變得 IoHandler 不只是業務處理,還得充當協議解析的任務。

    MINA自身帶有一些常用的過濾器,例如LoggingFilter(日志記錄)、BlackListFilter(黑名單過濾)、CompressionFilter(壓縮)、SSLFilter(SSL加密)等。



    其他

    MINA 不僅僅是用來開發網絡服務器端應用程序,它一樣可以使用 IoConnector 來連接到各種各樣的網絡服務程序。

    通過本文中 HelloServer 這個例子,我們在驚嘆 MINA 可以帶來多么大便利的同時,還不得不為其卓越的性能而驕傲,據稱使用MINA開發服務器程序的性能已經逼近使用 C/C++ 語言開發的網絡服務。作為 MINA 的入門文章,性能問題不在本文討論范圍內。

    另外在 MINA 壓縮包中附帶有不少比 HelloServer 要好得多的例子,通過這些例子可以進一步的了解并掌握 MINA。




    參考資料

    http://mina.apache.org MINA 官方網站


    http://mina.apache.org/features.html 您可以在這里查看關于 MINA 的更多特性


    http://mina.apache.org/testimonials.html 看看別人是如何評價 MINA 的 http://asyncweb.safehaus.org/使用 MINA 開發的高性能 WEB 服務器 

    posted @ 2013-05-11 21:41 paulwong 閱讀(308) | 評論 (0)編輯 收藏

    使用Sqoop實現HDFS與Mysql互轉


    簡介
    Sqoop是一個用來將Hadoop和關系型數據庫中的數據相互轉移的工具,可以將一個關系型數據庫(例如 : MySQL ,Oracle ,Postgres等)中的數據導入到Hadoop的HDFS中,也可以將HDFS的數據導入到關系型數據庫中。

    http://sqoop.apache.org/

    環境
    當調試過程出現IncompatibleClassChangeError一般都是版本兼容問題。

    為了保證hadoop和sqoop版本的兼容性,使用Cloudera,

    Cloudera簡介:

    Cloudera為了讓Hadoop的配置標準化,可以幫助企業安裝,配置,運行hadoop以達到大規模企業數據的處理和分析。

    http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDHTarballs/3.25.2013/CDH4-Downloadable-Tarballs/CDH4-Downloadable-Tarballs.html

    下載安裝hadoop-0.20.2-cdh3u6,sqoop-1.3.0-cdh3u6。

    安裝
    安裝比較簡單,直接解壓即可

    唯一需要做的就是將mysql的jdbc適配包mysql-connector-java-5.0.7-bin.jar copy到$SQOOP_HOME/lib下。

    配置好環境變量:/etc/profile

    export SQOOP_HOME=/home/hadoop/sqoop-1.3.0-cdh3u6/

    export PATH=$SQOOP_HOME/bin:$PATH

    MYSQL轉HDFS-示例
    ./sqoop import --connect jdbc:mysql://10.8.210.166:3306/recsys --username root --password root --table shop -m 1 --target-dir /user/recsys/input/shop/$today


    HDFS轉MYSQ-示例
    ./sqoop export --connect jdbc:mysql://10.8.210.166:3306/recsys --username root --password root --table shopassoc --fields-terminated-by ',' --export-dir /user/recsys/output/shop/$today

    示例參數說明
    (其他參數我未使用,故不作解釋,未使用,就沒有發言權,詳見命令help)


    參數類型

    參數名

    解釋

    公共

    connect

    Jdbc-url

    公共

    username

    ---

    公共

    password

    ---

    公共

    table

    表名

    Import

    target-dir

    制定輸出hdfs目錄,默認輸出到/user/$loginName/

    export

    fields-terminated-by

    Hdfs文件中的字段分割符,默認是“\t”

    export

    export-dir

    hdfs文件的路徑

    posted @ 2013-05-11 21:27 paulwong 閱讀(462) | 評論 (0)編輯 收藏

    全方位的技術服務及相關技術解決方案(純java解決方案)

    http://www.iteye.com/topic/1128561 @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

    posted @ 2013-05-11 00:17 paulwong 閱讀(517) | 評論 (0)編輯 收藏

    讓spring-data-jpa解放你的DAO

         摘要: 最近項目用Spring-data-jpa,確實很方便。如果你也曾經被重復無聊的dao代碼雷到的話,就可以考慮將ORM framework換成spring-data-jpa了。 只要繼承CrudRepository或者PagingAndSortingRepository,dao層基本上就只剩下定義接口方法這么一件事情了,連實現都不用寫,因為默認實現SimpleJpaRepository已經幫你實現了...  閱讀全文

    posted @ 2013-05-09 14:16 paulwong 閱讀(5573) | 評論 (1)編輯 收藏

    mysql分表,分區的區別和聯系

    一,什么是mysql分表,分區

    什么是分表,從表面意思上看呢,就是把一張表分成N多個小表,具體請看mysql分表的3種方法

    什么是分區,分區呢就是把一張表的數據分成N多個區塊,這些區塊可以在同一個磁盤上,也可以在不同的磁盤上,具體請參考mysql分區功能詳細介紹,以及實例

    二,mysql分表和分區有什么區別呢

    1,實現方式上

    a),mysql的分表是真正的分表,一張表分成很多表后,每一個小表都是完正的一張表,都對應三個文件,一個.MYD數據文件,.MYI索引文件,.frm表結構文件。

    1. [root@BlackGhost test]# ls |grep user  
    2. alluser.MRG  
    3. alluser.frm  
    4. user1.MYD  
    5. user1.MYI  
    6. user1.frm  
    7. user2.MYD  
    8. user2.MYI  
    9. user2.frm  
    [root@BlackGhost test]# ls |grep user alluser.MRG alluser.frm user1.MYD user1.MYI user1.frm user2.MYD user2.MYI user2.frm

    簡單說明一下,上面的分表呢是利用了merge存儲引擎(分表的一種),alluser是總表,下面有二個分表,user1,user2。他們二個都是獨立的表,取數據的時候,我們可以通過總表來取。這里總表是沒有.MYD,.MYI這二個文件的,也就是說,總表他不是一張表,沒有數據,數據都放在分表里面。我們來看看.MRG到底是什么東西

    1. [root@BlackGhost test]# cat alluser.MRG |more  
    2. user1  
    3. user2  
    4. #INSERT_METHOD=LAST  
    [root@BlackGhost test]# cat alluser.MRG |more user1 user2 #INSERT_METHOD=LAST

    從上面我們可以看出,alluser.MRG里面就存了一些分表的關系,以及插入數據的方式??梢园芽偙砝斫獬梢粋€外殼,或者是聯接池。

    b),分區不一樣,一張大表進行分區后,他還是一張表,不會變成二張表,但是他存放數據的區塊變多了。

    1. [root@BlackGhost test]# ls |grep aa  
    2. aa#P#p1.MYD  
    3. aa#P#p1.MYI  
    4. aa#P#p3.MYD  
    5. aa#P#p3.MYI  
    6. aa.frm  
    7. aa.par  
    [root@BlackGhost test]# ls |grep aa aa#P#p1.MYD aa#P#p1.MYI aa#P#p3.MYD aa#P#p3.MYI aa.frm aa.par

    從上面我們可以看出,aa這張表,分為二個區,p1和p3,本來是三個區,被我刪了一個區。我們都知道一張表對應三個文件.MYD,.MYI,.frm。分區呢根據一定的規則把數據文件和索引文件進行了分割,還多出了一個.par文件,打開.par文件后你可以看出他記錄了,這張表的分區信息,根分表中的.MRG有點像。分區后,還是一張,而不是多張表。

    2,數據處理上

    a),分表后,數據都是存放在分表里,總表只是一個外殼,存取數據發生在一個一個的分表里面??聪旅娴睦樱?/p>

    select * from alluser where id='12'表面上看,是對表alluser進行操作的,其實不是的。是對alluser里面的分表進行了操作。

    b),分區呢,不存在分表的概念,分區只不過把存放數據的文件分成了許多小塊,分區后的表呢,還是一張表。數據處理還是由自己來完成。

    3,提高性能上

    a),分表后,單表的并發能力提高了,磁盤I/O性能也提高了。并發能力為什么提高了呢,因為查尋一次所花的時間變短了,如果出現高并發的話,總表可以根據不同的查詢,將并發壓力分到不同的小表里面。磁盤I/O性能怎么搞高了呢,本來一個非常大的.MYD文件現在也分攤到各個小表的.MYD中去了。

    b),mysql提出了分區的概念,我覺得就想突破磁盤I/O瓶頸,想提高磁盤的讀寫能力,來增加mysql性能。
    在這一點上,分區和分表的測重點不同,分表重點是存取數據時,如何提高mysql并發能力上;而分區呢,如何突破磁盤的讀寫能力,從而達到提高mysql性能的目的。

    4),實現的難易度上

    a),分表的方法有很多,用merge來分表,是最簡單的一種方式。這種方式根分區難易度差不多,并且對程序代碼來說可以做到透明的。如果是用其他分表方式就比分區麻煩了。

    b),分區實現是比較簡單的,建立分區表,根建平常的表沒什么區別,并且對開代碼端來說是透明的。

    三,mysql分表和分區有什么聯系呢

    1,都能提高mysql的性高,在高并發狀態下都有一個良好的表面。

    2,分表和分區不矛盾,可以相互配合的,對于那些大訪問量,并且表數據比較多的表,我們可以采取分表和分區結合的方式(如果merge這種分表方式,不能和分區配合的話,可以用其他的分表試),訪問量不大,但是表數據很多的表,我們可以采取分區的方式等。

    posted @ 2013-05-07 09:19 paulwong 閱讀(457) | 評論 (0)編輯 收藏

    僅列出標題
    共115頁: First 上一頁 66 67 68 69 70 71 72 73 74 下一頁 Last 
    主站蜘蛛池模板: 日韩免费高清大片在线| 国产区图片区小说区亚洲区| 久久久久亚洲AV无码专区首| 亚洲综合图色40p| 91麻豆精品国产自产在线观看亚洲| 亚洲XX00视频| 亚洲一区二区三区在线视频| 国产L精品国产亚洲区久久| 免费乱理伦在线播放| 亚洲成a人片在线观看日本麻豆| 国产午夜免费秋霞影院| 免费v片在线观看品善网| 亚洲国产人成精品| 亚洲人成电影网站国产精品 | 污污视频免费观看网站| 特级毛片A级毛片100免费播放 | 亚洲精品亚洲人成在线观看麻豆| 久久精品国产亚洲av日韩| 亚洲美免无码中文字幕在线| 亚洲天堂中文字幕在线观看| 亚洲an日韩专区在线| 亚洲色一区二区三区四区| 亚洲av永久无码| www成人免费视频| 久久国产精品免费专区| 国产精彩免费视频| 啦啦啦手机完整免费高清观看| 国产免费久久精品| 亚洲精品视频在线观看你懂的| 亚洲日韩精品A∨片无码| 亚洲伊人久久大香线蕉苏妲己| 亚洲伊人久久大香线焦| 亚洲第一成年网站视频| igao激情在线视频免费| 91在线老王精品免费播放| 好爽…又高潮了毛片免费看| 亚洲日韩在线观看免费视频| 亚洲色四在线视频观看| 亚洲精品蜜夜内射| 国产在线观看免费av站| 亚洲黄色免费网站|