为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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 出现异常
可以在数据库服务器安装目录drivers下下载对应版本jar包
https://eco.dameng.com/community/question/b8fc7ff84e39699cbd224ddff28d9325
这个是因为 jdbc 驱动版本不匹配导致的,更换最新版本的 jdbc 驱动即可。