Spring Boot學習筆記-SQL數據庫使用
Spring Boot應用的數據源配置,筆者建議放在application.properties文件中。相關的屬性值均以“spring.datasource.”開頭。如果你用的是Idea IDE的話,編輯時會有自動提示,同時你會發現,這些相關的屬性值跟Tomcat JDBC連接池的配置屬性是一一對應的,包括特有的增強屬性!這也側面證實了Spring Boot默認首先支持Tomcat JDBC連接池。
初次看到Spring Boot關于SQL數據庫的數據源配置時,筆者是傻臉的節奏。筆者之前的工作開發中,用過應用級別的c3p0連接池技術(踩過一個連接總是耗盡的坑),后來改用了Tomcat服務器JNDI獲取數據源的方法。所以筆者腦海里的第一反應是兩個問號。
- Spring Boot默認是內嵌的Tomcat,原來META-INF下context.xml文件起作用么?
- 假設context.xml文件不起作用,JNDI怎么配?數據源怎么結合JNDI?
但其實你仔細查看開發指南并實際運行起來后,會發現Spring Boot為你準備了最佳的數據庫連接池方案。筆者也無需照搬原來的套路來“強加”到Spring Boot上。
Spring Boot數據連接池策略
講Spring Boot應用如何配置池化數據源之前,先提醒一點。利用Tomcat服務器的JDBC數據源相信很多開發者都了解過。Tomcat7之前,Tomcat本質應用了DBCP連接池技術來實現的JDBC數據源,但在Tomcat7之后,Tomcat提供了新的JDBC連接池方案,作為DBCP的替換或備選方案,解決了許多之前使用DBCP的不利之處,并提高了性能。傳送門
值得慶幸的是,Spring Boot默認為應用提供了數據庫連接池的配置策略。只需要在屬性文件(例如application.properties)中配置需要的連接池參數即可。
當然,我們使用Tomcat數據源連接池,需要依賴tomcat-jdbc,只要應用中添加了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依賴,則無需擔心這點。
同時,假如我們想用其他方式的連接池技術,只要配置自己的DataSource bean,即可覆蓋Spring Boot的自動配置。
配置數據源
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=rootspring.datasource.password=rootspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.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=falsespring.datasource.test-while-idle=truespring.datasource.time-between-eviction-runs-millis=18800 spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)
相信配置過連接池的開發人員對這些屬性的意義都有所認識,大同小異。
值得一提的是,無論是Spring Boot默認的DataSource配置還是你自己的DataSource bean,都會引用到外部屬性文件中的屬性配置。所以假設你自定義的DataSource bean,你可以在定義bean時設置屬性,也可以在屬性文件中,以“spring.datasource.*”的方式使屬性配置外部化。
運行示例
參照上述的配置,搭建個測試數據庫,代碼就可以運行了起來了,相比筆者之前的工作經歷,著實省了老大的力氣。
默認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查詢發生時會打印出關于慢查詢的警告日志。