当我们需要获取 DataSource 对象所连接的数据库的数据库名称时,正常是通过如下代码来获取:

String databaseName = dataSource.getConnection().getMetaData().getDatabaseProductName();

我们知道 OceanBase 数据库企业版的租户是区分 Oracle 和 MySQL 两种模式的,使用以上代码获取的数据库类型,在驱动包 oceanbase-client-2.4.9.jar 版本开始,驱动包中不再返回 OracleMySQL,默认返回 OceanBase

下面是 2.4.82.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)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐