0

产品名称:Open Liberty 产品版本:20.0.0.7 产品版本:Open

是否可以使用 Embedded.derby.DB 在基于文件系统的默认 derby DB 上实现持久 ejbtimers

我在 /tmp/derby 中安装了 derby,使用以下配置了 server.xml,当我启动 OpenLiberty JVM 时,我没有看到在 /tmp 下创建任何文件,我在这种方法中缺少什么?

        <feature>ejbPersistentTimer-3.2</feature>

       <library id="DerbyLib">
            <fileset dir="/tmp/derby/lib" includes="derby.jar"/>
        </library>
        <dataSource id="DefaultDerbyDatasource" jndiName="jdbc/defaultDatasource" statementCacheSize="10" transactional="false">
           <jdbcDriver libraryRef="DerbyLib"/>
           <properties.derby.embedded createDatabase="create" databaseName="/tmp/sample.ejbtimer.db" shutdownDatabase="false"/>
           <containerAuthData user="user1" password="derbyuser" />
        </dataSource>

4

2 回答 2

0

通常,不建议将 Derby Embedded 数据库用于持久性 EJB 计时器,因为 Derby Embedded 的限制是所有连接都使用相同的类加载器(也意味着相同的 JVM)。这意味着您无法利用故障转移功能(missedTaskThreshold 设置),甚至根本无法将多台服务器连接到数据库。如果您决定使用 Derby Embedded 数据库,则意味着您将自己限制在单个服务器上。您可以根据自己的需求自行决定是否可以接受。

在您提供的示例配置的情况下,它不起作用,因为 Liberty 中的 EJB 持久计时器功能无法知道您的数据源,jndiName 为“jdbc/defaultDatasource”的“DefaultDerbyDatasource”是它应该使用的数据源利用。此外,在您希望 EJB 持久性计时器使用的数据源上指定 transactional="false" 是不正确的,因为 EJB 持久性计时器本质上是事务性的。

我假设您打算做的是配置 Java EE 默认数据源并期望 EJB 持久计时器使用它。该方法将起作用,除了您需要配置 Java EE 默认数据源之外,您需要将 id 指定为“DefaultDataSource”。

这是一个将配置的数据源切换到 Java EE 默认数据源并删除 transactional="false" 配置的示例,

  <library id="DerbyLib">
    <fileset dir="/tmp/derby/lib" includes="derby.jar"/>
  </library>
  <dataSource id="DefaultDataSource" jndiName="jdbc/defaultDatasource" statementCacheSize="10">
    <jdbcDriver libraryRef="DerbyLib"/>
    <properties.derby.embedded createDatabase="create" databaseName="/tmp/sample.ejbtimer.db" shutdownDatabase="false"/>
    <containerAuthData user="user1" password="derbyuser" />
  </dataSource>

默认情况下,一旦应用程序运行并使用 EJB 模块,EJB 持久计时器功能应该创建数据库表。但是,您可以通过运行 ddlgen 实用程序来验证该点之前的配置(在更正上述配置之后)

https://www.ibm.com/docs/en/was-liberty/base?topic=line-running-ddlgen-utility

这使您有机会查看它将使用的 DDL 并可选择手动运行它(如果您通过关闭自动表创建,这很有用 <databaseStore id="defaultDatabaseStore" createTables="false"/>

于 2021-04-13T16:44:06.277 回答
0

查看这本书 - http://www.redbooks.ibm.com/abstracts/sg248076.html?Open 在“5.2.4 使用计时器开发应用程序”一章中,您应该找到所有需要的东西。

根据评论更新:

如果您查看这本书和日志,它会显示:

[INFO ] CNTR4000I: The ITSOTimerApp.war EJB module in the ITSOTimerApp
application is starting.
[INFO ] CNTR0167I: The server is binding the com.ibm.itso.timers.TimerBean
interface of the TimerBean enterprise bean in the ITSOTimerApp.war module of
the ITSOTimerApp application. The binding location is:
java:global/ITSOTimerApp/TimerBean!com.ibm.itso.timers.TimerBean
[INFO ] DSRA8203I: Database product name : Apache Derby
[INFO ] DSRA8204I: Database product version : 10.8.2.3 - (1212722)
[INFO ] DSRA8205I: JDBC driver name : Apache Derby Embedded JDBC Driver
[INFO ] DSRA8206I: JDBC driver version : 10.8.2.3 - (1212722)
[INFO ] CNTR0219I: The server created 1 persistent automatic timer or timers
and 0 non-persistent automatic timer or timers for the ITSOTimerApp.war module.
TimerBean initialized

它会“根据需要”创建数据库,因此如果您没有任何持久性计时器 bean,则该服务将不会启动,也不会创建数据库。

Liberty 通常遵循惰性模型并且不会启动不需要的服务。

所以创建示例应用程序,然后将创建您的数据库。当没有人请求时,无需创建数据库或连接到数据库。

于 2021-04-06T10:51:06.900 回答