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

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

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

    數(shù)據(jù)加載中……
    Liquibase+spring 初步使用

    現(xiàn)在的工作的項目中用了liquibase,感覺挺爽的,可以跟蹤、管理數(shù)據(jù)庫的重構(gòu)。這對于很多需求變更較大的項目是非常不錯的,特別是互聯(lián)網(wǎng)的項目。(雖然互聯(lián)網(wǎng)Nosql已經(jīng)非常流行,不過俺覺得傳統(tǒng)關(guān)系型數(shù)據(jù)庫還是有存在的必要的)

    好了,廢話不多說,說說這幾天的學(xué)習(xí)心得和實戰(zhàn)總結(jié)。

    關(guān)于liquibase的優(yōu)點就不多說了,可以去官網(wǎng)看簡介。

    基本上我是從quickStart開始看的。Liquibase的原理很簡單,就是通過記錄數(shù)據(jù)庫的結(jié)構(gòu)方面的所有重構(gòu)都放在一個Changelog中的xml中,通過xml的changeSet去跟蹤數(shù)據(jù)庫的變更。

    在最近的工作中很好奇,為什么liquibase可以做到識別哪一個ChangeSet需要去對數(shù)據(jù)庫重構(gòu),哪一個不重構(gòu)(已經(jīng)執(zhí)行了數(shù)據(jù)庫結(jié)構(gòu)的修改操作)。通過測試以后發(fā)現(xiàn),liquibase第一次運行的時候會在DB建立兩張表,分別是databasechangelog和databasechagneloglock:


    這樣就很好理解了,通過DB去繼續(xù)并匹配舊的操作和新的操作。

    繼續(xù)看databasechange表結(jié)構(gòu),就發(fā)現(xiàn)表結(jié)構(gòu)的主鍵是ID,AUTHOR,FILENAME.

    即通過每一個ChangeSet的ID+修改ChangeSet的作者標示+包含ChangeSet的文件名

    來,也這避免了多人協(xié)同開發(fā)的沖突。(關(guān)于ID和AUTHOR可以再后面配置文件中看到)

    關(guān)于databasechangelog,我的理解則是當(dāng)年是否有操作占有數(shù)據(jù)庫變更的鎖

    Ps:開始認為這個ID和databasechange的ID應(yīng)該是同一個值,后來才發(fā)現(xiàn)不同,因為屬性值不同,這里的ID應(yīng)該是databasechange表中的ORDEREXECUTED。這個值應(yīng)該是數(shù)據(jù)庫根據(jù)執(zhí)行順序確定的序列號而不是用戶在xml中配置的ID號。

    看完這些,就來看看liquibase怎么在項目中使用,

    吐槽一下,官方的quickStart寫的有點爛,只列了如下幾種:

    一看,我就覺得有點暈,command line我覺得好囧,Ant我不會應(yīng)該也快被maven淘汰了吧?Grails我google了一下才有所了解。那我知道的就maven和servlet listener。Servlet listener 非web項目咋辦呢?好吧,只有maven一條出路了。在官網(wǎng)找了半天,才發(fā)現(xiàn)這東西還支持spring,剛好手頭的項目是架在spring上面的。

    所以,就在spring上面搗鼓了一下,把官方的配置copy一份到自己的xml中就行了(http://www.liquibase.org/manual/spring )。

    bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
          
    <property name="dataSource" ref="myDataSource" />
          
    <property name="changeLog" value="classpath:db-changelog.xml" />
     
          
    <!--
          contexts specifies the runtime contexts to use.
          
    -->
          
    <property name="contexts" value="test, production" />
     
    </bean>

     運行了一下,一切OK。

    不過還是要吐槽一下,如果不是web項目,不用maven,不用spring.那這東西是不是就不能用了呢?

    為啥不能支持一下通過代碼去load執(zhí)行呢?

     -------------------------------------------------------------------------------------
    初步使用了一下,值得挖掘的東西應(yīng)該還是很多的。
    記錄一下liquibase的源代碼地址:https://github.com/liquibase/liquibase

     

     

     

     

     

    posted on 2012-02-09 00:09 潘潘.eagle 閱讀(7871) 評論(2)  編輯  收藏 所屬分類: JAVA

    評論

    # re: Liquibase+spring 初步使用 2012-02-12 11:05 metavige

    如果可以用 Spring
    表示就可以自行 create instance 了
    因為 spring 也只是幫忙作 create instance 以及 ioc 的動作

    你可以自己 new liquibase.integration.spring.SpringLiquibase()
    然後再設(shè)定裡面的 Property

    一樣可以達到效果,所以不見得只能用官方網(wǎng)站上面說的那些方式
    還是可以通過代碼去執(zhí)行的
      回復(fù)  更多評論    

    # re: Liquibase+spring 初步使用 2012-02-13 09:47 潘潘.eagle

    恩。這樣是可以的,不過作為一個開源的組件,是不是還是應(yīng)該直接提供一種方式呢?呵呵。@metavige
      回復(fù)  更多評論    
    主站蜘蛛池模板: 成人免费网站在线观看| 亚洲美女视频免费| 全部免费毛片免费播放| 亚洲av无码av在线播放| 免费人成视网站在线观看不卡| 亚洲乱码av中文一区二区| 午夜宅男在线永久免费观看网| 亚洲精品成人图区| 色婷婷7777免费视频在线观看| 国产精品亚洲精品观看不卡| 好爽又高潮了毛片免费下载| 国产精品无码亚洲精品2021| 亚洲А∨精品天堂在线| 成人黄网站片免费视频| 亚洲最大黄色网址| 夜夜嘿视频免费看| 久香草视频在线观看免费| 国产亚洲综合色就色| 亚洲一区二区免费视频| 亚洲日韩国产欧美一区二区三区| 浮力影院第一页小视频国产在线观看免费 | 97无码人妻福利免费公开在线视频 | 在线a免费观看最新网站| 中文字幕在线日亚洲9| 亚洲成a人片在线播放| 亚洲免费视频网站| 伊人久久五月丁香综合中文亚洲| 亚洲国产小视频精品久久久三级| 久99久精品免费视频热77| 在线亚洲午夜片AV大片| 国产成人99久久亚洲综合精品 | 亚洲AV无码久久精品色欲| 久久WWW免费人成人片| 国产精品免费久久| 久久精品国产亚洲αv忘忧草| 亚洲免费在线观看| A在线观看免费网站大全| 国产精品内射视频免费| 亚洲人精品亚洲人成在线| 亚洲乱码国产乱码精品精| 日韩免费a级在线观看|