SpringBoot整合阿里Druid数据源及Spring-Data-Jpa

https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247484669&idx=1&sn=f28a9ae8067af39c8d9406b7842c7751&chksm=fb3f1d06cc489410bc5bc5ad1a857bc239962539bd51a239f406644055ef7fcbdc7975288899&scene=0&key=f90f52b171784d83da3e317c903ae4bebd202ad3353a3030ce03cbe404e2527b0b1d0761a9029f0eee109af1a66f4d9f15384196a9686dca43c689473de1369b24c20156685eedd7f09328bbcc55459c&ascene=1&uin=MjgwMTEwNDQxNg%3D%3D&devicetype=Windows-QQBrowser&version=6103000b&lang=zh_CN&pass_ticket=Pbtuc%2B57vDHGrUKlz7gN6m3DE%2BsmcWebe008LyFC7dD5%2B8zGrdL8USzjdzIexKLI
 

最近开辟了一个新项目,因为初期考虑到可能会调整数据库的风险,所以orm,在设计之初就考虑为Spring Data Jpa, 以下是工程data层数据,整体是参照配置多数据源的方案,进行配置的

目录

  • 因为阿里数据源 Druid

  • 整合数据源及其他事务配置

  • pom依赖

整合事务

  1. @EnableAutoConfiguration

  2. @SpringBootApplication

  3. @EnableTransactionManagement

  4. @ComponentScan(basePackages = {"com.inn.developer"})

  5. public class CodeApplication {

  6.    public static void main(String[] args) {

  7.        new SpringApplicationBuilder().web(true).sources(CodeApplication.class).run(args);

  8.    }

  9. }

创建 DruidProperties配置

  1. @Data

  2. @AllArgsConstructor

  3. @NoArgsConstructor

  4. @ConfigurationProperties(prefix = "druid")

  5. public class DruidProperties {

  6. ...

数据库参数可以参考:

参数 默认值 解释
initialSize 3 初始化配置
minIdle 3 最小连接数
maxActive 15 最大连接数
maxWait 5000 获取连接超时时间(单位:ms)
timeBetweenEvictionRunsMillis 90000 连接有效性检测时间(单位:ms)
testOnBorrow false 获取连接检测
testOnReturn false 归还连接检测
minEvictableIdleTimeMillis 1800000 最大空闲时间(单位ms)
testWhileIdle true 在获取连接后,确定是否要进行连接空间时间的检查
     
  • 配置说明:

   
     
1:minEvictableIdleTimeMillis(最大空闲时间):默认为30分钟,配置里面不进行设置。    

2:testOnBorrow ,testOnReturn 默认为关闭,可以设置为不配置。

3:testWhileIdle(在获取连接后,确定是否要进行连接空闲时间的检查)。默认为true。配置里面不再进行设置。

  • 流程说明:

    1:在第一次调用connection的时候,才会进行 initialSize的初始化。

    2:心跳检测时间线程,会休眠timeBetweenEvictionRunsMillis时间,然后只对(没有borrow的线程 减去 minIdle)的线程进行检查,如果空闲时间大于minEvictableIdleTimeMillis则进行close。

    3:testWhileIdle必须设置为true,在获取到连接后,先检查testOnBorrow,然后再判定testwhileIdle,如果连接空闲时间大于timeBetweenEvictionRunsMillis,则会进行心跳检测。

    4:不需要配置validationQuery,如果不配置的情况下会走ping命令,性能更高。

    5:连接保存在数组里面,获取连接的时候,获取数组的最后一位。在imeBetweenEvictionRunsMillis时是从前往后进行检查连接的有效性。

配置数据源及hibernate适配

数据源对象创建还是和之前一样, 笔者不太喜欢xml的方式,所以还是采用配置类

DruidAutoJpaConfiguration

  1. @Configuration

  2. @EnableConfigurationProperties(DruidProperties.class)//开启属性注入,通过@autowired注入

  3. @ConditionalOnClass(DruidDataSource.class)//表示对应的类在classpath目录下存在时,才会去解析对应的配置文件

  4. @ConditionalOnProperty(prefix = "druid", name = "url")

  5. @EnableJpaRepositories(basePackages = "com.inn.developer.model.dao",transactionManagerRef = "jpaTransactionManager", entityManagerFactoryRef = "localContainerEntityManagerFactoryBean")

  6. public class DruidAutoJpaConfiguration {

  7.    @Autowired

  8.    private DruidProperties properties;

  9.    @Bean(name = "druidDataSource")

  10.    @Primary

  11.    public DataSource dataSource() {

  12.        DruidDataSource dataSource = new DruidDataSource();

  13.        dataSource.setUrl(properties.getUrl());

  14.        dataSource.setUsername(properties.getUsername());

  15.        dataSource.setPassword(properties.getPassword());

  16.        dataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());

  17.        if (properties.getInitialSize() > 0) {

  18.            dataSource.setInitialSize(properties.getInitialSize());

  19.        }

  20.        if (properties.getMinIdle() > 0) {

  21.            dataSource.setMinIdle(properties.getMinIdle());

  22.        }

  23.        if (properties.getMaxActive() > 0) {

  24.            dataSource.setMaxActive(properties.getMaxActive());

  25.        }

  26.        dataSource.setTestOnBorrow(properties.isTestOnBorrow());

  27.        dataSource.setValidationQuery("select version()");

  28.        try {

  29.            dataSource.init();

  30.        } catch (SQLException e) {

  31.            throw new RuntimeException(e);

  32.        }

  33.        return dataSource;

  34.    }

  35.    /**

  36.     * hibernate 适配器,定制方言为mysql,并打印sql

  37.     *

  38.     * @return

  39.     */

  40.    @Bean(name = "hibernateJpaVendorAdapter")

  41.    @Primary

  42.    public HibernateJpaVendorAdapter hibernateJpaVendorAdapter() {

  43.        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();

  44.        hibernateJpaVendorAdapter.setShowSql(true);

  45.        hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");

  46.        return hibernateJpaVendorAdapter;

  47.    }

  48.    @Bean(name = "localContainerEntityManagerFactoryBean")

  49.    @Primary

  50.    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(@Qualifier("druidDataSource") DataSource dataSource

  51.            ,@Qualifier("hibernateJpaVendorAdapter") HibernateJpaVendorAdapter hibernateJpaVendorAdapter) {

  52.        LocalContainerEntityManagerFactoryBean local = new LocalContainerEntityManagerFactoryBean();

  53.        local.setDataSource(dataSource);

  54.        local.setJpaVendorAdapter(hibernateJpaVendorAdapter);

  55.        local.setPackagesToScan("com.inn.developer.model.domain");

  56.        Properties properties = new Properties();

  57.        properties.put("hibernate.format_sql", true);

  58.        properties.put("hibernate.hbm2ddl.auto", "update");

  59.        local.setJpaProperties(properties);

  60.        return local;

  61.    }

  62.    @Bean(name = "jpaTransactionManager")

  63.    @Primary

  64.    public JpaTransactionManager jpaTransactionManager(@Qualifier("localContainerEntityManagerFactoryBean") LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {

  65.        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();

  66.        EntityManagerFactory object = entityManagerFactoryBean.getObject();

  67.        jpaTransactionManager.setEntityManagerFactory(object);

  68.        return jpaTransactionManager;

  69.    }

pom依赖

  1. <dependency>

  2.            <groupId>mysql</groupId>

  3.            <artifactId>mysql-connector-java</artifactId>

  4.        </dependency>

  5.        <dependency>

  6.            <groupId>org.springframework.boot</groupId>

  7.            <artifactId>spring-boot-starter-data-jpa</artifactId>

  8.        </dependency>

  9.         <dependency>

  10.            <groupId>org.projectlombok</groupId>

  11.            <artifactId>lombok</artifactId>

  12.            <version>1.16.6</version>

  13.            <scope>provided</scope>

  14.        </dependency>

  15.          <dependency>

  16.            <groupId>com.alibaba</groupId>

  17.            <artifactId>druid</artifactId>

  18.            <version>1.0.11</version>

  19.        </dependency>

  20.         <!--依赖Spring 4.3.6之core、context、aop、beans、tx、orm和spring data commons -->

  21.        <dependency>

  22.            <groupId>org.springframework.data</groupId>

  23.            <artifactId>spring-data-jpa</artifactId>

  24.            <version>1.11.3.RELEASE</version>

  25.        </dependency>

  26.        <!--hibernate 实现JPA的框架 -->

  27.        <dependency>

  28.            <groupId>org.hibernate</groupId>

  29.            <artifactId>hibernate-entitymanager</artifactId>

  30.            <version>5.2.5.Final</version>

  31.        </dependency>

  32.        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->

  33.        <dependency>

  34.            <groupId>org.hibernate</groupId>

  35.            <artifactId>hibernate-core</artifactId>

  36.            <version>5.2.11.Final</version>

  37.        </dependency>

  38.        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations -->

  39.        <dependency>

  40.            <groupId>org.hibernate</groupId>

  41.            <artifactId>hibernate-annotations</artifactId>

  42.            <version>3.5.6-Final</version>

  43.        </dependency>

招人:数心,造化心数奇;用心等你...

上一篇:webflux 与swagger2.x

SpringBoot整合阿里Druid数据源及Spring-Data-Jpa的更多相关文章

  1. Springboot 系列(十)使用 Spring data jpa 访问数据库

    前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...

  2. SpringBoot入门 (五) 数据库访问之spring data jpa

    本文记录学习使用spring data jpa访问数据库 一 什么是Spring Data JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java ...

  3. Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL

    在数据访问这章的第一篇文章<Spring中使用JdbcTemplate访问数据库> 中,我们已经介绍了如何使用Spring Boot中最基本的jdbc模块来实现关系型数据库的数据读写操作. ...

  4. Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源

    最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hib ...

  5. Springboot spring data jpa 多数据源的配置01

    Springboot spring data jpa 多数据源的配置 (说明:这只是引入了多个数据源,他们各自管理各自的事务,并没有实现统一的事务控制) 例: user数据库   global 数据库 ...

  6. springboot整合spring data jpa 动态查询

    Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询,在实现动态查询时我们需要用到Criteria API,主要是以下三个: 1.Criteria ...

  7. SpringBoot第九篇:整合Spring Data JPA

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10910059.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言   前面几章, ...

  8. springboot整合spring Data JPA

    今天敲代码,一连串的错误,我也是服气~果然,我们不是在出bug,就是在找bug的路上…… 今天完成的是springboot整合spring data JPA ,出了一连串的错,真是头大 java.sq ...

  9. JPA、Hibernate、Spring data jpa之间的关系,以及和springboot的整合

    什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1)ORM映射元数据:JPA支 ...

随机推荐

  1. SpringBoot 中 JPA 的使用

    详细连接 简书https://www.jianshu.com/p/c14640b63653 新建项目,增加依赖 在 Intellij IDEA 里面新建一个空的 SpringBoot 项目.具体步骤参 ...

  2. hive条件函数

    case相当于if,when相当于=:then是条件满足的结论.否则实行else后语句,一end结束

  3. github上测试服出现bug,如何回滚并获得合并之前的分支

    使用场景: 当我们提交了一个pr,但是该pr合并之后,经过在测试测试有问题,需要回滚.这个时候主master代码将会被回滚到提交你的pr之前的代码.而你的pr由于已经被合并过了,所以无法继续提交. 这 ...

  4. 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)

    最近自己做一个web app需要用到上拉查询下页数据,网上看了很多很多帖子,发现并不能快速的套用,总是会出现各种问题无法使用,于是无奈自己跑去看了官方api文档,终于做了出来,至此做个笔记,以后用到可 ...

  5. Mapper动态代理方式

    开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法. Mapper接 ...

  6. vue自定义组件及传值

    1.使用 Vue.component() 方法注册组件 2.使用 props 属性传递参数 v-for="item in items": 遍历 Vue 实例中定义的名为 items ...

  7. C# 23种设计模式汇总

    创建型模式工厂方法(Factory Method)在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核心是一个抽象工厂类,各种具体工 ...

  8. QXcbConnection: Could not connect to display

    import matplotlib; matplotlib.use('agg') 注意:要添加到所有matplotlib前面,否则不起作用

  9. springmvc拦截器匹配规则

  10. 51nod 1636

    1636 教育改革 我看过题解了还下了数据,表示很惭愧不想说什么,但还是说两句吧 sol: 因为差值很小只有100,所以对数组下标存的是(选择的数值和左端点的差值) f[i][j][k]即为第i天选了 ...