odps + druid的简单搭配使用

笔者最近因为一些需求给项目中添加了odps数据源,在尝试使用的期间碰到了一些问题,在此记录一下


一、odps + druid的简单搭配使用

odps的官方文档推荐了两种使用方式,第一种是通过sdk的jar包,第二种是使用odps-jdbc的jar包(官方文档地址),笔者由于需要集成odps和druid,所以选用了第二种方式,下面是主要依赖:

<!-- 引入odps配套编码依赖 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.8</version>
</dependency>

<!-- 引入odps引擎组件 -->
<dependency>
    <groupId>com.aliyun.odps</groupId>
    <artifactId>odps-jdbc</artifactId>
    <version>3.0.1</version>
    <classifier>jar-with-dependencies</classifier>
</dependency>

再结合笔者之前写的文章《springboot配置多数据源》,将odps数据源配置写入属性配置文件和数据源配置文件中,如下方伪代码:

属性配置文件:

@Data
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfigProperties {
    
    
	
	private DataSourceProperties muyichen;
	
	private DataSourceProperties test;
	
	private DataSourceProperties odps;
	
	@Data
	public static class DataSourceProperties {
    
    
		private String driverClassName;
		private String url;
		private String username;
		private String password;
	}
}

数据源配置文件:

/**
 * 多数据源配置
 *
 * @Author muyichen
 * @Date 2021年6月16日
 */
@Configuration
@EnableConfigurationProperties(DataSourceConfigProperties.class)
@MapperScan(basePackages = {
    
    "com.odps.dao"}, sqlSessionFactoryRef = "odpsSqlSessionFactory")
public class DataSourceConfig {
    
    

	@Bean(name = "odpsDataSource")
    public DruidDataSource getOdpsDataSource(DataSourceConfigProperties properties) {
    
    
    	DruidDataSource dataSource = new DruidDataSource();
    	dataSource.setDriverClassName(properties.getOdps().getDriverClassName());
    	dataSource.setUrl(properties.getOdps().getUrl());
    	dataSource.setUsername(properties.getOdps().getUsername());
    	dataSource.setPassword(properties.getOdps().getPassword());
        return dataSource;
    }

    @Bean(name = "odpsSqlSessionFactory")
    public SqlSessionFactory odpsSqlSessionFactory(@Qualifier("odpsDataSource") DataSource dataSource) throws Exception {
    
    
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:odps/*.xml"));
        return bean.getObject();
    }
    
}

上图的com.odps.dao是持久层的扫包路径,odpsSqlSessionFactory方法中的classpath:odps/*.xml是持久层对应的xml文件扫包路径

application.properties配置文件中对应的odps属性配置:

#project的值对应的是odps项目名称
spring.datasource.odps.url=jdbc:odps:http://service.cn-hangzhou.maxcompute.aliyun.com/api?project=test_project
spring.datasource.odps.driver-class-name=com.aliyun.odps.jdbc.OdpsDriver
#username对应创建项目空间的AccessKey ID
spring.datasource.odps.username=
#password对应创建项目空间的AccessKey ID对应的AccessKey Secret
spring.datasource.odps.password=

完成上面这些配置,并且加上对应的dao、xml之后,就可以实现简单的odps的使用了(当然你要有对应的项目和表的访问权限,不然仍旧无法使用)

二、使用过程中遇到的问题

1、3.0.1版本中的NoSuchMethod

笔者在使用3.0.1版本的时候出现了一个问题:org.apache.commons.codec.binary.Base64类中的
encodeBase64String方法不存在,它导致了druid无法获取数据源对象。笔者在仔细检查后发现是commons-codec这个jar包的版本过低为1.3版,之后笔者将该版本改成1.8后,就能使用了。

2、Access Denied - Authorization Failed [4019]

出现这个错误,说明你的云账号没有该odps的访问权限,需要找该odps项目的管理员帮你开通相应的的权限

3、execute sql [select count(*) from xxx;] failed: ODPS-0130013

出现这个错误,说明你的账号可以访问该odps,但是没有xxx这张表的查询权限,也需要找管理员帮你开通相应的权限

猜你喜欢

转载自blog.csdn.net/qq_42697271/article/details/117949148