笔者最近因为一些需求给项目中添加了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这张表的查询权限,也需要找管理员帮你开通相应的权限