14.2. 使用 JDBC 锁定系统
概述
JDBC 锁定机制主要用于在独立的机器上存在红帽 Fuse 实例的故障转移部署。
在这种情况下,主实例在托管在数据库上的锁定表中保存锁定。如果主实例丢失了锁定,则等待次要进程可以访问锁定表,并完全启动其容器。
将 JDBC 驱动程序添加到 classpath
在 JDBC 锁定系统中,JDBC 驱动程序需要位于主/次要设置中各个实例的类路径上。在 classpath 中添加 JDBC 驱动程序,如下所示:
-
将 JDBC 驱动程序 JAR 文件复制到每个红帽 Fuse 实例的
ESBInstallDir/lib/ext
目录中。 修改
bin/karaf
启动脚本,使其在其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-
前缀作为前缀来重命名驱动程序 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 的数据库。第一个用于获取锁定表的 Red Hat Fuse 实例是主实例。如果与数据库的连接丢失,主实例将尝试正常关闭,允许次要实例在恢复数据库服务时成为主实例。前一个主实例需要手动重启。
在 Oracle 上配置 JDBC 锁定
如果您在 JDBC 锁定场景中使用 Oracle 作为数据库,则 etc/system.properties
文件中的 karaf.lock.class
属性必须指向 org.apache.karaf.main.lock.oracle 2.0.0Lock
。
否则,为您的设置配置 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.DerbyDatabaseLock
。例如,您可以配置 system.properties
文件,如下所示:
例 14.4. 用于 Derby 的 JDBC 锁定文件配置
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.MySQL Database
。例如,您可以配置 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.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 锁定类
Apache Karaf 当前提供以下 JDBC 锁定类:
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