java - Liquibase 的数据源作为 Servlet 监听器

标签 java jakarta-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 以及如何使用 JNDI。

我应该在特定的上下文参数值中写什么?有没有办法做一些类似于我对 hibernate 所做的事情?

我正在使用 Tomcat 6.0,以防有帮助。

最佳答案

属性liquibase.datasource引用Web应用程序JNDI目录中DataSource对象的JNDI名称,如documented在 Liquibase 手册中。

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

如果是这种情况,您可以自行初始化并将 JDBC Connection 注入(inject) 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("");

此代码片段未经测试,但应该是……。像那样。您可以将其添加到您自己的 Servlet Context Initializer 监听器中或应用程序特定的代码中 - 您手头有 Hibernate 配置并且可以检索数据源的任何位置。首先,查看一下 liquibase.servlet.LiquibaseServletListener 的源代码如何做到这一点。

关于java - Liquibase 的数据源作为 Servlet 监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735766/

相关文章:

javascript - 如何在 struts 2 中将一个表的内容传输到另一个表?

java - org.xml.sax.SAXParseException : Document is invalid: no grammar found.

java - 如何从 Color 类扩展

java - 通过 JMX 访问 Apache ActiveMQ 抛出异常 Broker Not Found 5.10

php - 在通用服务器环境中同时利用 Spring 和 php 的优点

java - 轮询时 session 超时

java - @Inject 的刻板印象可能吗?

java - GWT:在服务器端获取 java.lang.NoClassDefFoundError

java - 广度优先搜索 100% 无效

java - Struts - <html :errors/> to display error messages in Jsp? 的替代方案