GridDB固定模式下JDBC连接配置异常求助
问题描述
将GridDB集群切换为Fixed Mode(非Multicast模式)后,原Java程序通过notificationMember配置可正常连接,但JDBC连接URL配置时出现版本不兼容错误。
代码片段
import java.net.URLEncoder; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties; public class JDBCSelect { public static void main(String[] args){ try { //=============================================== // Connecting to a cluster //=============================================== // Connection information of JDBC String jdbcAddress = "127.0.0.1"; String jdbcPort = "10001"; String clusterName = "myCluster"; String databaseName = "public"; String username = "admin"; String password = "admin"; String applicationName = "SampleJDBC"; // Encoding a cluster name and a database name String encodeClusterName = URLEncoder.encode(clusterName, "UTF-8"); String encodeDatabaseName = URLEncoder.encode(databaseName, "UTF-8"); // Creating a URL (Multicast method) String jdbcUrl = "jdbc:gs://"+jdbcAddress+":"+jdbcPort+"/"+encodeClusterName+"/"+encodeDatabaseName; Properties prop = new Properties(); prop.setProperty("user", username); prop.setProperty("password", password); prop.setProperty("applicationName", applicationName); // Connecting Connection con = DriverManager.getConnection(jdbcUrl, prop); //=============================================== // Creating a container and registering data //=============================================== { Statement stmt = con.createStatement(); // (Delete the container if it already exists) stmt.executeUpdate("DROP TABLE IF EXISTS SampleJDBC_Select"); // Creating a container stmt.executeUpdate("CREATE TABLE IF NOT EXISTS SampleJDBC_Select ( id integer PRIMARY KEY, value string )"); System.out.println("SQL Create Table name=SampleJDBC_Select"); // Registering a row int ret1 = stmt.executeUpdate("INSERT INTO SampleJDBC_Select values "+ "(0, 'test0'),(1, 'test1'),(2, 'test2'),(3, 'test3'),(4, 'test4')"); System.out.println("SQL Insert count=" + ret1); stmt.close(); } //=============================================== // Executing a search //=============================================== // (1) Creating a statement Statement stmt = con.createStatement(); // (2) Executing a SQL command ResultSet rs = stmt.executeQuery("SELECT * from SampleJDBC_Select where ID > 2"); // (3) Getting a result while( rs.next() ){ int id = rs.getInt(1); String value = rs.getString(2); System.out.println("SQL row(id=" + id + ", value=" + value + ")"); } //=============================================== // Terminating process //=============================================== stmt.close(); con.close(); System.out.println("success!"); } catch ( Exception e ){ e.printStackTrace(); } } }
执行命令
export CLASSPATH=${CLASSPATH}:/usr/share/java/gridstore-jdbc.jar:. javac JDBCSelect.java java JDBCSelect
错误信息
[10054:TXN_CLIENT_VERSION_NOT_ACCEPTABLE] (connectClientVersion=-9, serverVersion=15) (address=127.0.0.1:10001, partitionId=0)
at com.toshiba.mwcloud.gs.sql.internal.SQLErrorUtils.error(SQLErrorUtils.java:262)
at com.toshiba.mwcloud.gs.sql.internal.SQLStatement.execute(SQLStatement.java:751)
at com.toshiba.mwcloud.gs.sql.internal.SQLConnection.(SQLConnection.java:309)
at com.toshiba.mwcloud.gs.sql.internal.SQLDriver.connect(SQLDriver.java:61)
at com.toshiba.mwcloud.gs.sql.internal.common.DriverProvider$ChainDriver.connect(DriverProvider.java:62)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)
at JDBCSelect.main(JDBCSelect.java:37)
Caused by: com.toshiba.mwcloud.gs.sql.internal.GSStatementException: [10054:TXN_CLIENT_VERSION_NOT_ACCEPTABLE] (connectClientVersion=-9, serverVersion=15) (address=127.0.0.1:10001, partitionId=0)
at com.toshiba.mwcloud.gs.sql.internal.NodeConnection.executeStatementDirect(NodeConnection.java:574)
at com.toshiba.mwcloud.gs.sql.internal.NodeConnection.executeStatement(NodeConnection.java:381)
at com.toshiba.mwcloud.gs.sql.internal.NodeConnection.connect(NodeConnection.java:1010)
at com.toshiba.mwcloud.gs.sql.internal.NodeConnectionPool.resolve(NodeConnectionPool.java:162)
at com.toshiba.mwcloud.gs.sql.internal.NodeResolver.updateConnectionAndClusterInfo(NodeResolver.java:664)
at com.toshiba.mwcloud.gs.sql.internal.NodeResolver.prepareConnectionAndClusterInfo(NodeResolver.java:549)
at com.toshiba.mwcloud.gs.sql.internal.NodeResolver.getPartitionCount(NodeResolver.java:225)
at com.toshiba.mwcloud.gs.sql.internal.SQLConnection.getNextAddress(SQLConnection.java:1325)
at com.toshiba.mwcloud.gs.sql.internal.SQLConnection.reset(SQLConnection.java:1379)
at com.toshiba.mwcloud.gs.sql.internal.SQLStatement.execute(SQLStatement.java:564)
... 6 more
解决方案
1. 匹配JDBC驱动与服务端版本
错误代码TXN_CLIENT_VERSION_NOT_ACCEPTABLE明确提示版本不兼容,需确保gridstore-jdbc.jar版本与GridDB服务端完全一致:
- 查看服务端版本:执行
gs_stat -v命令 - 下载对应版本的JDBC驱动,替换当前的
/usr/share/java/gridstore-jdbc.jar
2. 配置Fixed Mode节点参数
Fixed Mode下JDBC无法通过Multicast自动发现节点,需手动指定集群成员地址。在代码的Properties配置中添加notificationMembers参数:
// 单节点配置,多节点用逗号分隔,格式为"host:port" prop.setProperty("notificationMembers", "127.0.0.1:10001");
多节点场景示例:
prop.setProperty("notificationMembers", "node1:10001,node2:10001,node3:10001");
修改后的连接代码片段
// 创建URL(Fixed Mode无需修改URL,通过Properties指定节点) String jdbcUrl = "jdbc:gs://"+jdbcAddress+":"+jdbcPort+"/"+encodeClusterName+"/"+encodeDatabaseName; Properties prop = new Properties(); prop.setProperty("user", username); prop.setProperty("password", password); prop.setProperty("applicationName", applicationName); // 添加Fixed Mode节点配置 prop.setProperty("notificationMembers", "127.0.0.1:10001"); // 连接 Connection con = DriverManager.getConnection(jdbcUrl, prop);
验证连接
重新编译执行代码:
javac JDBCSelect.java java JDBCSelect
配置正确的话,程序会正常输出创建表、插入数据及查询结果的日志。
内容的提问来源于stack exchange,提问作者ogbeks

