在使用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 。 |