注册

jdbc 驱动(com.dameng jdbc8 1.8) 获取 MinorVersion 时,出现 Integer.parseInt 转换错误

刘洪青 2023/02/02 1079 4

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:
【操作系统】:
【CPU】:
【问题描述】*:

环境说明:

docker 镜像,dm8_single:v8.1.2.128_ent_x86_64_ctm_pack4
jdbc 驱动,com.dameng jdbc8 1.8 (http://119.96.92.173:8181/service/rest/repository/browse/maven-releases/com/dameng/jdbc8/1.8/)

docker 运行后,重新初始化了实例。操作步骤如下:

修改配置文件需要重新初始化,相关命令如下:
1、停止服务 
ps -ef|grep dmserver
kill 
2、删除实例 
cd /opt/dmdbms/data/
rm -rf ./* 
3、初始化实例 
cd /opt/dmdbms/bin
./dminit path=/opt/dmdbms/data port_num=5236 charset=1 length_in_char=1 blank_pad_mode=1 case_sensitive=0 page_size=16 extent_size=16 

4、启动服务 
cd /opt/dmdbms/bin 
./dmserver /opt/dmdbms/data/DAMENG/dm.ini &

./dmserver /opt/dmdbms/data/DAMENG/dm.ini -noconsole

异常:

驱动包中,dm.jdbc.driver.DmdbDatabaseMetaData 的 do_getDatabaseMinorVersion 方法 出现 java.lang.NumberFormatException: For input string: “” 异常

异常堆栈:

ERROR: Unexpected error
java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:592)
	at java.lang.Integer.parseInt(Integer.java:615)
	at dm.jdbc.driver.DmdbDatabaseMetaData.do_getDatabaseMinorVersion(DmdbDatabaseMetaData.java:417)
	at dm.jdbc.driver.DmdbDatabaseMetaData.getDatabaseMinorVersion(DmdbDatabaseMetaData.java:8591)
	at org.flywaydb.core.internal.dbsupport.DbSupportFactory.getDatabaseProductName(DbSupportFactory.java:183)
	at org.flywaydb.core.internal.dbsupport.DbSupportFactory.createDbSupport(DbSupportFactory.java:66)
	at org.flywaydb.core.Flyway.execute(Flyway.java:1369)
	at org.flywaydb.core.Flyway.migrate(Flyway.java:930)
	at org.flywaydb.commandline.Main.executeOperation(Main.java:148)
	at org.flywaydb.commandline.Main.main(Main.java:103)

异常源码:

public String do_getDatabaseProductVersion() { DmdbResultSet dmdbResultSet = null; try { dmdbResultSet = DriverUtil.executeQuery(this.connection, "select top 1 banner, id_code from v$version where banner like 'DM Database Server%'"); if (dmdbResultSet.next()) { String str = String.valueOf(StringUtil.trimToEmpty(dmdbResultSet.getString(1))) + "." + StringUtil.trimToEmpty(dmdbResultSet.getString(2)); int i = str.indexOf("V"); str = (i != -1) ? str.substring(i + 1) : str; String[] arrayOfString = str.split("-"); return String.valueOf(arrayOfString[0]) + "." + arrayOfString[1] + "." + arrayOfString[2]; } } catch (Exception exception) { MiscUtil.close(dmdbResultSet); try { dmdbResultSet = DriverUtil.executeQuery(this.connection, "select top 1 * from v$version where banner like 'DM Database Server%'"); if (dmdbResultSet.next()) { String str = dmdbResultSet.getString(1); int i = str.indexOf("-Build"); str = (i != -1) ? str.substring(0, i) : str; int j = str.lastIndexOf("V"); return (j != -1) ? str.substring(j + 1) : str; } } catch (Exception exception1) {} } finally { MiscUtil.close(dmdbResultSet); } return this.connection.do_getClientInfo("serverVersion"); } public int do_getDatabaseMinorVersion() { if (this.connection.compatibleOracle()) return 1; String[] arrayOfString = do_getDatabaseProductVersion().split("\\."); return Integer.parseInt(arrayOfString[1]); }

异常原因:

select top 1 banner, id_code from v$version where banner like 'DM Database Server%'

LINEID     banner                   id_code
---------- ------------------------ -----------------------------------------
1          DM Database Server 64 V8 --08134283904-20220804-166351-20005 Pack4

代码中,
在 do_getDatabaseProductVersion 经过处理后,返回 8...08134283904 (感觉如此)
导致 do_getDatabaseMinorVersion 中 split 后 拿到了一个 空字符串
最终使得 Integer.parseInt 出现异常

回答 0
暂无回答
扫一扫
联系客服