在使用Spring Boot数据源以前,咱们通常会导入相关依赖。其中数据源核心依赖就是spring‐boot‐starter‐jdbc
以下html
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐starter‐jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql‐connector‐java</artifactId> <scope>runtime</scope> </dependency>
或者你使用的是JPA:java
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
查看JPA的依赖关系,如图,其中已经包含JDBC。mysql
配置咱们的Mysql数据库链接信息:linux
spring: datasource: username: root password: 123456 url: jdbc:mysql://192.168.15.22:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false driver‐class‐name: com.mysql.jdbc.Driver
编写单元测试spring
@RunWith(SpringRunner.class) @SpringBootTest public class RobotsApplicationTests { @Autowired DataSource dataSource; @Test public void test(){ System.out.println(dataSource.getClass()); } }
查看打印:sql
class org.apache.tomcat.jdbc.pool.DataSource
总结数据库
因此这段配置的效果就是,默认是用org.apache.tomcat.jdbc.pool.DataSource做为数据源,apache
且数据源的相关配置都在DataSourceProperties里面,以下:api
@ConfigurationProperties(prefix = "spring.datasource") public class DataSourceProperties implements BeanClassLoaderAware, EnvironmentAware, InitializingBean { ... private String name = "testdb"; private String driverClassName; private String url; private String username; private String password; .....
找到org.springframework.boot.autoconfigure.jdbc
包下的DataSourceConfiguration
类tomcat
abstract class DataSourceConfiguration { @ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true) static class Tomcat extends DataSourceConfiguration { @Bean @ConfigurationProperties(prefix = "spring.datasource.tomcat") public org.apache.tomcat.jdbc.pool.DataSource dataSource( DataSourceProperties properties) { org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource( properties, org.apache.tomcat.jdbc.pool.DataSource.class); DatabaseDriver databaseDriver = DatabaseDriver .fromJdbcUrl(properties.determineUrl()); String validationQuery = databaseDriver.getValidationQuery(); if (validationQuery != null) { dataSource.setTestOnBorrow(true); dataSource.setValidationQuery(validationQuery); } return dataSource; } } ......
以上就是自动配置代码,原理大概是若是在classpath下存在org.apache.tomcat.jdbc.pool.DataSource.class
类,而且在配置文件中指定spring.datasource.type
的值为org.apache.tomcat.jdbc.pool.DataSource
,或者不写都会认为能够经过。只有经过才会进入这段配置代码,才能注入DataSource
Bean。
SpringBoot默承认以支持;
org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource、
固然了,除了Tomcat数据源依赖自带,其余都是缺乏状态。
找到这个类的最下面,若是spring.datasource.type
的值不属于上面的几个,那么能够本身定义数据源:
@ConditionalOnMissingBean(DataSource.class) @ConditionalOnProperty(name = "spring.datasource.type") static class Generic { @Bean public DataSource dataSource(DataSourceProperties properties) { //使用DataSourceBuilder建立数据源,利用反射建立响应type的数据源,而且绑定相关属性 return properties.initializeDataSourceBuilder().build(); } }
打开DataSourceAutoConfiguration自动配置类,在自动配置DataSource时会注入DataSourceInitializer
,继续打开该类,
咱们发现该类有一个方法被注解@PostConstruct
,这个注解用于须要在依赖注入完成后执行任何初始化的方法上。该初始化方法调用了runSchemaScripts();
该方法的第一句就调用 getScripts()
方法,获取SQL脚本,如图:
因此咱们想要初始化一些数据库脚本,能够依照这个规则
schema‐*.sql、data‐*.sql
例如:
schema.sql,schema‐all.sql;
也可使用以下指定具体位置
schema: ‐ classpath:department.sql
做用:
1)、runSchemaScripts();运行建表语句;
2)、runDataScripts();运行插入数据的sql语句;
自动配置了JdbcTemplate操做数据库,示例:
@RunWith(SpringRunner.class) @SpringBootTest public class RobotsApplicationTests { @Autowired JdbcTemplate jdbcTemplate; @Test public void test(){ jdbcTemplate.queryForList("SELECT * FROM user"); } }
为何要把数据源和链接池放在一块儿讲,由于当咱们使用了如上所述的默认数据源以后,那么已默认启用了数据库连接池。 换句话说,你根本不须要关心链接池,它原本就有!
Tomcat7以前,Tomcat本质应用了DBCP链接池技术来实现的JDBC数据源,但在Tomcat7以后,Tomcat提供了新的JDBC链接池方案,做为DBCP的替换或备选方案,解决了许多以前使用DBCP的不利之处,并提升了性能。详细请参考:http://wiki.jikexueyuan.com/project/tomcat/tomcat-jdbc-pool.html
Spring Boot为咱们准备了最佳的数据库链接池方案,只须要在属性文件(例如application.properties)中配置须要的链接池参数便可。
在引入spring-boot-starter-jdbc后,内部包含了tomcat-jdbc包,里面有tomcat链接池.而后经过自动配置DataSourceAutoConfigurer建立DataSource对象。
SpringBoot建立默认DataSource时,规则以下:
优先寻找建立Tomcat链接池
若是没有Tomcat链接池,会查找建立HikariCP
若是没有HikariCP链接池,会查找建立dbcp
若是没有dbcp链接池,会查找建立dbcp2
可使用spring.datasource.type属性指定链接池类型
spring.datasource.type=org.apache.commons.dbcp.BasicDataSource
在数据源那一讲中,咱们已经知道Spring data默认使用tomcat-jdbc时,因此直接在application.yml增长配置项spring.datasource.tomcat.*来控制连接池的行为。好比以下配置。
spring: datasource: url: jdbc:mysql://localhost:3306/jackieathome?useSSL=false username: root password: mypassword # 6.x版本的MySQL JDBC驱动类为com.mysql.cj.jdbc.Driver # 5.X版本的MySQL JDBC驱动类为com.mysql.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver tomcat: max-wait: 10000 max-active: 30 test-on-borrow: true max-idle: 5
属性 | 描述 |
---|---|
defaultAutoCommit |
(布尔值)链接池所建立的链接默认自动提交状态。若是未设置,则默认采用 JDBC 驱动的缺省值(若是未设置,则不会调用 setAutoCommit 方法)。 |
defaultReadOnly |
(布尔值)链接池所建立的链接默认只读状态。若是未设置,将不会调用 setReadOnly 方法。(有些驱动并不支持只读模式,好比:informix) |
defaultTransactionIsolation |
(字符串)链接池所建立的链接的默认事务隔离状态。取值范围为:(参考 javadoc) NONE``READ_COMMITTED``READ_UNCOMMITTED``REPEATABLE_READ``SERIALIZABLE 若是未设置该值,则不会调用任何方法,默认为 JDBC 驱动。 |
defaultCatalog |
(字符串)链接池所建立的链接的默认catalog。 |
driverClassName |
(字符串)所要使用的 JDBC 驱动的彻底限定的 Java 类名。该驱动必须能从与 tomcat-jdbc.jar 一样的类加载器访问 |
username |
(字符串)传入 JDBC 驱动以便创建链接的链接用户名。注意,DataSource.getConnection(username,password) 方法默认不会使用传入该方法内的凭证,但会使用这里的配置信息。可参看 alternateUsernameAllowed 了解更多详情。 |
password |
(字符串)传入 JDBC 驱动以便创建链接的链接密码。注意,DataSource.getConnection(username,password) 方法默认不会使用传入该方法内的凭证,但会使用这里的配置信息。可参看 alternateUsernameAllowed 了解更多详情。 |
maxActive |
(整形值)池同时能分配的活跃链接的最大数目。默认为 100 。 |
maxIdle |
(整型值)池始终都应保留的链接的最大数目。默认为 maxActive:100 。会周期性检查空闲链接(若是启用该功能),留滞时间超过 minEvictableIdleTimeMillis 的空闲链接将会被释放。(请参考 testWhileIdle ) |
minIdle |
(整型值)池始终都应保留的链接的最小数目。若是验证查询失败,则链接池会缩减该值。默认值取自 initialSize:10 (请参考 testWhileIdle )。 |
initialSize |
(整型值)链接器启动时建立的初始链接数。默认为 10 。 |
maxWait |
(整型值)在抛出异常以前,链接池等待(没有可用链接时)返回链接的最长时间,以毫秒计。默认为 30000 (30 秒) |
testOnBorrow |
(布尔值)默认值为 false 。从池中借出对象以前,是否对其进行验证。若是对象验证失败,将其从池中清除,再接着去借下一个。注意:为了让 true 值生效,validationQuery 参数必须为非空字符串。为了实现更高效的验证,能够采用 validationInterval 。 |
testOnReturn |
(布尔值)默认值为 false 。将对象返回池以前,是否对齐进行验证。注意:为了让 true 值生效,validationQuery 参数必须为非空字符串。 |
testWhileIdle |
(布尔值)是否经过空闲对象清除者(若是存在的话)验证对象。若是对象验证失败,则将其从池中清除。注意:为了让 true 值生效,validationQuery 参数必须为非空字符串。该属性默认值为 false ,为了运行池的清除/测试线程,必须设置该值。(另请参阅 timeBetweenEvictionRunsMillis ) |
validationQuery |
(字符串)在将池中链接返回给调用者以前,用于验证这些链接的 SQL 查询。若是指定该值,则该查询没必要返回任何数据,只是不抛出 SQLException 异常。默认为 null 。实例值为:SELECT 1 (MySQL) select 1 from dual (Oracle) SELECT 1 (MySQL Server)。 |
validationQueryTimeout |
(整型值)链接验证失败前的超时时间(以秒计)。经过在执行 validationQuery 的语句上调用 java.sql.Statement.setQueryTimeout(seconds) 来实现。池自己并不会让查询超时,彻底是由 JDBC 来强制实现。若该值小于或等于 0,则禁用该功能。默认为 -1 。 |
validatorClassName |
(字符串)实现 org.apache.tomcat.jdbc.pool.Validator 接口并提供了一个无参(多是隐式的)构造函数的类名。若是指定该值,将经过该类来建立一个 Validator 实例来验证链接,代替任何验证查询。默认为 null ,范例值为:com.mycompany.project.SimpleValidator 。 |
timeBetweenEvictionRunsMillis |
(整型值)空闲链接验证/清除线程运行之间的休眠时间(以毫秒计)。不能低于 1 秒。该值决定了咱们检查空闲链接、废弃链接的频率,以及验证空闲链接的频率。默认为 5000 (5 秒) |
numTestsPerEvictionRun |
(整型值)Tomcat JDBC 链接池没有用到这个属性。 |
minEvictableIdleTimeMillis |
(整型值)在被肯定应被清除以前,对象在池中保持空闲状态的最短期(以毫秒计)。默认为 60000 (60 秒) |
accessToUnderlyingConnectionAllowed |
(布尔值)没有用到的属性。能够在纳入池内的链接上调用 unwrap 来访问。参阅 javax.sql.DataSource 接口的相关介绍,或者经过反射调用 getConnection ,或者将对象映射为 javax.sql.PooledConnection 。 |
removeAbandoned |
(布尔值)该值为标志(Flag)值,表示若是链接时间超出了 removeAbandonedTimeout ,则将清除废弃链接。若是该值被设置为 true ,则若是链接时间大于 removeAbandonedTimeout ,该链接会被认为是废弃链接,应予以清除。若应用关闭链接失败时,将该值设为 true 可以恢复该应用的数据库链接。另请参阅 logAbandoned 。默认值为 false 。 |
removeAbandonedTimeout |
(整型值)在废弃链接(仍在使用)能够被清除以前的超时秒数。默认为 60 (60 秒)。应把该值设定为应用可能具备的运行时间最长的查询。 |
logAbandoned |
(布尔值)标志可以针对丢弃链接的应用代码,进行堆栈跟踪记录。因为生成堆栈跟踪,对废弃链接的日志记录会增长每个借取链接的开销。默认为 false |
connectionProperties |
(字符串)在创建新链接时,发送给 JDBC 驱动的链接属性。字符串格式必须为:[propertyName=property;]*。注意:user 与 password 属性会显式传入,所以这里并不须要包括它们。默认为 null。 |
poolPreparedStatements |
(布尔值)未使用的属性 |
maxOpenPreparedStatements |
(整型值)未使用的属性 |
属性 | 描述 |
---|---|
initSQL |
字符串值。当链接第一次建立时,运行的自定义查询。默认值为 null 。 |
jdbcInterceptors |
字符串。继承自类 org.apache.tomcat.jdbc.pool.JdbcInterceptor 的子类类名列表,由分号分隔。关于格式及范例,可参见下文的配置 JDBC 拦截器。 这些拦截器将会插入到 java.sql.Connection 对象的操做队列中。 预约义的拦截器有: org.apache.tomcat.jdbc.pool.interceptor``ConnectionState ——记录自动提交、只读、catalog以及事务隔离级别等状态。org.apache.tomcat.jdbc.pool.interceptor``StatementFinalizer ——记录打开的语句,并当链接返回池后关闭它们。 有关更多预约义拦截器的详尽描述,可参阅JDBC 拦截器 |
validationInterval |
长整型值。为避免过分验证而设定的频率时间值(以秒计)。最多以这种频率运行验证。若是链接应该进行验证,但却没能在此间隔时间内获得验证,则会从新对其进行验证。默认为 30000 (30 秒)。 |
jmxEnabled |
布尔值。是否利用 JMX 注册链接池。默认为 true 。 |
fairQueue |
布尔值。假如想用真正的 FIFO 方式公平对待 getConnection 调用,则取值为 true 。对空闲链接列表将采用 org.apache.tomcat.jdbc.pool.FairBlockingQueue 实现。默认值为 true 。若是想使用异步链接获取功能,则必须使用该标志。 设置该标志可保证线程可以按照链接抵达顺序来接收链接。 在性能测试时,锁及锁等待的实现方式有很大差别。当 fairQueue=true 时,根据所运行的操做系统,存在一个决策过程。假如系统运行在 Linux 操做系统(属性 os.name = linux )上,为了禁止这个 Linux 专有行为,但仍想使用公平队列,那么只需在链接池类加载以前,将 org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS=true 添加到系统属性上。 |
abandonWhenPercentageFull |
整型值。除非使用中链接的数目超过 abandonWhenPercentageFull 中定义的百分比,不然不会关闭并报告已废弃的链接(由于超时)。取值范围为 0-100。默认值为 0,意味着只要达到 removeAbandonedTimeout ,就应关闭链接。 |
maxAge |
长整型值。链接保持时间(以毫秒计)。当链接要返回池中时,链接池会检查是否达到 now - time-when-connected > maxAge 的条件,若是条件达成,则关闭该链接,再也不将其返回池中。默认值为 0 ,意味着链接将保持开放状态,在将链接返回池中时,不会执行任何年龄检查。 |
useEquals |
布尔值。若是想让 ProxyConnection 类使用 String.equals ,则将该值设为 true ;若想在对比方法名称时使用 == ,则应将其设为 false 。该属性不能用于任何已添加的拦截器中,由于那些拦截器都是分别配置的。默认值为 true 。 |
suspectTimeout |
整型值。超时时间(以秒计)。默认值为 0 。 相似于 removeAbandonedTimeout ,但不会把链接当作废弃链接从而有可能关闭链接。若是 logAbandoned 设为 true ,它只会记录下警告。若是该值小于或等于 0,则不会执行任何怀疑式检查。若是超时值大于 0,而链接尚未被废弃,或者废弃检查被禁用时,才会执行怀疑式检查。若是某个链接被怀疑到,则记录下 WARN 信息并发送一个 JMX 通知。 |
rollbackOnReturn |
布尔值。若是 autoCommit==false ,那么当链接返回池中时,池会在链接上调用回滚方法,从而终止事务。默认值为 false 。 |
commitOnReturn |
布尔值。若是 autoCommit==false ,那么当链接返回池中时,池会在链接上调用提交方法,从而完成事务;若是 rollbackOnReturn==true ,则忽略该属性。默认值为 false 。 |
alternateUsernameAllowed |
布尔值。出于性能考虑,JDBC 链接池默认会忽略 DataSource.getConnection(username,password) 调用,只返回以前池化的具备全局配置属性 username 和 password 的链接。 但通过配置,链接池还能够容许使用不一样的凭证来请求每个链接。为了启用这项在DataSource.getConnection(username,password) 调用中描述的功能,只需将 alternateUsernameAllowed 设为 true 。 若是你请求一个链接,凭证为 user 1/password 1,而链接以前使用的是 user 2/password 2 凭证,那么链接将被关闭,从新利用请求的凭证来开启。按照这种方式,池的容量始终以全局级别管理,而不是限于模式(schema)级别。 默认值为 false 。 该属性做为一个改进方案,被添加到了 bug 50025 中。 |
dataSource |
(javax.sql.DataSource)将数据源注入链接池,从而使池利用数据源来获取链接,而不是利用 java.sql.Driver 接口来创建链接。它很是适于使用数据源(而非链接字符串)来池化 XA 链接或者已创建的链接时。默认值为 null 。 |
dataSourceJNDI |
字符串。在 JNDI 中查找的数据源的 JNDI 名称,随后将用于创建数据库链接。参看 datasource 属性的介绍。默认值为 null 。 |
useDisposableConnectionFacade |
布尔值。若是但愿在链接上放上一个门面对象,从而使链接在关闭后没法重用,则要将值设为 true 。这能防止线程继续引用一个已被关闭的链接,并继续在链接上查询。默认值为 true 。 |
logValidationErrors |
布尔值。设为 true 时,能将验证阶段的错误记录到日志文件中,错误会被记录为 SEVERE。考虑到了向后兼容性,默认值为 false 。 |
propagateInterruptState |
布尔值。传播已中断的线程(尚未清除中断状态)的中断状态。考虑到了向后兼容性,默认值为 false 。 |
ignoreExceptionOnPreLoad |
布尔值。在初始化池时,是否忽略链接建立错误。取值为 true 时表示忽略;设为 false 时,抛出异常,从而宣告池初始化失败。默认值为 false 。 |