当我们需要获取 DataSource 对象所连接的数据库的数据库名称时,正常是通过如下代码来获取:
String databaseName = dataSource.getConnection().getMetaData().getDatabaseProductName();
我们知道 OceanBase 数据库企业版的租户是区分 Oracle 和 MySQL 两种模式的,使用以上代码获取的数据库类型,在驱动包 oceanbase-client-2.4.9.jar
版本开始,驱动包中不再返回 Oracle
或 MySQL
,默认返回 OceanBase
。
下面是 2.4.8
和 2.4.9
两个版本的源代码:
// 2.4.9 版本
public String getDatabaseProductName() throws SQLException {
if(connection.getProtocol().getOptions().useCompatibleMetadata) {
if(protocol.isOracleMode()) {
return "Oracle";
}
return "MySQL";
}
return "OceanBase";
}
// 2.4.8 版本
public String getDatabaseProductName() throws SQLException {
if(connection.getProtocol().isOracleMode()) {
return "Oracle";
} else {
return "MySQL";
}
}
所以,可以得出结论,就是驱动包自 2.4.9
开始,如果想获取精确的 Oracle 或 MySQL 模式,需要在 jdbc 连接的 Url 中添加参数 useCompatibleMetadata=true
来达到目的,因为这个默认值是 false。
(END)