(转)在Web项目中使用LiquiBase实现数据库自动更新
来源:互联网 发布:mac 接口压力测试 编辑:程序博客网 时间:2024/06/04 18:13
在Web项目中,我们可以通过配置servlet listener使用LiquiBase自动更新数据库。需要以下七个步骤:
1. 创建一个数据库变更日志(change log)文件。
2. 在变更日志文件内部创建一个变更集(change set)。
3. 配置JNDI数据源。
4. 在项目中加入包liquibase。
5. 配置项目中的web.xml文件。
6. 启动项目。
7. 检验数据库中的变更。
Changelog.xml:
Html代码 收藏代码
1. 创建一个数据库变更日志(change log)文件。
2. 在变更日志文件内部创建一个变更集(change set)。
3. 配置JNDI数据源。
4. 在项目中加入包liquibase。
5. 配置项目中的web.xml文件。
6. 启动项目。
7. 检验数据库中的变更。
Changelog.xml:
Html代码 收藏代码
- <?xml version="1.0" encoding="UTF-8"?>
- <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9
- http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">
- <changeSet id="1" author="jim">
- <createTable tableName="useraccount">
- <column name="userid" type="bigint(20)">
- <constraints primaryKey="true" />
- </column>
- <column name="accountstate" type="varchar(255)" />
- <column name="expiredDate" type="datetime" />
- <column name="username" type="varchar(255)" />
- </createTable>
- <addUniqueConstraint tableName="useraccount"
- columnNames="username" constraintName="username" />
- </changeSet>
- <changeSet id="2" author="jim">
- <addColumn tableName="useraccount">
- <column name="gender" type="varchar(1)" value="M">
- <constraints nullable="false"/>
- </column>
- </addColumn>
- </changeSet>
- </databaseChangeLog>
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd"> <changeSet id="1" author="jim"> <createTable tableName="useraccount"> <column name="userid" type="bigint(20)"> <constraints primaryKey="true" /> </column> <column name="accountstate" type="varchar(255)" /> <column name="expiredDate" type="datetime" /> <column name="username" type="varchar(255)" /> </createTable> <addUniqueConstraint tableName="useraccount" columnNames="username" constraintName="username" /> </changeSet> <changeSet id="2" author="jim"> <addColumn tableName="useraccount"> <column name="gender" type="varchar(1)" value="M"> <constraints nullable="false"/> </column> </addColumn> </changeSet> </databaseChangeLog>
Web.xml:
Html代码 收藏代码
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <display-name>liquid</display-name>
- <description>MySQL Test App</description>
- <resource-ref>
- <description>DB Connection</description>
- <res-ref-name>jdbc/test</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
- <context-param>
- <param-name>LIQUIBASE_CHANGELOG</param-name>
- <param-value>db.changelog.xml</param-value>
- </context-param>
- <context-param>
- <param-name>LIQUIBASE_DATA_SOURCE</param-name>
- <param-value>java:comp/env/jdbc/test</param-value>
- </context-param>
- <context-param>
- <param-name>LIQUIBASE_FAIL_ON_ERROR</param-name>
- <param-value>true</param-value>
- </context-param>
- <context-param>
- <param-name>LIQUIBASE_CONTEXTS</param-name>
- <param-value>jdbc/test</param-value>
- </context-param>
- <listener>
- <listener-class>liquibase.servlet.LiquibaseServletListener</listener-class>
- </listener>
- </web-app>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>liquid</display-name> <description>MySQL Test App</description> <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/test</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <context-param> <param-name>LIQUIBASE_CHANGELOG</param-name> <param-value>db.changelog.xml</param-value> </context-param> <context-param> <param-name>LIQUIBASE_DATA_SOURCE</param-name> <param-value>java:comp/env/jdbc/test</param-value> </context-param> <context-param> <param-name>LIQUIBASE_FAIL_ON_ERROR</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>LIQUIBASE_CONTEXTS</param-name> <param-value>jdbc/test</param-value> </context-param> <listener> <listener-class>liquibase.servlet.LiquibaseServletListener</listener-class> </listener> </web-app>
通过上面的web.xml文件,可以看到这里配置了一个listener,LiquibaseServletListener这个类继承了ServletContextListener,ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。当服务器启动时,LiquibaseServletListener的 contextInitialized()方法被调用,这个方法会比较数据库与Changelog.xml的不同,并自动更新数据库。
那么LiquiBase是怎么更新数据的呢?当LiquibaseServletListener第一次被调用时,会创建了两个特定的表。第一个特定于 LiquiBase 的表称为 databasechangelog,它跟踪应用到数据库的所有变更 — 有助于跟踪谁执行了数据库变更以及原因。第二个特定于 LiquiBase的表是 databasechangelock,标识出具有数据库变更锁的用户。LiquiBase通过比较databasechangelog中的记录和Changelog.xml中的changeSet,更新数据库。
liquid项目1中Changelog.xml中的只有1条changeset
Xml代码 收藏代码
- <changeSet id="1" author="jim">
- <createTable tableName="useraccount">
- <column name="userid" type="bigint(20)">
- <constraints primaryKey="true" />
- </column>
- <column name="accountstate" type="varchar(255)" />
- <column name="expiredDate" type="datetime" />
- <column name="username" type="varchar(255)" />
- </createTable>
- <addUniqueConstraint tableName="useraccount"
- columnNames="username" constraintName="username" />
- </changeSet>
<changeSet id="1" author="jim"> <createTable tableName="useraccount"> <column name="userid" type="bigint(20)"> <constraints primaryKey="true" /> </column> <column name="accountstate" type="varchar(255)" /> <column name="expiredDate" type="datetime" /> <column name="username" type="varchar(255)" /> </createTable> <addUniqueConstraint tableName="useraccount" columnNames="username" constraintName="username" /> </changeSet>
启动项目1,LiquiBase会自动创建表useraccount,并添加字段userid,accountstate,expiredDate,username。Databasechangelog表会新增一条表示<changeSet id="1" author="jim">的记录。
liquid项目2中Changelog.xml中的多加了1条changeset
Xml代码 收藏代码
- <changeSet id="2" author="jim">
- <addColumn tableName="useraccount">
- <column name="gender" type="varchar(1)" value="M">
- <constraints nullable="false"/>
- </column>
- </addColumn>
- </changeSet>
<changeSet id="2" author="jim"> <addColumn tableName="useraccount"> <column name="gender" type="varchar(1)" value="M"> <constraints nullable="false"/> </column> </addColumn> </changeSet>
启动项目2,LiquiBase会发现<changeSet id="1" author="jim">已经更新,所以只更新新增的<changeSet id="2" author="jim">。添加字段gender,并设置值为“M”。如果删除表useraccount,并删除表Databasechangelog中所有的记录,重新启动项目2,LiquiBase将创建表useraccount,并添加字段userid,accountstate,expiredDate,username和gender,并设置gender的值为“M”。
根据上面LiquiBase的特性,如果我们把每一次的数据库变更都写进到changeSet,并使用LiquiBase更新数据库,我们就可以通过对Changelog.xml文件进行版本控制,来控制数据库的版本。当我们升级软件的时候,也可以很方便地自动更新数据库。
参考资料:
IBM 使用 LiquiBase 管理数据库变更:http://www.ibm.com/developerworks/cn/java/j-ap08058/index.html
LiquiBase官网:http://www.liquibase.org/ (国内的IP可能进不去,要用代理)
- (转)在Web项目中使用LiquiBase实现数据库自动更新
- (转)在Web项目中使用LiquiBase实现数据库自动更新
- 在项目中使用Liquibase
- 使用 LiquiBase 管理数据库变更
- 关于在eclipse中创建的web项目中web.xml不自动更新的问题
- maven+liquibase实现持续数据库集成
- 使用LiquiBase管理数据库的迁移
- Liquibase使用
- svn提交自动更新服务器端web项目测试站点(使用svn的hooks实现)
- 在C++ Builder中实现桌布自动更新
- 如何在Web项目中使用Makefile
- log4j日志在web项目中使用
- 在Java Web 项目中使用HBase
- 在web项目中使用MarkDown组件
- 数据库自动更新的实现--php项目(1)
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持
- 如何使用Liquibase
- dreamweaver随记-----在网页中实现日期的自动更新
- 前3名的网站推广方法
- Error:Microsoft JScript runtime error: ASP.NET Ajax client-side framework failed to load.
- bulk upload
- 成功和失败
- hdu 1027
- (转)在Web项目中使用LiquiBase实现数据库自动更新
- windows下制作iso文件
- Ubuntu下制作iso文件的简单方法
- 企业移动信息化交流
- Gamebryo游戏特效制作过程解析
- 50个必备的实用jQuery代码段
- POJ 2251Dungeon Master
- setACL帮助文档
- Android录音与播放