Liquibase的数据源作为Servlet侦听器

时间:2012-12-06 01:55:09

标签: java java-ee struts jndi liquibase

我开始在我的web.xml文件中配置Liquibase,但我不明白datasource属性引用的内容:

<context-param>
  <param-name>liquibase.datasource</param-name>
  <param-value>java:comp/env/jdbc/default</param-value>
</context-param>

文档说它是一个JNDI数据源,但是我使用的是Struts,而不是Spring,并且我在不同的属性文件中有我的连接细节(例如hibernate.dev.properties,hibernate.test.properties),我以编程方式加载在当前的环境中:

Configuration hibernateConfig = new Configuration();
hibernateConfig.addProperties("com/env.specific.properties");

老实说,我不知道JNDI是什么或如何使用。

我应该在特定的上下文参数值中写什么?有什么方法可以做类似于我对hibernate的操作吗?

我正在使用Tomcat 6.0,以防万一。

1 个答案:

答案 0 :(得分:1)

属性liquibase.datasource引用webapp的JNDI目录中DataSource对象的JNDI名称,在Liquibase手册中为documented

由于您没有使用JNDI,因此无法使用Liquibase提供的默认Servlet侦听器LiquibaseServletListener。我假设您正在直接创建JDBC资源,例如在您的Web应用程序中。您可能在某处有一个C3P0 DataSource连接池,或者以某种方式访问​​底层JDBC Connection

如果是这种情况,您可以进行自己的初始化并将JDBC Connection注入Liquibase,如下所示:

DataSource dataSource = ... // get from Hibernate somehow
Connection connection = dataSource.getConnection();
JdbcConnection liquibaseConnection = new JdbcConnection(connection);
Liquibase liquibase = new Liquibase("mychangelog.xml",...,liquibaseConnection);
liquibase.update("");

此代码段未经过测试,但应该是s.th.像那样。您可以在自己的Servlet Context Initializer监听器或特定于应用程序的代码中添加它 - 您手头有Hibernate配置的任何地方都可以检索DataSource。首先,请查看liquibase.servlet.LiquibaseServletListener如何做到这一点的来源。