数据加载中……
Liquibase+spring 初步使用

现在的工作的项目中用了liquibase,感觉挺爽的,可以跟踪、管理数据库的重构。这对于很多需求变更较大的项目是非常不错的,特别是互联网的项目。(虽然互联网Nosql已经非常流行,不过俺觉得传统关系型数据库还是有存在的必要的)

好了,废话不多说,说说这几天的学习心得和实战总结。

关于liquibase的优点就不多说了,可以去官网看简介。

基本上我是从quickStart开始看的。Liquibase的原理很简单,就是通过记录数据库的结构方面的所有重构都放在一个Changelog中的xml中,通过xml的changeSet去跟踪数据库的变更。

在最近的工作中很好奇,为什么liquibase可以做到识别哪一个ChangeSet需要去对数据库重构,哪一个不重构(已经执行了数据库结构的修改操作)。通过测试以后发现,liquibase第一次运行的时候会在DB建立两张表,分别是databasechangelog和databasechagneloglock:


这样就很好理解了,通过DB去继续并匹配旧的操作和新的操作。

继续看databasechange表结构,就发现表结构的主键是ID,AUTHOR,FILENAME.

即通过每一个ChangeSet的ID+修改ChangeSet的作者标示+包含ChangeSet的文件名

来,也这避免了多人协同开发的冲突。(关于ID和AUTHOR可以再后面配置文件中看到)

关于databasechangelog,我的理解则是当年是否有操作占有数据库变更的锁

Ps:开始认为这个ID和databasechange的ID应该是同一个值,后来才发现不同,因为属性值不同,这里的ID应该是databasechange表中的ORDEREXECUTED。这个值应该是数据库根据执行顺序确定的序列号而不是用户在xml中配置的ID号。

看完这些,就来看看liquibase怎么在项目中使用,

吐槽一下,官方的quickStart写的有点烂,只列了如下几种:

一看,我就觉得有点晕,command line我觉得好囧,Ant我不会应该也快被maven淘汰了吧?Grails我google了一下才有所了解。那我知道的就maven和servlet listener。Servlet listener 非web项目咋办呢?好吧,只有maven一条出路了。在官网找了半天,才发现这东西还支持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执行呢?

 -------------------------------------------------------------------------------------
初步使用了一下,值得挖掘的东西应该还是很多的。
记录一下liquibase的源代码地址:https://github.com/liquibase/liquibase

 

 

 

 

 

posted on 2012-02-09 00:09 潘潘.eagle 阅读(7828) 评论(2)  编辑  收藏 所属分类: JAVA

评论

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

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

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

一樣可以達到效果,所以不見得只能用官方網站上面說的那些方式
還是可以通過代碼去執行的
  回复  更多评论    

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

恩。这样是可以的,不过作为一个开源的组件,是不是还是应该直接提供一种方式呢?呵呵。@metavige
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: