Spring Boot學習筆記-SQL數據庫使用

初次看到Spring Boot關於SQL數據庫的數據源配置時,筆者是傻臉的節奏。筆者以前的工做開發中,用過應用級別的c3p0鏈接池技術(踩過一個鏈接老是耗盡的坑),後來改用了Tomcat服務器JNDI獲取數據源的方法。因此筆者腦海裏的第一反應是兩個問號。html

  1. Spring Boot默認是內嵌的Tomcat,原來META-INF下context.xml文件起做用麼?
  2. 假設context.xml文件不起做用,JNDI怎麼配?數據源怎麼結合JNDI?

但其實你仔細查看開發指南並實際運行起來後,會發現Spring Boot爲你準備了最佳的數據庫鏈接池方案。筆者也無需照搬原來的套路來「強加」到Spring Boot上。java

Spring Boot數據鏈接池策略

講Spring Boot應用如何配置池化數據源以前,先提醒一點。利用Tomcat服務器的JDBC數據源相信不少開發者都瞭解過。Tomcat7以前,Tomcat本質應用了DBCP鏈接池技術來實現的JDBC數據源,但在Tomcat7以後,Tomcat提供了新的JDBC鏈接池方案,做爲DBCP的替換或備選方案,解決了許多以前使用DBCP的不利之處,並提升了性能。傳送門mysql

值得慶幸的是,Spring Boot默認爲應用提供了數據庫鏈接池的配置策略。只須要在屬性文件(例如application.properties)中配置須要的鏈接池參數便可。git

輸入圖片說明

固然,咱們使用Tomcat數據源鏈接池,須要依賴tomcat-jdbc,只要應用中添加了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依賴,則無需擔憂這點。spring

同時,假如咱們想用其餘方式的鏈接池技術,只要配置本身的DataSource bean,便可覆蓋Spring Boot的自動配置。sql

配置數據源

Spring Boot應用的數據源配置,筆者建議放在application.properties文件中。相關的屬性值均以「spring.datasource.」開頭。若是你用的是Idea IDE的話,編輯時會有自動提示,同時你會發現,這些相關的屬性值跟Tomcat JDBC鏈接池的配置屬性是一一對應的,包括特有的加強屬性!這也側面證明了Spring Boot默認首先支持Tomcat JDBC鏈接池。數據庫

spring.datasource.url=jdbc:mysql://localhost:3306/demo
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
spring.datasource.validation-query=SELECT 1
spring.datasource.test-on-borrow=false
spring.datasource.test-while-idle=true
spring.datasource.time-between-eviction-runs-millis=18800
spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)

相信配置過鏈接池的開發人員對這些屬性的意義都有所認識,大同小異。tomcat

值得一提的是,不管是Spring Boot默認的DataSource配置仍是你本身的DataSource bean,都會引用到外部屬性文件中的屬性配置。因此假設你自定義的DataSource bean,你能夠在定義bean時設置屬性,也能夠在屬性文件中,以「spring.datasource.*」的方式使屬性配置外部化。服務器

運行示例

參照上述的配置,搭建個測試數據庫,代碼就能夠運行了起來了,相比筆者以前的工做經歷,着實省了老大的力氣。app

默認Spring Boot應用會自動註冊一個JDBCTemplate bean,因此筆者寫了一個簡單的示例,運行並查看了效果。傳送門

@Repository
public class UserRepository {
	private final JdbcTemplate jdbcTemplate;

    @Autowired
    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    /**
     * 獲取全部的用戶
     *
     * @return List
     */
    public List<User> getAll() {
        String sql = "SELECT * FROM user";

        List<User> users = jdbcTemplate.query(sql, new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet resultSet, int i) throws SQLException {
                User user = new User();

                user.setId(resultSet.getInt("id"));
                user.setName(resultSet.getString("name"));

                return user;
            }
        });

    	return users;
	}
}

輸入圖片說明

同時筆者出於好奇,想看下Spring Boot默認是否真的採用Tomcat JDBC鏈接池,打開了DEBUG日誌。

輸入圖片說明

爲了更進一步的驗證,筆者在數據源配置中添加Tomcat JDBC鏈接池特有的攔截器SlowQueryReport(threshold=0),並把閥值設的很低,那麼理論上SQL查詢發生時會打印出關於慢查詢的警告日誌。

輸入圖片說明

相關文章
相關標籤/搜索