在本節中,我們將討論如何啟動 ClusterJ 應用程式以及 ClusterJ 應用程式環境。
執行 ClusterJ 應用程式。 所有 ClusterJ jar 檔案通常都可以在 MySQL 安裝目錄的 share/mysql/java/
中找到。執行 ClusterJ 應用程式時,您必須設定類別路徑以指向這些檔案。此外,您必須設定 java.library.path
變數以指向包含 Cluster ndbclient
程式庫的目錄,該目錄通常可以在 lib/mysql
中找到(也在 MySQL 安裝目錄中)。因此,您可能會以類似於此處顯示的方式執行 ClusterJ 程式 MyClusterJApp
$> 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 和取得連線。 SessionFactory
是使用給定 NDB Cluster 的所有 ClusterJ 連線的來源。通常,每個 NDB Cluster、每個 Java 虛擬機器只有一個 SessionFactory
。
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
執行個體。為此,您可以使用 SessionFactory
的 getSession()
方法,如下所示
SessionFactory factory = ClusterJHelper.getSessionFactory(props);
Session session = factory.getSession();
通常,設定並載入 com.mysql.clusterj.connectstring
和 com.mysql.clusterj.database
屬性就足夠了(而且這些屬性以及 com.mysql.clusterj.max.transactions
在啟動 SessionFactory
後就無法變更)。如需可用的 SessionFactory
屬性和常用值的完整清單,請參閱 com.mysql.clusterj.Constants。
對於 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 的連線中斷時,它會將
SessionFactory
的State
從OPEN
變更為RECONNECTING
;然後,SessionFactory
會等待應用程式關閉所有連線,然後嘗試透過關閉連線集區中的所有連線並使用原始集區屬性重新建立集區,將應用程式重新連線到 NDB Cluster。重新建立所有連線後,SessionFactory
的State
會再次變為OPEN
,而應用程式現在可以取得連線。SessionFactory.getState()
方法會傳回SessionFactory
的State
,其為OPEN
、RECONNECTING
或CLOSED
其中之一。當State
不是OPEN
時嘗試取得連線會導致ClusterJUserException
,訊息為 Session factory is not open。如果應用程式在
com.mysql.clusterj.connection.reconnect.timeout
指定的逾時期間結束前未關閉所有連線,則SessionFactory
會強制關閉所有開啟的連線(這可能會導致資源遺失),然後嘗試重新連線。 -
未啟用自動重新連線: 這是當連線屬性
com.mysql.clusterj.connection.reconnect.timeout
未設定,或已設定為零時(這也適用於不支援自動重新連線功能的較舊 NDB Cluster 版本)。一旦連線中斷,ClusterJ 不會嘗試重新連線至 NDB Cluster。應用程式應關閉所有工作階段,然後重新啟動
SessionFactory
。重新啟動SessionFactory
可以是自動應用程式功能或手動介入。無論是哪種情況,程式碼都應等待直到所有工作階段都已關閉(也就是說,SessionFactory
介面中的公開方法 getConnectionPoolSessionCounts() 對於所有集區連線都回傳零)。然後,SessionFactory
即可關閉並重新開啟,應用程式可以再次取得工作階段。
您也可以讓應用程式本身在偵測到連線錯誤時,透過呼叫
SessionFactory.reconnect(int timeout)
方法來啟動重新連線程序,而不是啟用此功能並等待 ClusterJ 偵測到連線中斷並嘗試重新連線:這會觸發上述的重新連線程序,但使用reconnect()
方法的timeout
引數作為關閉所有開啟工作階段的時間限制。 -
記錄。ClusterJ 使用 Java 記錄。以下是 ClusterJ 記錄的一些預設設定,這些設定在 logging.properties
檔案中指定,且可以在該處修改
所有類別的記錄層級都設定為
INFO
。使用
java.util.logging.FileHandler
作為處理常式。java.util.logging.FileHandler
的預設層級設定為FINEST
使用
java.util.logging.SimpleFormatter
作為處理常式的格式化器。記錄檔會放在目前工作目錄下的
target
目錄中,而檔案名稱通常採用log
的模式,其中Num
Num
是用於解決檔案名稱衝突的唯一數字 (詳細資料請參閱 Java 文件中有關java.util.logging.FileHandler
的說明)。
logging.properties
檔案預設位於目前工作目錄中,但您可以在啟動 Java 時指定系統屬性 java.util.logging.config.file
來變更其位置。