14.2. 使用 JDBC 锁定系统

概述

JDBC 锁定机制主要用于在单独的机器上存在红帽 Fuse 实例的故障转移部署。

在这种情况下,主实例会在由数据库托管的锁定表中有一个锁定。如果主实例丢失锁定,则等待的辅助进程获得对锁定表的访问,并完全启动其容器。

在类路径中添加 JDBC 驱动程序

在 JDBC 锁定系统中,JDBC 驱动程序需要位于主/secondary设置中每个实例的类路径上。在类路径中添加 JDBC 驱动程序,如下所示:

  1. 将 JDBC 驱动程序 JAR 文件复制到每个 Red Hat Fuse 实例的 ESBInstallDir/lib/ext 目录中。
  2. 修改 bin/karaf start 脚本,使其在 CLASSPATH 变量中包含 JDBC 驱动程序 JAR。

    例如,如果为 JDBC JAR 文件 JDBCJarFile.jar,您可以按如下所示修改起始脚本(在 *NIX 操作系统上):

        ...
        # Add the jars in the lib dir
        for file in "$KARAF_HOME"/lib/karaf*.jar
        do
            if [ -z "$CLASSPATH" ]; then
                CLASSPATH="$file"
            else
                CLASSPATH="$CLASSPATH:$file"
            fi
        done
        CLASSPATH="$CLASSPATH:$KARAF_HOME/lib/JDBCJarFile.jar"
    注意

    如果您要添加 MySQL 驱动程序 JAR 或 PostgreSQL 驱动程序 JAR,您必须用 karaf- 前缀加上前缀来重命名 driver JAR。否则,Apache Karaf 将挂起,日志表明 Apache Karaf 无法找到该驱动程序。

配置 JDBC 锁定系统

要配置 JDBC 锁定系统,请更新主/次要部署中每个实例的 etc/system.properties 文件,如下所示

例 14.2. JDBC 锁定文件配置

karaf.lock=true
karaf.lock.class=org.apache.karaf.main.lock.DefaultJDBCLock
karaf.lock.level=50
karaf.lock.delay=10000
karaf.lock.jdbc.url=jdbc:derby://dbserver:1527/sample
karaf.lock.jdbc.driver=org.apache.derby.jdbc.ClientDriver
karaf.lock.jdbc.user=user
karaf.lock.jdbc.password=password
karaf.lock.jdbc.table=KARAF_LOCK
karaf.lock.jdbc.clustername=karaf
karaf.lock.jdbc.timeout=30

在示例中,如果不存在名为 sample 的数据库,则会创建名为 sample 的数据库。获取锁定表的第一个红帽 Fuse 实例是主实例。如果与数据库的连接丢失,则主实例会尝试正常关闭,允许次要实例在恢复数据库服务时成为主实例。之前的主实例需要手动重启。

在 Oracle 中配置 JDBC 锁定

如果您在 JDBC 锁定方案中使用 Oracle 作为数据库,则 etc/system.properties 文件中的 karaf.lock.class 属性必须指向 org.apache.karaf.main.lock.main.Oracle JDBCLock

否则,将 system.properties 文件配置为常规设置,如下所示:

例 14.3. Oracle 的 JDBC 锁定文件配置

karaf.lock=true
karaf.lock.class=org.apache.karaf.main.lock.OracleJDBCLock
karaf.lock.jdbc.url=jdbc:oracle:thin:@hostname:1521:XE
karaf.lock.jdbc.driver=oracle.jdbc.OracleDriver
karaf.lock.jdbc.user=user
karaf.lock.jdbc.password=password
karaf.lock.jdbc.table=KARAF_LOCK
karaf.lock.jdbc.clustername=karaf
karaf.lock.jdbc.timeout=30
注意

karaf.lock.jdbc.url 需要活跃的 Oracle 系统 ID(SID)。这意味着,您必须在使用此特定锁定前手动创建数据库实例。

在 Derby 中配置 JDBC 锁定

如果您在 JDBC 锁定方案中使用 Derby 作为数据库,则 etc/system.properties 文件中的 karaf.lock.class 属性应指向 org.apache.karaf.main.lock.Derby 4.4.2Lock。例如,您可以配置 system.properties 文件,如下所示:

例 14.4. Derby 的 JDBC Lock 文件配置

karaf.lock=true
karaf.lock.class=org.apache.karaf.main.lock.DerbyJDBCLock
karaf.lock.jdbc.url=jdbc:derby://127.0.0.1:1527/dbname
karaf.lock.jdbc.driver=org.apache.derby.jdbc.ClientDriver
karaf.lock.jdbc.user=user
karaf.lock.jdbc.password=password
karaf.lock.jdbc.table=KARAF_LOCK
karaf.lock.jdbc.clustername=karaf
karaf.lock.jdbc.timeout=30

在 MySQL 中配置 JDBC 锁定

如果您在 JDBC 锁定方案中使用 MySQL 作为数据库,则 etc/system.properties 文件中的 karaf.lock.class 属性必须指向 org.apache.karaf.main.lock.main.MySQL JDBCLock。例如,您可以配置 system.properties 文件,如下所示:

例 14.5. MySQL 的 JDBC 锁定文件配置

karaf.lock=true
karaf.lock.class=org.apache.karaf.main.lock.MySQLJDBCLock
karaf.lock.jdbc.url=jdbc:mysql://127.0.0.1:3306/dbname
karaf.lock.jdbc.driver=com.mysql.jdbc.Driver
karaf.lock.jdbc.user=user
karaf.lock.jdbc.password=password
karaf.lock.jdbc.table=KARAF_LOCK
karaf.lock.jdbc.clustername=karaf
karaf.lock.jdbc.timeout=30

在 PostgreSQL 上配置 JDBC 锁定

如果您在 JDBC 锁定方案中使用 PostgreSQL 作为数据库,则 etc/system.properties 文件中的 karaf.lock.class 属性必须指向 org.apache.karaf.main.lock.main.PostgreSQL JDBCLock。例如,您可以配置 system.properties 文件,如下所示:

例 14.6. PostgreSQL 的 JDBC 锁定文件配置

karaf.lock=true
karaf.lock.class=org.apache.karaf.main.lock.PostgreSQLJDBCLock
karaf.lock.jdbc.url=jdbc:postgresql://127.0.0.1:5432/dbname
karaf.lock.jdbc.driver=org.postgresql.Driver
karaf.lock.jdbc.user=user
karaf.lock.jdbc.password=password
karaf.lock.jdbc.table=KARAF_LOCK
karaf.lock.jdbc.clustername=karaf
karaf.lock.jdbc.timeout=0

JDBC 锁定类

以下 JDBC 锁定类目前由 Apache Karaf 提供:

org.apache.karaf.main.lock.DefaultJDBCLock
org.apache.karaf.main.lock.DerbyJDBCLock
org.apache.karaf.main.lock.MySQLJDBCLock
org.apache.karaf.main.lock.OracleJDBCLock
org.apache.karaf.main.lock.PostgreSQLJDBCLock