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查询发生时会打印出关于慢查询的警告日志。