SpringBoot兼容人大金仓数据库

最近公司要将系统进行国产化数据库人大金仓的适配,在适配过程中发现了许多问题,在此记录 1、引入依赖 根据安装的数据库版本决定需要引入对应的驱动版本和数据库方言,我们安装的是kingbaseESV8版本,所以我们引入8.2.0的驱动,我们是将jar包推到私服上的,所以直接通过依赖引入

<dependency>
			<groupId>com.esen.jdbc</groupId>
			<artifactId>kingbasejdbc4</artifactId>
			<version>8.2.0</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate.dialect</groupId>
			<artifactId>KingbaseDialect</artifactId>
			<version>1.0</version>
		</dependency>

提取码:qwer 2、配置数据库连接信息和数据库方言

#KINGBASE
orm.database=
orm.databasePlatform=org.hibernate.dialect.KingbaseDialect

# 人大金仓
spring.datasource.driverClassName=com.kingbase8.Driver
spring.datasource.url=jdbc:kingbase8://localhost:54321/TEST
spring.datasource.username=SYSTEM
spring.datasource.password=123456

3、自动建表问题 引用的Hibernate5.6.9版本,自动建表时会进行元数据的提取 默认为null,而KingbaseDialect中有具体返回,所以会执行后续的元数据提取操作

提取元数是从设置的QuerySequencesString中设置的sql执行查询后从结果中提取sequence_name,sequence_catalog,sequence_schema等信息,如果为空,则会抛出异常:The column name sequence_catalog was not found in this ResultSet

public Iterable<SequenceInformation> extractMetadata(ExtractionContext extractionContext) throws SQLException {
          
   
        String lookupSql = extractionContext.getJdbcEnvironment().getDialect().getQuerySequencesString();
        return lookupSql == null ? SequenceInformationExtractorNoOpImpl.INSTANCE.extractMetadata(extractionContext) : (Iterable)extractionContext.getQueryResults(lookupSql, (Object[])null, (resultSet) -> {
          
   
            IdentifierHelper identifierHelper = extractionContext.getJdbcEnvironment().getIdentifierHelper();
            ArrayList sequenceInformationList = new ArrayList();

            while(resultSet.next()) {
          
   
                sequenceInformationList.add(new SequenceInformationImpl(new QualifiedSequenceName(identifierHelper.toIdentifier(this.resultSetCatalogName(resultSet)), identifierHelper.toIdentifier(this.resultSetSchemaName(resultSet)), identifierHelper.toIdentifier(this.resultSetSequenceName(resultSet))), this.resultSetStartValueSize(resultSet), this.resultSetMinValue(resultSet), this.resultSetMaxValue(resultSet), this.resultSetIncrementValue(resultSet)));
            }

            return sequenceInformationList;
        });
    }

protected String sequenceNameColumn() {
          
   
        return "sequence_name";
    }

    protected String sequenceCatalogColumn() {
          
   
        return "sequence_catalog";
    }

    protected String sequenceSchemaColumn() {
          
   
        return "sequence_schema";
    }

    protected String sequenceStartValueColumn() {
          
   
        return "start_value";
    }

    protected String sequenceMinValueColumn() {
          
   
        return "minimum_value";
    }

    protected String sequenceMaxValueColumn() {
          
   
        return "maximum_value";
    }

    protected String sequenceIncrementColumn() {
          
   
        return "increment";
    }

解决方案 1、降低Hibernate版本,5.1.0版本执行提取元数据操作时,是加入空的Identifier对象,所以不会报此错误。 2、重写方言的getQuerySequencesString方法,直接返回null,因为通过对比发现mysql的方言并没有重写此方法,所以认为此处返回null,然后不进行元数据提取不会产生影响,经测试能成功建表

public class KunKingbaseDialect extends KingbaseDialect {
          
   
    public KunKingbaseDialect() {
          
   
        super();
    }

    @Override
    public String getQuerySequencesString() {
          
   
        return null;
    }
}
经验分享 程序员 微信小程序 职场和发展