【问题标题】:Spring-boot + JDBC + HSQLDB: How to Verify if Spring Boot is using a Connection Pool?Spring-boot + JDBC + HSQLDB:如何验证 Spring Boot 是否使用连接池?
【发布时间】:2016-08-02 21:20:15
【问题描述】:

根据this documentation

29.1.1 嵌入式数据库支持

Spring Boot 可以自动配置嵌入式 H2、HSQL 和 Derby 数据库。 您无需提供任何连接 URL,只需包含构建 依赖于您要使用的嵌入式数据库。

29.1.2 连接到生产数据库

生产数据库连接也可以使用池自动配置 数据源。

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

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver 

[提示] 你 自 Spring 启动以来,通常不需要指定驱动程序类名称 可以从 url 为大多数数据库推断它。

[注意] 对于池化 要创建的 DataSource 我们需要能够验证一个有效的 驱动程序类是可用的,所以我们在做任何事情之前检查它。 IE。如果你设置 spring.datasource.driver-class-name=com.mysql.jdbc.Driver 那么 类必须是可加载的。


如果我将以下内容放在我的 application.properties 文件中会怎样:

spring.datasource.url=jdbc:hsqldb:file:db/organization-db
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver

由于我指定了 spring.datasource.driver-class-name,Spring Boot 会自动配置一个池化数据源吗?
或者它只是为嵌入式数据库驱动程序创建一个数据源而没有连接池?
如何确认 Spring Boot 是否使用连接池?

【问题讨论】:

    标签: spring-mvc jdbc spring-boot spring-jdbc embedded-database


    【解决方案1】:

    我的理解是,只要类路径上有受支持的数据源类,spring-boot 就会使用它,如果没有指定,则首选 tomcat。

    支持的数据源列表在DataSourceBuilder中给出,目前是tomcat、hikari、dbcp和dbcp2。

    您可以通过从应用程序上下文中查找 javax.sql.Datasource 实现来验证是否已创建,但我不明白为什么不这样做。

    https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBuilder.java

    【讨论】:

    • 文档说,如果您在应用程序的任何位置定义 DataSource @Bean,它将不会配置池。 docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/… Additional connection pools can always be configured manually. If you define your own DataSource bean, auto-configuration will not occur. 我已经设置了 Oauth2 并按照指南进行操作,并且将 @Bean(name = "OAuth") @ConfigurationProperties(prefix="spring.datasource") public DataSource secondaryDataSource() {...} 用于 JDBC 令牌存储,并且池未配置。
    【解决方案2】:

    感谢您的回答戴夫。我刚刚开始学习 Spring 框架,所以我正在修补它。这是我在 MyApplication.main 方法中所做的,以确认 Spring Boot 是否正在使用连接池:

    ApplicationContext context = SpringApplication.run(MyApplication.class);
    DataSource dataSource = context.getBean(javax.sql.DataSource.class);
    System.out.println("DATASOURCE = " + dataSource);
    

    我得到以下输出:

    DATASOURCE = org.apache.tomcat.jdbc.pool.DataSource@a5b0b86{ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; defaultTransactionIsolation=-1; defaultCatalog=null; driverClassName=org.hsqldb.jdbcDriver; maxActive=100; maxIdle=100; minIdle=10; initialSize=10; maxWait=30000; testOnBorrow=false; testOnReturn=false; timeBetweenEvictionRunsMillis=5000; numTestsPerEvictionRun=0; minEvictableIdleTimeMillis=60000; testWhileIdle=false; testOnConnect=false; password=********; url=jdbc:hsqldb:mem:testdb; username=sa; validationQuery=null; validationQueryTimeout=-1; validatorClassName=null; validationInterval=30000; accessToUnderlyingConnectionAllowed=true; removeAbandoned=false; removeAbandonedTimeout=60; logAbandoned=false; connectionProperties=null; initSQL=null; jdbcInterceptors=null; jmxEnabled=true; fairQueue=true; useEquals=true; abandonWhenPercentageFull=0; maxAge=0; useLock=false; dataSource=null; dataSourceJNDI=null; suspectTimeout=0; alternateUsernameAllowed=false; commitOnReturn=false; rollbackOnReturn=false; useDisposableConnectionFacade=true; logValidationErrors=false; propagateInterruptState=false; ignoreExceptionOnPreLoad=false; }
    

    我还尝试使用 application.properties 文件和我的 build.grade 文件进行不同的配置,以确认 Spring Boot 在自动配置 DataSource 时是否仍会使用连接池我发现 Spring Boot 的自动配置总是会创建一个池化数据源。

    【讨论】:

    • 如果池可用,它似乎总是创建一个池,但它并不总是配置它!例如:testOnBorrow=true; validationQuery=/* ping */ SELECT 1; 自动配置时,但如果您在应用程序的任何位置创建 DataSource bean,那么这些将 设置,这对 MySQL 来说是个麻烦,它会在大约 8 小时后终止连接.
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 2018-09-24
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2022-06-29
    • 2020-02-11
    相关资源
    最近更新 更多