springboot + shardingSphere5.0 + Dubbo2.7.x实现分库分表的情况下,集成 + seata1.4.2后,报出以下异常: Could not found any index in the table: xxx

wljmcqd8  于 2个月前  发布在  Spring
关注(0)|答案(5)|浏览(49)

各位大神好,我在springboot + shardingSphere5.0 + Dubbo2.7.x实现分库分表(3个库,t_order分4张表)的情况下,集成 + seata1.4.2后,报出以下异常:
Could not found any index in the table: xxx,查看了下源码,在io.seata.rm.datasource.sql.struct.cache.MysqlTableMetaCache#resultSetMetaToSchema方法中,会判断所有index是否为空,

try (ResultSet rsColumns = dbmd.getColumns(catalogName, schemaName, tableName, "%");
	ResultSet rsIndex = dbmd.getIndexInfo(catalogName, schemaName, tableName, false, true)) {
	while (rsIndex.next()) {
		String indexName = rsIndex.getString("INDEX_NAME");
		String colName = rsIndex.getString("COLUMN_NAME");
		ColumnMeta col = tm.getAllColumns().get(colName);

		if (tm.getAllIndexes().containsKey(indexName)) {
			IndexMeta index = tm.getAllIndexes().get(indexName);
			index.getValues().add(col);
		} else {
			IndexMeta index = new IndexMeta();
			index.setIndexName(indexName);
			index.setNonUnique(rsIndex.getBoolean("NON_UNIQUE"));
			index.setIndexQualifier(rsIndex.getString("INDEX_QUALIFIER"));
			index.setIndexName(rsIndex.getString("INDEX_NAME"));
			index.setType(rsIndex.getShort("TYPE"));
			index.setOrdinalPosition(rsIndex.getShort("ORDINAL_POSITION"));
			index.setAscOrDesc(rsIndex.getString("ASC_OR_DESC"));
			index.setCardinality(rsIndex.getInt("CARDINALITY"));
			index.getValues().add(col);
			if ("PRIMARY".equalsIgnoreCase(indexName)) {
				index.setIndextype(IndexType.PRIMARY);
			} else if (!index.isNonUnique()) {
				index.setIndextype(IndexType.UNIQUE);
			} else {
				index.setIndextype(IndexType.NORMAL);
			}
			tm.getAllIndexes().put(indexName, index);

		}
	}
	if (tm.getAllIndexes().isEmpty()) {
		throw new ShouldNeverHappenException("Could not found any index in the table: " + tableName);
	}
}
return tm;

【(tm.getAllIndexes().isEmpty()】这行条件成立就会抛出异常,请问此处的判断是什么用意,谢谢。
PS:表中都有主键

sycxhyv7

sycxhyv71#

分表后,debug看过此处的表名是什么吗? 主键也是会放到idnexes中

qlckcl4x

qlckcl4x2#

分表后,debug看过此处的表名是什么吗? 主键也是会放到idnexes中

就是配置的逻辑表名t_order,主键使用的Sharding提供的SNOWFLAKE生成

bwitn5fc

bwitn5fc3#

分表后,debug看过此处的表名是什么吗? 主键也是会放到idnexes中

就是配置的逻辑表名t_order,主键使用的Sharding提供的SNOWFLAKE生成

估计不是拿的实际表名查询导致的,这个问题可以反馈给sharding sphere社区一起看看

siotufzp

siotufzp4#

分表后,debug看过此处的表名是什么吗? 主键也是会放到idnexes中

就是配置的逻辑表名t_order,主键使用的Sharding提供的SNOWFLAKE生成

估计不是拿的实际表名查询导致的,这个问题可以反馈给sharding sphere社区一起看看

好的,非常感谢

kmynzznz

kmynzznz5#

各位大神好,我在springboot + shardingSphere5.0 + Dubbo2.7.x实现分库分表(3个库,t_order分4张表)的情况下,集成 + seata1.4.2后,报出以下异常: Could not found any index in the table: xxx,查看了下源码,在io.seata.rm.datasource.sql.struct.cache.MysqlTableMetaCache#resultSetMetaToSchema方法中,会判断所有index是否为空,

try (ResultSet rsColumns = dbmd.getColumns(catalogName, schemaName, tableName, "%");
	ResultSet rsIndex = dbmd.getIndexInfo(catalogName, schemaName, tableName, false, true)) {
	while (rsIndex.next()) {
		String indexName = rsIndex.getString("INDEX_NAME");
		String colName = rsIndex.getString("COLUMN_NAME");
		ColumnMeta col = tm.getAllColumns().get(colName);

		if (tm.getAllIndexes().containsKey(indexName)) {
			IndexMeta index = tm.getAllIndexes().get(indexName);
			index.getValues().add(col);
		} else {
			IndexMeta index = new IndexMeta();
			index.setIndexName(indexName);
			index.setNonUnique(rsIndex.getBoolean("NON_UNIQUE"));
			index.setIndexQualifier(rsIndex.getString("INDEX_QUALIFIER"));
			index.setIndexName(rsIndex.getString("INDEX_NAME"));
			index.setType(rsIndex.getShort("TYPE"));
			index.setOrdinalPosition(rsIndex.getShort("ORDINAL_POSITION"));
			index.setAscOrDesc(rsIndex.getString("ASC_OR_DESC"));
			index.setCardinality(rsIndex.getInt("CARDINALITY"));
			index.getValues().add(col);
			if ("PRIMARY".equalsIgnoreCase(indexName)) {
				index.setIndextype(IndexType.PRIMARY);
			} else if (!index.isNonUnique()) {
				index.setIndextype(IndexType.UNIQUE);
			} else {
				index.setIndextype(IndexType.NORMAL);
			}
			tm.getAllIndexes().put(indexName, index);

		}
	}
	if (tm.getAllIndexes().isEmpty()) {
		throw new ShouldNeverHappenException("Could not found any index in the table: " + tableName);
	}
}
return tm;

【(tm.getAllIndexes().isEmpty()】这行条件成立就会抛出异常,请问此处的判断是什么用意,谢谢。 PS:表中都有主键

我也遇到了这个问题,debug后发现,表面是 带了 引号,导致拿表结构的时候 tablename = 't_order', 去掉 号后正常
但是很奇怪,我的mysql 在5.6 的时候并没有遇到这个问题,升级到8.0 就出现了,代码没有任何改动,这块我还没来得及排查

相关问题