缘由

因项目测试需要连接,hive,mysql,mongo 三个数据库

项目依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.carl</groupId>
    <artifactId>test-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mobile-test-service</name>
    <description>Mobile Test Service for Jolly</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <hadoop.version>2.3.2</hadoop.version>
        <java.version>1.8</java.version>
        <fastjson.version>1.2.40</fastjson.version>
        <druid.version>1.1.5</druid.version>

        <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
        <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-docs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jooq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>${hadoop.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.httpcomponents</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.eclipse.jetty.aggregate</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.eclipse.jetty.orbit</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.mortbay.jetty</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.cloudera</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>2.5</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/libs/HiveJDBC4.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hive-service-cli</artifactId>
            <version>1.7.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/libs/TCLIServiceClient.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hive-ql</artifactId>
            <version>1.7.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/libs/ql.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>materializecss</artifactId>
            <version>0.100.2</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.2.1</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>

        <resources>
            <resource>
                <directory>${project.basedir}/lib</directory>
                <targetPath>BOOT-INF/lib/</targetPath>
                <includes>
                    <include>**/*.jar</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

由于使用了本地 lib 目录下的依赖,所以增加了 resources 节点,可以将 lib 目录打进 jar 中去

多数据源配置

### Database for mongo ###
spring.data.mongodb.database=countly
spring.data.mongodb.host=192.168.2.3
spring.data.mongodb.port=27017

### Database for hive ###
spring.datasource.hive.url=jdbc:hive2://192.168.2.3:10100/hivedb
spring.datasource.hive.username=apptest
spring.datasource.hive.password=123456
spring.datasource.hive.driverClassName=com.cloudera.hive.jdbc4.HS2Driver

### Database for mysql(beta) ###
spring.datasource.mysql.url=jdbc:mysql://192.168.2.3:3306/testservice?useUnicode=true&characterEncoding=UTF-8
spring.datasource.mysql.username=test
spring.datasource.mysql.password=test
spring.datasource.mysql.driverClassName=com.mysql.jdbc.Driver

连接配置

@Configuration
@EnableMongoRepositories(basePackages={"com.carl.testservice.mapper.mongo"})//MongoRepository的扫描包
@MapperScan("com.carl.testservice.mapper.mongo")
public class MongoConnectConfig extends AbstractMongoConfiguration{

    @Autowired
    private Environment env;

    @Override
    protected String getDatabaseName() {
        return env.getRequiredProperty("spring.data.mongodb.database");
    }

    @Override
    @Bean
    public Mongo mongo() throws Exception {
        ServerAddress serverAddress = new ServerAddress(env.getRequiredProperty("spring.data.mongodb.host"));
        List<MongoCredential> credentials = new ArrayList<>();
        return new MongoClient(serverAddress, credentials);
    }
}
@Configuration
@MapperScan(basePackages = {"com.carl.testservice.mapper.hive"}, sqlSessionTemplateRef = "sqlSessionTemplateHive")
public class HiveConnectConfig {

    @Bean(name = "hiveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.hive")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "hiveSqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("hiveDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "hiveTransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("hiveDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "sqlSessionTemplateHive")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("hiveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}
@Configuration
@MapperScan(basePackages = {"com.carl.testservice.mapper.mysql"}, sqlSessionTemplateRef = "sqlSessionTemplateMysql")
public class MysqlConnectConfig {

    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    @Primary
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "mysqlSqlSessionFactory")
    @Primary
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "mysqlTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "sqlSessionTemplateMysql")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

mapper

public interface EventMapperMongo extends MongoRepository<EventJSON, String> {

    /**
     * 通过DeviceId查找到对应的事件
     * @param deviceId
     * @param startTime
     * @param endTime
     * @return
     */
    @Query("{'d.id':?#{[0]}, 't':'event', 'i.timestamp':{$gt:?#{[1]}, $lt:?#{[2]}}}")
    public List<EventJSON> findAllByQuery(String deviceId, long startTime, long endTime);
}

cotroller

@RestController
@RequestMapping("/mongoEvent")
@Slf4j
public class EventControllerMongo {

    @Autowired
    private EventMapperMongo eventMapperMongo;

    @RequestMapping(method = RequestMethod.GET, value = "/deviceId/{deviceId}/startTime/{startTime}/endTime/{endTime}")
    public List<EventJSON> getEvents(@PathVariable("deviceId") String deviceId, @PathVariable("startTime") long startTime, @PathVariable("endTime") long endTime) {
        return eventMapperMongo.findAllByQuery(deviceId, startTime, endTime);
    }

}

bean

@Data
@Document(collection = "logs5729aa86ff5812096852d481")
public class EventJSON {

    @Id
    private String id;
    private String ts;
    private String reqts;
    private String d;
    private String l;
    private String v;
    private String t;
    private String i;
    private String s;
    private String c;

    public EventJSON() {
    }

}

其他两个类型无特殊情况,mongo 特殊一点,给出示例

日志输出 sql 的配置

logging.level.com.carl.testservice.mapper=DEBUG


↙↙↙阅读原文可查看相关链接,并与作者交流