SpringBoot整合阿里Druid数据源及Spring-Data-Jpa
SpringBoot整合阿里Druid数据源及Spring-Data-Jpa
最近开辟了一个新项目,因为初期考虑到可能会调整数据库的风险,所以orm,在设计之初就考虑为Spring Data Jpa, 以下是工程data层数据,整体是参照配置多数据源的方案,进行配置的
目录
因为阿里数据源
Druid整合数据源及其他事务配置
pom依赖
整合事务
@EnableAutoConfiguration@SpringBootApplication@EnableTransactionManagement@ComponentScan(basePackages = {"com.inn.developer"})public class CodeApplication {public static void main(String[] args) {new SpringApplicationBuilder().web(true).sources(CodeApplication.class).run(args);}}
创建 DruidProperties配置
@Data@AllArgsConstructor@NoArgsConstructor@ConfigurationProperties(prefix = "druid")public class DruidProperties {...
数据库参数可以参考:
| 参数 | 默认值 | 解释 |
|---|---|---|
| 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
@Configuration@EnableConfigurationProperties(DruidProperties.class)//开启属性注入,通过@autowired注入@ConditionalOnClass(DruidDataSource.class)//表示对应的类在classpath目录下存在时,才会去解析对应的配置文件@ConditionalOnProperty(prefix = "druid", name = "url")@EnableJpaRepositories(basePackages = "com.inn.developer.model.dao",transactionManagerRef = "jpaTransactionManager", entityManagerFactoryRef = "localContainerEntityManagerFactoryBean")public class DruidAutoJpaConfiguration {@Autowiredprivate DruidProperties properties;@Bean(name = "druidDataSource")@Primarypublic DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(properties.getUrl());dataSource.setUsername(properties.getUsername());dataSource.setPassword(properties.getPassword());dataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());if (properties.getInitialSize() > 0) {dataSource.setInitialSize(properties.getInitialSize());}if (properties.getMinIdle() > 0) {dataSource.setMinIdle(properties.getMinIdle());}if (properties.getMaxActive() > 0) {dataSource.setMaxActive(properties.getMaxActive());}dataSource.setTestOnBorrow(properties.isTestOnBorrow());dataSource.setValidationQuery("select version()");try {dataSource.init();} catch (SQLException e) {throw new RuntimeException(e);}return dataSource;}/*** hibernate 适配器,定制方言为mysql,并打印sql** @return*/@Bean(name = "hibernateJpaVendorAdapter")@Primarypublic HibernateJpaVendorAdapter hibernateJpaVendorAdapter() {HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();hibernateJpaVendorAdapter.setShowSql(true);hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");return hibernateJpaVendorAdapter;}@Bean(name = "localContainerEntityManagerFactoryBean")@Primarypublic LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(@Qualifier("druidDataSource") DataSource dataSource,@Qualifier("hibernateJpaVendorAdapter") HibernateJpaVendorAdapter hibernateJpaVendorAdapter) {LocalContainerEntityManagerFactoryBean local = new LocalContainerEntityManagerFactoryBean();local.setDataSource(dataSource);local.setJpaVendorAdapter(hibernateJpaVendorAdapter);local.setPackagesToScan("com.inn.developer.model.domain");Properties properties = new Properties();properties.put("hibernate.format_sql", true);properties.put("hibernate.hbm2ddl.auto", "update");local.setJpaProperties(properties);return local;}@Bean(name = "jpaTransactionManager")@Primarypublic JpaTransactionManager jpaTransactionManager(@Qualifier("localContainerEntityManagerFactoryBean") LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) {JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();EntityManagerFactory object = entityManagerFactoryBean.getObject();jpaTransactionManager.setEntityManagerFactory(object);return jpaTransactionManager;}
pom依赖
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.6</version><scope>provided</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.11</version></dependency><!--依赖Spring 4.3.6之core、context、aop、beans、tx、orm和spring data commons --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>1.11.3.RELEASE</version></dependency><!--hibernate 实现JPA的框架 --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.2.5.Final</version></dependency><!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.11.Final</version></dependency><!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-annotations --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-annotations</artifactId><version>3.5.6-Final</version></dependency>
招人:数心,造化心数奇;用心等你...
SpringBoot整合阿里Druid数据源及Spring-Data-Jpa的更多相关文章
- Springboot 系列(十)使用 Spring data jpa 访问数据库
前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...
- SpringBoot入门 (五) 数据库访问之spring data jpa
本文记录学习使用spring data jpa访问数据库 一 什么是Spring Data JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java ...
- Spring Boot 2.x基础教程:使用Spring Data JPA访问MySQL
在数据访问这章的第一篇文章<Spring中使用JdbcTemplate访问数据库> 中,我们已经介绍了如何使用Spring Boot中最基本的jdbc模块来实现关系型数据库的数据读写操作. ...
- Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源
最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hib ...
- Springboot spring data jpa 多数据源的配置01
Springboot spring data jpa 多数据源的配置 (说明:这只是引入了多个数据源,他们各自管理各自的事务,并没有实现统一的事务控制) 例: user数据库 global 数据库 ...
- springboot整合spring data jpa 动态查询
Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询,在实现动态查询时我们需要用到Criteria API,主要是以下三个: 1.Criteria ...
- SpringBoot第九篇:整合Spring Data JPA
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10910059.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言 前面几章, ...
- springboot整合spring Data JPA
今天敲代码,一连串的错误,我也是服气~果然,我们不是在出bug,就是在找bug的路上…… 今天完成的是springboot整合spring data JPA ,出了一连串的错,真是头大 java.sq ...
- JPA、Hibernate、Spring data jpa之间的关系,以及和springboot的整合
什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1)ORM映射元数据:JPA支 ...
随机推荐
- jenkins 邮箱设置
一.先设置管理员邮箱地址 二.设置邮箱
- nginx反向代理proxy_pass的问题
起因:今天企业部署一个项目,用的nginx做的反向代理,配置如下: 测试结果令人失望,IP:端口 能访问项目,域名:端口 也能访问 ,但是 域名/接口名 访问失败 ################## ...
- yii2的下载安装
1.直接使用归档文件安装yii2的高级模板: 从 yiiframework.com 下载归档文件. 下载yii2的高级模板的压缩文件, 将yii-advanced-app-2.0.12文件夹复制到项目 ...
- MyBatis SpringBoot 杂记
最近接了个xxx代码. 不能说人家不好, 因为必进年月久了.能用这么长时间, 不就说明还不错么?! 我们现在每天写的, 能超出人家的么~~~ 呵呵 Java项目中, 把动态数据源切换的框架整合进来. ...
- Web API2 使用默认Identity
当您选择个人账户在Web API项目模板,项目包含一个令牌授权服务器验证用户凭证和问题.下面的图显示了相同的凭证流的Web API组件. 发送一个未经授权的请求 首先,运行应用程序并单击按钮调用的AP ...
- iOS应用的性能调试
1.Static Analysis 使用之前先清理一下数据:product-->Clean 可能遇到的问题: a.发现工程中有多个“User-facing text should use loc ...
- hdu 5652(并查集)
题意:很久之前,在中国和印度之间有通路,通路可以简化为一个n*m的字符串,0表示能通过,1表示障碍,每过一年就有一个坐标变成1,问你什么时候,通路彻底无法通过: 解题思路:无向图的连通性,一般直接搜索 ...
- C#使用读写锁解决多线程并发写入文件时线程同步的问题
读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件 ...
- BZOJ3277 串 【后缀数组】【二分答案】【主席树】
题目分析: 用"$"连接后缀数组,然后做一个主席树求区间内不同的数的个数.二分一个前缀长度再在主席树上求不同的数的个数. 代码: #include<bits/stdc++.h ...
- [AHOI2008]紧急集合 / 聚会
题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”.在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等待点,通过道路从一个点到另一个点要 ...