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

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

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

    neverend的日志

    不記錄,終將被遺忘。 一萬年太久,只爭朝夕。 他們用數字構建了整個世界。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      62 Posts :: 1 Stories :: 17 Comments :: 0 Trackbacks

    2012年4月5日 #

    在事務隔離級別設定為repeatable read的情況下,一般的select語句采取的是一致性非阻塞讀的方式。
    一致性是指在事務的范圍內讀取的數據是可重現的,不會出現不可重復讀的情況。非阻塞是指這種讀取數據的模式不會對數據上任何一種鎖,其它操作全都不會被阻塞。
    在這種模式下,事務執行讀取語句后,相關的數據會有一套副本出現,并會為這個數據副本附加一個時間戳,其它事務在這個時間戳之后執行的寫操作都不會反映到這個副本中,這種機制被稱之為多版本并發控制。
    如果用select …… lock in share mode,則不是一致性非阻塞讀,該語句會等待其它事務的寫語句提交或回滾之后再讀取數據;如果事務隔離級別設置為read committed,也不是一致性非阻塞讀,該語句會讀取其它事務提交的數據。
    posted @ 2012-04-05 11:25 neverend 閱讀(1876) | 評論 (0)編輯 收藏

    2012年3月31日 #

    介紹下對于Mysql鎖機制的理解
    從基本概念開始:
    共享鎖
    共享鎖的代號是S,是Share的縮寫,共享鎖的鎖粒度是行或者元組(多個行)。一個事務獲取了共享鎖之后,可以對鎖定范圍內的數據執行讀操作。

    排它鎖
    排它鎖的代號是X,是eXclusive的縮寫,排它鎖的粒度與共享鎖相同,也是行或者元組。一個事務獲取了排它鎖之后,可以對鎖定范圍內的數據執行寫操作。

    假設有兩個事務t1和t2
    如果事務t1獲取了一個元組的共享鎖,事務t2還可以立即獲取這個元組的共享鎖,但不能立即獲取這個元組的排它鎖(必須等到t1釋放共享鎖之后)。
    如果事務t1獲取了一個元組的排它鎖,事務t2不能立即獲取這個元組的排共享鎖,也不能立即獲取這個元組的排它鎖(必須等到t1釋放排它鎖之后)。
     
    意向鎖
    意向鎖是一種表鎖,鎖定的粒度是整張表,分為意向共享鎖(IS)和意向排它鎖(IX)兩類。意向共享鎖表示一個事務有意對數據上共享鎖或者排它鎖。“有意”這兩個字表達的意思比較微妙,說的明白點就是指事務想干這個事但還沒真去干。舉例說明下意向共享鎖,比如一個事務t執行了這樣一個語句:select * from table lock in share model ,如果這個語句執行成功,就對表table上了一個意向共享鎖。lock in share model就是說事務t1在接下來要執行的語句中要獲取S鎖。如果t1的select * from table lock in share model執行成功,那么接下來t1應該可以暢通無阻的去執行只需要共享鎖的語句了。意向排它鎖的含義同理可知,上例中要獲取意向排它鎖,可以使用select * from table for update

    lock in share model 和 for update這兩個東西在數據率理論中還有個學名叫悲觀鎖,與悲觀鎖相對的當然還有樂觀鎖。大家可以看到各種鎖都是成雙成對出現的。關于悲觀鎖和樂觀鎖的問題暫且不表,下文再來詳述。

    鎖的互斥與兼容關系
    鎖和鎖之間的關系,要么是相容的,要么是互斥的。
    鎖a和鎖b相容是指:操作同樣一組數據時,如果事務t1獲取了鎖a,另一個事務t2還可以獲取鎖b;
    鎖a和鎖b互斥是指:操作同樣一組數據時,如果事務t1獲取了鎖a,另一個事務t2在t1釋放鎖a之前無法獲取鎖b。

    上面提到的共享鎖、排它鎖、意向共享鎖、意向排它鎖相互之前都是有兼容/互斥關系的,可以用一個兼容性矩陣表示(y表示兼容,n表示不兼容):
        X    S    IX    IS
    X  n     n    n     n
    S  n     y    n     y
    IX n     n    y     y
    IS n     y    y     y 

    兼容性矩陣為什么是這個樣子的?
    X和S的相互關系在上文中解釋過了,IX和IS的相互關系全部是兼容,這也很好理解,因為它們都只是“有意”,還處于YY階段,沒有真干,所以是可以兼容的;
    剩下的就是X和IX,X和IS, S和IX, S和IS的關系了,我們可以由X和S的關系推導出這四組關系。
    簡單的說:X和IX的=X和X的關系。為什么呢?因為事務在獲取IX鎖后,接下來就有權利獲取X鎖。如果X和IX兼容的話,就會出現兩個事務都獲取了X鎖的情況,這與我們已知的X與X互斥是矛盾的,所以X與IX只能是互斥關系。其余的三組關系同理,可用同樣的方式推導出來。

    一致性非阻塞讀

    select... lock in share mode和select ... for update的區別

    索引記錄鎖
    間隙鎖
    后碼鎖

    各種語句對應的鎖類型
    在有索引的情況下是以后碼鎖為基礎的行級鎖,在固定索引鍵查找的情況下是索引記錄鎖,在沒有可用索引的情況下上升到表鎖
    有索引的情況:
    select ... from 一致性非阻塞讀,不上鎖。在serializable隔離級別下例外,在這個隔離級別下上共享后碼鎖
    select ... from ... lock in share mode  共享后碼鎖
    select ... from ... for update 排它后碼鎖
    update .... where  排它后碼鎖
    delete from .... where 排它后碼鎖
    insert ... 排它索引記錄鎖,如果發生鍵值唯一性沖突則轉成共享鎖
    insert ... on duplicate key update ,一直都是排它鎖
    replace ... 一直都是排它鎖


    死鎖情境分析

    MVCC的理論與實現
    posted @ 2012-03-31 14:53 neverend| 編輯 收藏

    2012年3月13日 #

    1. 優化更需要優化的SQL
    高并發低消耗 > 低并發高消耗

    2. 定位性能瓶頸
    profiling

    3. 明確的優化目標

    4. 從explain入手
    y
    5. 小結果集驅動大結果集??
    Join操作

    6. 在索引中完成排序

    7. 只取出自己需要的columns
    MySQL有兩種排序算法,盡可能使用只訪問一次數據的算法。

    8. 僅僅使用最有效的過濾條件
    索引鍵長度?

    9. 避免復雜的join和子查詢

    充分利用EXPLAIN和profiling
    profiling的使用:
    1.set profiling = 1;
    2.執行SQL;
    3.show profile;
    4.show profile [cpu, block io] for query [id];

    mysqlslap 測試sql性能
    mysqlslap --concurrency=5 --iterations=500 --query="selec
    t * from hbe_hotel" --create-schema=phoenix -uroot -p

    合理設計并使用索引
    Mysql支持的索引類型:
    1. B-tree索引 除了Archive的存儲引擎都支持
    2. Hash索引  memory和NDB支持
    3. Full-text索引 MyISAM,分詞后建立B-tree索引
    4. R-tree索引 MyISAM ,GIS系統使用

    索引的利弊
    利:提高數據檢索效率和排序、分組效率
    弊:加大更新操作的資源消耗,增加存儲空間的消耗

    如何判斷是否需要使用索引
    1. 使用較頻繁的字段應該創建索引
    2. 唯一性太差的字段不建索引 經驗值:15%
    3. 更新非常頻繁的字段不建索引
    4. where子句中不出現的字段不建索引

    單鍵索引還是組合索引?
    多方考慮,平衡優劣

    技術人員如何證明一個需求是否合理?
    1. 每次PD提出新需求的時候,要求給出該項目預期收益的量化指標。
    2. 在項目進行中,詳細記錄所有資源投入,包括人力、硬件等。
    3. 項目上線后收集數據統計實際收益值。
    4. 相關部門盡可能設計出項目投入/產出比率的計算規則,將投入/產出比公布給參與項目的所有人員。
    5. 比較實際的投入/產出比與預期值,以判定項目做的是否值得。

    posted @ 2012-03-13 07:48 neverend 閱讀(357) | 評論 (0)編輯 收藏

    2012年2月4日 #

    MySQL執行計劃 

    調用方式:
    explain select ...

    explain extended select ...
    show warnings 得到MySQL優化器優化后的查詢語句

    執行計劃包含的信息:


    說明:
    id: select子句的優先級,id越大,優先級越高。
    select_type: 查詢類型
    table: 查詢的表名
    type:  MySQL找到所需行使用的方式,包括如下類型:


    ALL: 掃描全表
    index: 掃描全部索引樹
    range: 掃描部分索引
    ref: 非唯一性索引掃描
    eq_ref:唯一性索引掃描
    const, system: MySQL對查詢某部分進行優化,并轉換為一個常量時,使用這些類型訪問
    NULL: MySQL在優化過程中分解語句,執行時甚至不用訪問表或索引

    rows: 找到所需記錄需要讀取的行數
    Extra: 額外信息

    執行計劃可用來分析select語句的性能,排查性能瓶頸。

    參考資料:
    http://wenku.baidu.com/view/d4416c27aaea998fcc220ea7.html

    /Files/neverend/mysqlexplain-MySQL執行計劃解讀.ppt
    posted @ 2012-02-04 18:33 neverend 閱讀(719) | 評論 (0)編輯 收藏

    頭疼的SVN代碼merge問題

    如何merge代碼?
    建議用命令搞merge,客戶端圖形界面不是很給力。
    SVN 1.5以上版本,可以使用SVN的自動合并:
    將主干合并到分支:
    進入分支目錄,執行命令: svn merge http://server/dir/trunk

    將分支合并到主干:
    進入主干目錄,執行命令: svn merge http://server/dir/branch  --reintegrate
    注: 如果之前進行過主干合并到分支的操作,請加參數--reintegrate,否則可能會有很多代碼沖突出現。

    如果是SVN1.5以下版本,只能使用手工合并:
    進入主干目錄,執行命令:svn merge -r version1:version2 http://server/dir/branch
    將branch上從version1到version2所做的改動合并到主干,vension1 < version2

    進入主干目錄,執行命令: svn merge -c version1 http://server/dir/branch
    表示將version1次所做的改動合并到主干

    代碼沖突如何解決?

    conficted

    tree conficted
    posted @ 2012-02-04 18:13 neverend 閱讀(2076) | 評論 (0)編輯 收藏

    2012年2月3日 #

    項目開發過程中經常會碰到maven依賴沖突的問題,這篇post整理下maven依賴沖突產生的原因以及解決方案

    maven依賴沖突的產生是由maven傳遞性依賴造成的:

    什么是maven傳遞依賴?
    “一個傳遞性依賴就是對于一個依賴的依賴。如果project-a依賴于project-b,而后
    者接著依賴于project-c,那么project-c就被認為是project-a的傳遞性依賴。如
    果project-c依賴于project-d,那么project-d就也被認為是project-a的傳遞性依
    賴。Maven的部分吸引力是由于它能夠管理傳遞性依賴,并且能夠幫助開發者屏蔽掉跟
    蹤所有編譯期和運行期依賴的細節。你可以只依賴于一些包如Spring Framework,而不
    用擔心Spring Framework的所有依賴,Maven幫你自動管理了,你不用自己去詳細了解
    配置。
    Maven是怎樣完成這件事情的呢?它建立一個依賴圖,并且處理一些可能發生的沖突和
    重疊。例如,如果Maven看到有兩個項目依賴于同樣的groupId和artifactId,它會自動
    整理出使用哪個依賴,選擇那個最新版本的依賴。雖然這聽起來很方便,但在一些邊界
    情況中,傳遞性依賴會造成一些配置問題。在這種情況下,你可以使用依賴排除。”
                                                                 ——摘自《Maven權威指南》

    什么情況下會產生依賴沖突?
    舉例說明:項目中的pom.xml里聲明了對project-a1.0與project-b2.0的依賴,而project-a1.0又傳遞依賴于project-b1.0的版本。
    假設maven經過分析之后決定使用project-b1.0的依賴,也就是打包的時候把project-b1.0.jar打進了war包。
    war包部署在java容器中啟動之后,如果依賴project-b2.0.jar中新添的類或方法,就會發現引用的類或者方法不存在。
    這種現象就是依賴沖突。

    如何分析依賴沖突?
    mvn dependency:tree

    沖突解決方案:
    使用maven提供的<exclusion>標簽。
    舉例說明:
    如果你正依賴于一個類庫,該類庫又依賴于Sun JTA API,你會想要替換這個傳遞性依賴。
    Hibernate是一個例子。Hibernate依賴于Sun JTA API,而后者在中央Maven倉庫中不可用,因為它是不
    能免費分發的。幸運的是,Apache Gernoimo項目創建了一些可以免費分發的獨立實現
    類庫。為了用另外的依賴來替換這個傳遞性依賴,你需要排除這個傳遞性以依賴,然后
    在你的項目中再聲明一個依賴。下面展示了這樣一個替換的樣例。
    <dependency>
        
    <groupId>org.hibernate</groupId>
        
    <artifactId>hibernate</artifactId>
        
    <version>3.2.5.ga</version>
        
    <exclusions>
            
    <exclusion>
                
    <groupId>javax.transaction</groupId>
                
    <artifactId>jta</artifactId>
            
    </exclusion>
        
    </exclusions>
    </dependency>
    <dependency>
        
    <groupId>org.apache.geronimo.specs</groupId>
        
    <artifactId>geronimo-jta_1.1_spec</artifactId>
        
    <version>1.1</version>
    </dependency>


    posted @ 2012-02-03 15:51 neverend 閱讀(1965) | 評論 (1)編輯 收藏

    2012年2月1日 #

    討論MySQL死鎖問題

    死鎖分析
    posted @ 2012-02-01 22:37 neverend 閱讀(394) | 評論 (0)編輯 收藏

    總結緩存技術
    posted @ 2012-02-01 22:36 neverend 閱讀(712) | 評論 (1)編輯 收藏

    2012年1月30日 #

    關于JAVA注解,已經不止一次的碰到了,但是沒有系統的研究過。

    最近打算搞清楚以下問題:

    1. 注解的原理與使用
    2. Java提供的標準注解分析。
    3. Spring與Junit的常用注解分析。
    4. 如何合理的設計和使用注解

    1. 注解的原理與使用
        閱讀了《Java編程思想》講注解的一章,整理筆記如下:
        1.1 定義注解
        使用元注解定義注解,元注解有四種:
        @Target(ElementType.[type])
        [type]={METHOD, FIELD, TYPE(類、接口、枚舉聲明), CONSTRUCTOR, LOCAL_VARIABLE, PARAMETER}
        @Retention(RetentionPolicy.[policy])
        [policy]={SOURCE, CLASS, RUNTIME(反射機制可讀取)}
        @Documented 表示將此注解包含到Javadoc中
        @Inherited 表示允許子類繼承父類的注解
        例子:
    //:annotations/UserCase.java

    import java.lang.annotation.*;

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface UseCases {
        public int value() default 0;
        
    public int id() default 0;
        
    public String description() default "no description";
    }
       
        1.2使用注解
            @UserCase(id=10, description="my desccription")
            注意:
            注解元素必須有確定的值,要么在定義注解的默認值中指定,要么在使用注解時指定
            非基本類型的注解元素的值不可為null
            注解快捷方式: 如果注解元素聲明為value(),則在使用注解時如果只聲明value,可以只寫值,不必寫名值對。例如可寫為@UseCase(10)
        1.3編寫注解處理器
            通過反射機制獲取注解元素的值: Method.getAnnotation(), Field.getDeclaredAnnotations()等方法
        1.4注解的使用場景
            統計系統用例實現情況   
            由JavaBean自動生成數據庫建表SQL
        1.5 JDK提供的注解工具apt
        1.6 基于注解的單元測試    
    待續……
    2. Java提供的標準注解分析。
        @Override
    /*
     * @(#)Override.java    1.5 04/02/09
     *
     * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
     * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
     
    */


    package java.lang;

    import java.lang.annotation.*;

    /**
     * Indicates that a method declaration is intended to override a
     * method declaration in a superclass.  If a method is annotated with
     * this annotation type but does not override a superclass method,
     * compilers are required to generate an error message.
     *
     * 
    @author  Joshua Bloch
     * 
    @since 1.5
     
    */

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {
    }

        注解@Override的代碼非常簡單,可用于注解類的方法,并在Source級別可用。  
        @Deprecated
        級別為Runtime    
      
        @SuppressWarnings
        級別為source,經常的使用方式為@SuppressWarnings("unchecked")
    3. Spring與Junit的常用注解分析。
        @Test
       
    4. 如何合理的設計和使用注解
        使用注解標記字段和方法,可通過反射的手段截取注解及其標記的字段和方法的元數據,并根據需求對元數據進行處理。
        它賦予了字段和方法額外的意義,提供了一種統一處理字段和方法的優雅的方式。
        注解更多的意義是提供了一種設計模式,在本質上它沒有增強Java的能力,使用注解實現的功能都可以以非注解的方式實現,只是代碼可能不是很好看而已
    posted @ 2012-01-30 11:16 neverend 閱讀(20058) | 評論 (2)編輯 收藏

    2011年8月19日 #

    先配置好環境變量$TOMCAT_HOME

    在/etc/init.d/目錄下新建文件tomcat,輸入如下內容:
    #! /bin/sh
    # This shell script enables the automatic use of tomcat
    #
    # Author:      liuxuanyu<neverend06@163.com>
    #

    RETVAL=0

    start() {
        echo -n "Tomcat Starting..."
     echo
     $TOMCAT_HOME/bin/startup.sh
    }

    stop() {
        echo -n "Tomcat Stop..."
     echo
     $TOMCAT_HOME/bin/shutdown.sh
    }

    restart() {
     echo -n "Tomcat restart..."
     echo
     stop
     start
    }

    case "$1" in
     start)
          start;;
     stop)
       stop;;
     restart)
          restart;;
     *)
        echo $"Usage: $0 {start|stop|restart}"
     exit 1
    esac

    exit $RETVAL

    使用方法:
    sudo /etc/init.d/tomcat start
    sudo /etc/init.d/tomcat stop
    sudo /etc/init.d/tomcat restart

    posted @ 2011-08-19 23:00 neverend 閱讀(1125) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 毛片a级毛片免费观看品善网| 久久久久久久99精品免费| 黄页网站在线观看免费高清| 亚洲va在线va天堂va不卡下载 | 亚美影视免费在线观看| 亚洲国产精品尤物yw在线| 四虎精品免费永久免费视频| 亚洲精品97久久中文字幕无码| 国产亚洲日韩在线a不卡| 亚洲精品和日本精品| v片免费在线观看| 久久亚洲国产成人精品无码区| 一个人看的免费视频www在线高清动漫| 亚洲福利精品电影在线观看| 本免费AV无码专区一区| 亚洲日韩精品A∨片无码| 亚洲免费在线播放| 亚洲伊人久久大香线蕉在观| 免费无码黄动漫在线观看| 美女视频黄.免费网址| 国产成人高清亚洲| 国产精品内射视频免费| 亚洲精品无码不卡在线播HE | 91高清免费国产自产| 亚洲AV综合色区无码二区爱AV| 国产精品久免费的黄网站| 成在线人直播免费视频| 亚洲国产精品热久久| 亚洲免费在线视频观看| 67194在线午夜亚洲| 亚洲高清成人一区二区三区| 一区二区免费视频| 亚洲AV无码一区二区三区电影 | 免费看男女下面日出水视频 | 午夜性色一区二区三区免费不卡视频 | 亚洲真人无码永久在线观看| 无码欧精品亚洲日韩一区夜夜嗨| 久久免费区一区二区三波多野| 亚洲精品中文字幕| 亚洲精品无码久久一线| 97性无码区免费|