Spring Boot 3.x Data(一)-SQL数据源配置_laopeng301的博客-程序员秘密_datasource数据源配置

技术标签: spring boot  数据库  Spring Boot 3.x教程  sql  

系列文章目录


前言

Spring Boot集成了许多数据技术,包括SQLNoSQL

一、SQL数据库

Spring框架为使用SQL数据库提供了广泛的支持,从使用JdbcTemplate的直接JDBC访问到完成“对象关系映射”技术(如Hibernate)。
Spring Data提供了一个额外的功能:直接从接口创建Repository,并使用约定从方法名生成查询。

配置数据源

Java中javax.sql.DataSource接口提供了处理数据库连接的标准方法。“DataSource”使用URL和一些凭证来建立数据库连接。

嵌入式数据库支持

使用内存内嵌入式数据库开发应用程序通常很方便。显然,内存中的数据库不提供持久存储。您需要在应用程序启动时填充数据库,并准备在应用程序结束时丢弃数据。

Spring Boot可以自动配置嵌入式的H2、HSQL和Derby数据库。你不需要提供任何连接url。你只需要包含要使用的嵌入式数据库的构建依赖项。如果类路径上有多个嵌入式数据库,则设置spring.datasource.embedded-database-connection 配置属性,用于控制使用哪一个。将该属性设置为none将禁用嵌入式数据库的自动配置。

如果你在测试中使用此特性,你可能会注意到,无论你使用多少应用程序上下文,整个测试套件都会重用相同的数据库。
如果你想确保每个上下文都有一个单独的嵌入式数据库,你应该设置spring.datasource.generate-unique-nametrue

要自动配置嵌入式数据库,需要依赖spring-jdbc。例如,典型的POM依赖如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>
        </dependency>

如果出于某种原因,为嵌入式数据库配置了连接URL,请注意确保禁用了数据库的自动关闭功能。 如果你使用H2,你应该使用DB_CLOSE_ON_EXIT=FALSE来完成,如果使用HSQLDB,应该确保没有使用shutdown=true。禁用数据库的自动关闭功能可以让Spring Boot在数据库关闭时控制,从而确保一旦不再需要对数据库的访问就会发生这种情况。

hsqldb url 配置示例:

spring:
  datasource:
    username: hsqldb
    password: hsqldb
    url: jdbc:hsqldb:mem://localhost/test;shutdown=true
    driver-class-name: org.hsqldb.jdbcDriver
    schema: classpath:schema.sql
    data: classpath:data.sql
    initialization-mode: always
    continue-on-error: true

DataSource配置

数据源配置由spring.datasource.*中的外部配置属性控制。例如,你可以在application.properties中声明以下部分:

spring:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"

你至少应该通过设置spring.datasource.url属性来指定URL。否则,Spring Boot会尝试自动配置嵌入式数据库。

Spring Boot可以从URL推导出大多数数据库的JDBC驱动程序类, 如果需要指定特定的类,可以使用spring.datasource.driver-class-name属性。

要创建一个DataSource池,我们需要能够验证一个有效的Driver类是否可用,因此我们在做任何事情之前要检查这个类。换句话说,如果你设置了spring.datasource.driver-class-name=com.mysql.jdbc.Driver,那么这个类必须是可加载的。

有关更多支持的选项,请参阅DataSourceProperties。对于特定的数据连接池,可以使用spring.datasource.hikari.*, spring.datasource.tomcat.*, spring.datasource.dbcp2.*, 和 spring.datasource.oracleucp.* 配置进行微调。
例如,如果你使用Tomcat连接池,你可以自定义许多附加设置,如下面的示例所示:

spring:
  datasource:
    tomcat:
      max-wait: 10000
      max-active: 50
      test-on-borrow: true

支持的连接池

Spring Boot使用以下算法来选择特定的实现:

  1. 我们更喜欢HikariCP的性能和并发性。如果HikariCP可用,我们总是选择它。
  2. 否则,如果Tomcat池数据源可用,我们就使用它。
  3. 否则,如果Commons DBCP2可用,我们就使用它。
  4. 如果没有HikariCP、Tomcat和DBCP2可用,如果Oracle UCP可用,我们使用它。

如果你使用spring-boot-starter-jdbcspring-boot-starter-data-jpa Starter,你将自动获得对HikariCP的依赖。

你可以完全绕过该算法,并通过设置spring.datasource.type属性指定要使用的连接池。如果在Tomcat容器中运行应用程序,这一点尤其重要,因为默认情况下提供了tomcat-jdbc
在这里插入图片描述
可以使用DataSourceBuilder手动配置其他连接池。如果你定义了自己的DataSource bean,则不会发生自动配置。DataSourceBuilder支持以下连接池:

  • HikariCP
  • Tomcat pooling Datasource
  • Commons DBCP2
  • Oracle UCP & OracleDataSource
  • Spring Framework’s SimpleDriverDataSource
  • H2 JdbcDataSource
  • PostgreSQL PGSimpleDataSource

连接到JNDI数据源

如果你将Spring Boot应用程序部署到应用程序服务器,你可能希望通过使用应用程序服务器的内置特性配置和管理数据源,并通过使用JNDI访问它。
spring.datasource.jndi-name属性可以用作spring.datasource.url的替代,spring.datasource.usernamespring.datasource.password 属性 从特定的JNDI位置访问数据源。
下面的例子展示如何访问JBoss定义的数据源:

spring:
  datasource:
    jndi-name: "java:jboss/datasources/customers"

自定义数据源配置

要配置你自己的数据源,请在你的配置中定义该类型的@Bean。 Spring Boot在任何需要的地方重用“DataSource”,包括数据库初始化。

下面的例子展示了如何在bean中定义数据源:

@Configuration(proxyBeanMethods = false)
public class MyDataSourceConfiguration {
    

    @Bean
    @ConfigurationProperties(prefix = "app.datasource")
    public SomeDataSource dataSource() {
    
        return new SomeDataSource();
    }

}

下面的例子展示了如何通过设置属性来定义数据源:

app:
  datasource:
    url: "jdbc:h2:mem:mydb"
    username: "sa"
    pool-size: 30

假设SomeDataSource具有URL、用户名和连接池大小的常规JavaBean属性,那么在DataSource对其他组件可用之前,这些设置将被自动绑定。Spring Boot还提供了一个实用工具构建类,称为DataSourceBuilder,可用于创建一个标准数据源(如果它在类路径上)。构建器可以根据类路径上可用的内容检测要使用的对象。它还基于JDBC URL自动检测驱动程序。下面的例子展示了如何使用DataSourceBuilder创建一个数据源:

@Configuration(proxyBeanMethods = false)
public class MyDataSourceConfiguration {
    

    @Bean
    @ConfigurationProperties("app.datasource")
    public DataSource dataSource() {
    
        return DataSourceBuilder.create().build();
    }

下面的例子展示了如何通过设置属性来定义JDBC数据源:

app:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    pool-size: 30

然而,这里有一个陷阱。由于没有公开数据库连接池的实际类型,因此在自定义DataSource的元数据中没有生成键,IDE中也没有可用的键选择,因为DataSource接口没有公开属性。
另外,如果类路径上碰巧有Hikari,这个基本设置就不起作用了,因为Hikari没有url属性(但有一个jdbcUrl属性)。在这种情况下,你必须重写你的配置如下:

app:
  datasource:
    jdbc-url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    pool-size: 30

下面的例子展示了如何使用DataSourceBuilder创建HikariDataSource:

@Configuration(proxyBeanMethods = false)
public class MyDataSourceConfiguration {
    

    @Bean
    @ConfigurationProperties("app.datasource")
    public HikariDataSource dataSource() {
    
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

}

你甚至可以进一步利用DataSourceProperties为你做的事情—也就是说,如果没有提供URL,则通过提供用户名和密码的默认嵌入式数据库。 你可以很容易地从任何DataSourceProperties对象的状态初始化一个DataSourceBuilder,所以你也可以注入Spring Boot自动创建的DataSource。 然而,这将把你的配置分成两个名称空间:spring.datasource上的url,username, password, type, 和 driver其余的在你自定义的命名空间上(app.datasource)。 为了避免这种情况,你可以在你的自定义名称空间上重新定义一个自定义DataSourceProperties,如下面的示例所示:

@Configuration(proxyBeanMethods = false)
public class MyDataSourceConfiguration {
    

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource")
    public DataSourceProperties dataSourceProperties() {
    
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("app.datasource.configuration")
    public HikariDataSource dataSource(DataSourceProperties properties) {
    
        return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

}

这个设置与Spring Boot默认为你做的配置同步。

app:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    configuration:
      maximum-pool-size: 30

总结

数据源自动配置是Spring Boot自带的DataSourceAutoConfiguration

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/renpeng301/article/details/124501825

智能推荐

adobe reader XI打开pdf崩溃修复2020.05_so easy code的博客-程序员秘密

直接在原来版本上安装补丁升级带23版本,下载下面第二个链接,安装一下更新日志:Bug fixesAccessibility• 4053550: Some part of image/text are getting disappeared while using Reading Order tool-Figure/Caption.PDFMaker• 4217300: Images in emails are converted to garbled text in the PDF.下载地址:

背下这五十道Java面试题,拿下offer就是那么轻松_普通网友的博客-程序员秘密

前言这几天找了很多面试资料,发现这50道面试题都是面试官问的最多的。我分享出来希望那些刚出来找工作或者是要跳槽的小伙伴们给到一些帮助,因为我也是看别人给我的面试题过来的。1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?第一种情况,s1是short类型,在计算s1=s1+1时,前边是short型,后边是int型,不能自动转换。由于没有强转,要报类型错误。第二种情况,使用了+=这个java自带的运算符,ja..

JPA 试用_iteye_3224的博客-程序员秘密

2006 年夏天发布的 EJB 3.0 规范提供了一个大大简化但功能更为强大的 EJB 框架,该框架演示了批注与传统 EJB 2.x 部署描述符相比的显著优势。J2SE 5.0 中引入的批注是修饰符,可以在类、字段、方法、参数、本地变量、构造符、枚举和程序包中使用。大量 EJB 3.0 新特性中都强调了批注的使用,这些特性包括:基于普通旧式 Java 对象的 EJB 类、EJB 管理器类的相关性注...

Image Colorization图像着色相关论文/开源代码【整理】_Kobaayyy的博客-程序员秘密

Image Colorization图像着色相关论文/开源代码【整理】相关资源CVPR2020Instance-Aware Image ColorizationStylization-Based Architecture for Fast Deep Exemplar ColorizationReference-Based Sketch Image Colorization Using Augmented-Self Reference and Dense Semantic Correspondence参考相

hbase family qualifier设置_小牛蛋的博客-程序员秘密

HBase表的设计需要改一下 所以搜索了如何设计更为合理 以下为相关资料 看完应该知道针对具体情况如何设计转自:http://www.cnblogs.com/shitouer/archive/2012/08/07/2626377.html转自:http://blog.linezing.com/?p=2106转自:http://www.xiaoyaochong.net/w

ffmpeg利用滤镜合并两个视频,一左一右---avfilter_link实现_tusong86的博客-程序员秘密_avfilter_link

之前写过一篇博客ffmpeg利用滤镜合并两个视频,一左一右用的是滤镜字符串解析avfilter_graph_parse_ptr实现滤镜的连接。今天用avfilter_link的方式进行实现。需要说明的是,针对之前的滤镜配置字符串而言。[in0]split[main][tmp];[tmp]scale=w=960:h=1080[inn0];[main][inn0]overlay=0:0[x1];[in1]scale=w=960:h=1080[inn1];[x1][inn1]overlay=960:0[o

随便推点

es磁盘满了导致的异常_weixin_43887958的博客-程序员秘密_es磁盘满了

Caused by: org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];]ES所在的系统出现磁盘满了的问题,占用95%的磁盘,删除后已用磁盘空间降至40%,但问题依然存在,需要重新修改一下属性值.解决方法:

基于PHP+MySQL的小型购物系统网站_biyezuopinvip的博客-程序员秘密_php购物系统

小型购物网站一、项目简要功能介绍本项目主要有两个模块:用户模块主要实现了一个简单的购物网站的用户购物过程,完整的购物过程为:用户注册 → 用户登录 → 将商品添加到购物车 → 提交订单 → 银行卡支付但是由于涉及到与银行接口相关的支付过程,本项目没有具体实现付款细节,仅仅是做了一个支付表单的完整性的判断。管理员模块主要实现了管理员的简单商品管理功能,主要功能有:管理员的注册和登录添加商品删除商品查看所有订单二、项目主要特色动态性这是本项目最主要的特色。由于实现了两种用户模式(管

elasticsearch多磁盘扩容_illbehere的博客-程序员秘密

1、问题由于早前elasticsearch集群数据存储路径只配置了一个,所以某天磁盘突然爆满,集群差点当机。需重新配置多路径存储路径,因为在生产环境,得保证集群不死掉,只能一台一台配置重启。2、修改配置文件修改elasticsearch.yml中path.data属性,添加多路径以逗号分隔path.data : /opt/data1,/opt/data23、查看集群状态curl -XGET "htt

html 图片下载浏览器默认会打开新页面预览图片解决方案_hou6386083的博客-程序员秘密

      我们使用a标签下载图片的时候,浏览器默认会打开新页面预览图片,无法调用浏览器下载。      解决方案1:前端在a标签加入download指定图片下载,但是有兼容性,并且限制也比较多      解决方案2:使用浏览器自带指令 SaveAs  来下载图片,但是这个指令兼容IE 解决方案3:后端返回图片流时,请求头需要加上 Content-Disposition:attachm...

Ubuntu中vsftpd实现不同用户不同权限_kepa520的博客-程序员秘密

原文地址:http://blog.csdn.net/gavin_dinggengjia/article/details/7538118在vsftpd中要实现不同用户不同权限,可以利用虚拟用户来实现。      vsftpd的本地用户本身是系统的用户,除了可以登录FTP服务器外,还可以登录系统使用其他系统资源,而vsftpd的虚拟用户则是FTP服务的专用用户,虚拟用户只能访问FT

一台计算机比1千克重还是轻,1千克有多重?它就要重新定义了_zpdz的博客-程序员秘密

11月16日,四年一度的第26届国际计量大会将在巴黎凡尔赛宫举行,届时,数百名科学家将以精确稳定的物理常数重新定义"千克"。出品:科普中国制作:陈星监制:中国科学院计算机网络信息中心11月16日,四年一度的第26届国际计量大会将在巴黎凡尔赛宫举行,届时,数百名科学家将以精确稳定的物理常数重新定义"千克"。目前,1千克的定义就是"国际千克原器的质量",这个原器存放在位于巴黎的国际计量局的保险柜里。千...

推荐文章

热门文章

相关标签