14.2. 使用 JDBC 锁定系统
概述
JDBC 锁定机制主要用于在单独的机器上存在红帽 Fuse 实例的故障转移部署。
在这种情况下,主实例会在由数据库托管的锁定表中有一个锁定。如果主实例丢失锁定,则等待的辅助进程获得对锁定表的访问,并完全启动其容器。
在类路径中添加 JDBC 驱动程序
在 JDBC 锁定系统中,JDBC 驱动程序需要位于主/secondary设置中每个实例的类路径上。在类路径中添加 JDBC 驱动程序,如下所示:
-
将 JDBC 驱动程序 JAR 文件复制到每个 Red Hat Fuse 实例的
ESBInstallDir/lib/ext
目录中。 修改
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