4.2.2.1 执行 ClusterJ 应用程序和会话

在本节中,我们将讨论如何启动 ClusterJ 应用程序和 ClusterJ 应用程序环境。

执行 ClusterJ 应用程序。  所有 ClusterJ jar 文件通常都可以在 share/mysql/java/MySQL 安装目录中找到。执行 ClusterJ 应用程序时,必须将类路径设置为指向这些文件。此外,您必须将java.library.path 变量设置为指向包含集群 ndbclient库的目录,该目录通常位于 lib/mysql(也在 MySQL 安装目录中)。MyClusterJApp因此,您可能会以类似于此处显示的方式 执行 ClusterJ 程序 :

$> java -classpath /usr/local/mysql/share/mysql/java/clusterj.jar \
              -Djava.library.path=/usr/local/mysql/lib MyClusterJApp
笔记

ClusterJ jar 文件的精确位置 libndbclient取决于 NDB Cluster 软件的安装方式。有关详细信息,请参阅 安装布局

ClusterJ 鼓励您在编译时和运行时使用不同的 jar 文件。这是为了消除应用程序意外访问实现工件的能力。ClusterJ 旨在独立于 NDB Cluster 软件版本,而该ndbclient层是特定于版本的。这使得维护稳定的 API 成为可能,以便使用给定 NDB Cluster 版本针对它编写的应用程序在集群升级到新版本后继续运行。

获取 SessionFactory 并获取 Session。  SessionFactory 是使用给定 NDB Cluster 的所有 ClusterJ 会话的源。SessionFactory 通常,每个 NDB Cluster,每个 Java 虚拟机 只有一个 。

SessionFactory 可以通过设置一个或多个属性来配置。执行此操作的首选方法是将它们放入属性文件中,如下所示:

com.mysql.clusterj.connectstring=localhost:1186
com.mysql.clusterj.database=mydb

属性文件的名称是任意的;但是,按照惯例,此类文件以 .properties扩展名命名。对于 ClusterJ 应用程序,习惯上将文件命名为 clusterj.properties.

编辑并保存文件后,您可以将其内容加载到 的实例中 Properties,如下所示:

File propsFile = new File("clusterj.properties");
InputStream inStream = new FileInputStream(propsFile);
Properties props = new Properties();
props.load(inStream);

也可以直接设置这些属性,而不使用属性文件:

Properties props = new Properties();

props.put("com.mysql.clusterj.connectstring", "localhost:1186");
props.put("com.mysql.clusterj.database", "mydb");

设置和加载属性后(使用刚刚显示的任一技术),您可以获得一个 SessionFactory,然后从中获取一个 Session 实例。为此,您使用 SessionFactorygetSession() 方法,如下所示:

SessionFactory factory = ClusterJHelper.getSessionFactory(props);

Session session = factory.getSession();

通常设置和加载 com.mysql.clusterj.connectstringcom.mysql.clusterj.database 属性就足够了(这些属性连同 com.mysql.clusterj.max.transactions,在启动 之后无法更改 SessionFactory)。有关可用 SessionFactory 属性和常用值的完整列表,请参阅 com.mysql.clusterj.Constants

笔记

Session 实例不能在线程之间共享。应用程序中的每个线程都应该使用自己的 Session.

对于 com.mysql.clusterj.connectstring,我们使用默认的 NDB Cluster 连接字符串 localhost:1186(有关更多信息,请参阅 NDB Cluster 连接字符串)。对于 的值 com.mysql.clusterj.database,我们mydb在此示例中使用,但此值可以是任何包含 NDB表的数据库的名称。SessionFactory 有关可以以这种方式设置 的所有属性的列表 ,请参阅com.mysql.clusterj.Constants

错误处理和重新连接。  使用 ClusterJ 时发生的错误应该由具有公共错误处理程序的应用程序处理。处理程序需要能够检测和区分三种类型的错误,并相应地处理它们:

  • 正常错误:这些是应用程序级别的错误(例如,处理重复键、外键约束或超时的错误)。它们应该以特定于应用程序的方式处理,如果解决了,应用程序可以继续处理事务。

  • 意外错误:这些是应用程序条件无法解释的无法使用集群的故障,但不是致命的。应用程序应该关闭 ClusterJ 会话并重新打开一个新会话。

  • 连接错误:这些错误如错误 4009 和 4010,表示网络中断。有两种可能的场景,取决于是否启用了自动重新连接功能(适用于 NDB Cluster 7.5.7 及更高版本):

    • 启用自动重新连接:当连接属性 com.mysql.clusterj.connection.reconnect.timeout 设置为正数时启用该功能,指定以秒为单位的重新连接超时。

      当 ClusterJ 检测到与 NDB Cluster 断开连接时,它将 from更改 State为 ;然后 等待应用程序关闭所有会话,然后尝试通过关闭连接池中的所有连接并使用原始池属性重新创建池来将应用程序重新连接到 NDB Cluster。重新建立所有连接后,的 变为SessionFactoryOPENRECONNECTINGSessionFactoryStateSessionFactoryOPEN再次,应用程序现在可以获取会话。

      SessionFactory.getState() 方法返回 的StateSessionFactory它是OPENRECONNECTING或 之一CLOSED。尝试获取会话时结果 State不是 ,并显示消息Session factory is not openOPENClusterJUserException

      如果应用程序在指定的超时期限结束时未关闭所有会话,则 com.mysql.clusterj.connection.reconnect.timeout强制 SessionFactory 关闭所有打开的会话(这可能会导致资源丢失),然后尝试重新连接。

    • 未启用自动重新连接:这是在连接属性 com.mysql.clusterj.connection.reconnect.timeout 尚未设置或已设置为零时(对于不支持自动重新连接功能的旧 NDB Cluster 版本也是如此)。

      一旦连接丢失,ClusterJ 不会尝试重新连接到 NDB Cluster。应用程序应关闭所有会话,然后重新启动 SessionFactory. 重启 SessionFactory 可以是自动应用功能,也可以是人工干预。在任何一种情况下,代码都应等到所有会话都已关闭(即,接口中的公共方法 getConnectionPoolSessionCounts ()SessionFactory 为所有池连接返回零)。然后 SessionFactory 可以关闭再打开,应用程序可以重新获取会话。

    除了启用该功能并等待 ClusterJ 检测到断开连接并尝试重新连接之外,您还可以让应用程序本身在检测到连接错误时通过调用以下 SessionFactory.reconnect(int timeout) 方法启动重新连接过程:触发上述重新连接过程,但是使用该方法的timeout参数reconnect()作为关闭所有打开的会话的时间限制。

记录。  ClusterJ 使用 Java 日志记录。以下是 ClusterJ 日志记录的一些默认设置,这些设置在 logging.properties文件中指定并且可以在那里修改:

  • 所有类的日志记录级别都设置INFO为。

  • java.util.logging.FileHandler 作为处理程序 使用。

  • 默认级别 java.util.logging.FileHandler设置为FINEST

  • 用作 java.util.logging.SimpleFormatter处理程序的格式化程序。

  • 日志文件放在target 当前工作目录下的目录中,文件名一般采用 , 其中是解决文件名冲突的唯一编号(详见Java文档 )。 logNumNumjava.util.logging.FileHandler

logging.properties文件默认位于当前工作目录中,但可以在 java.util.logging.config.file启动 Java 时通过指定系统属性来更改位置。