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

输入图片说明

相关文章
相关标签/搜索