springboot(2)--数据源

2020-11-19 15:12:30 浏览数 (1)

springboot简化了我们构建应用的难度,把很多功能帮我们打包,然后我们

通过简单的注解或者引入依赖就能使用相关的功能,比如jdbc操作,缓存使用等等。

数据源是第三方机构基于jdbc规范实现的一套数据库操作功能,我们可以在

其基础上非常方便地实现数据查询和更新,而不必关心其底层实现,让我们把更多的经历投入到业务实现。常见数据源(连接池)有druid,tomcat,dbcp,c3p0和hikari等,此篇我们就基于流行的数据源实现springboot对数据库的操作。

Druid连接池

druid是阿里巴巴开源的数据库连接池,除了高性能之外,还提供了数据库

操作监控。

1.引入pom依赖

除了引入druid依赖之外,还要添加jdbc和mysql-connector-java依赖:

<!-- jdbcTemplate -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jdbc</artifactId>

</dependency>

<!-- druid数据库连接池 -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

</dependency>

<!-- mysql connector -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>

2.添加数据库连接属性配置

数据库连接属性配置文件druid.properties:

#数据库设置

spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true

spring.datasource.username=username

spring.datasource.password=password

3.数据库连接配置类

使用@Configuration注解类替代传统的xml配置,DruidConfiguration:

@Configuration

@PropertySource(value = "classpath:druid.properties")

public class DruidConfiguration {

@Bean(destroyMethod = "close", initMethod = "init",name = "druidDataSource")

@ConfigurationProperties(prefix = "spring.datasource")

public DataSource druidDataSource() {

DruidDataSource druidDataSource = new DruidDataSource();

return druidDataSource;

}

/**

* 注册一个StatViewServlet

* @return

*/

@Bean

public ServletRegistrationBean druidStatViewServlet(){

//org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.

ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");

//添加初始化参数:initParams

//白名单:

servletRegistrationBean.addInitParameter("allow","127.0.0.1");

//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.

servletRegistrationBean.addInitParameter("deny","192.168.1.73");

//登录查看信息的账号密码.

servletRegistrationBean.addInitParameter("loginUsername","admin");

servletRegistrationBean.addInitParameter("loginPassword","123456");

//是否能够重置数据.

servletRegistrationBean.addInitParameter("resetEnable","false");

return servletRegistrationBean;

}

/**

* 注册一个:filterRegistrationBean

* @return

*/

@Bean

public FilterRegistrationBean druidStatFilter(){

FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());

//添加过滤规则.

filterRegistrationBean.addUrlPatterns("/*");

//添加不需要忽略的格式信息.

filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");

return filterRegistrationBean;

}

}

后边的两个@Bean是提供监控的,暂时可以忽略。

4.增加配置暴露JdbcTemplate

我们此处为了测试方便,使用spring提供的jdbcTemplate:

@Configuration

public class CommonConfiguration {

@Bean

public JdbcTemplate jdbcTemplate(@Qualifier("druidDataSource") DataSource dataSource) {

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

return jdbcTemplate;

}

}

这样我们就可以基于jdbcTemplate直接操作数据库了。

5.编写测试代码&测试

为了测试方便不再写dao层和service层代码,直接controller操作jdbcTemplate:

@RestController

public class IndexController {

private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

@Autowired

private JdbcTemplate jdbcTemplate;

@RequestMapping("hello")

public List<Map<String, Object>> hello() {

List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT * FROM User ", new Object[]{});

logger.info("size:{}",list.size());

return list;

}

}

运行门面类Demo1Application启动应用,然后浏览器输入localhost:8080/hello看到如下结果:

已经查到了数据,也就是我们实现了springboot使用druid数据库完成数据库操作。

Tomcat连接池

Tomcat除了可以作为应用容器之外,也提供了数据库连接池。

1.引入tomcat连接池依赖

<dependency>

<groupId>org.apache.tomcat</groupId>

<artifactId>tomcat-jdbc</artifactId>

</dependency>

2.添加数据库连接属性配置

数据库连接属性配置文件tomcat.properties:

#数据库设置

spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true

spring.datasource.username=username

spring.datasource.password=password

3.数据库连接配置类

@Configuration

@PropertySource(value = "classpath:tomcat.properties")

public class TomcatJdbcConfiguration {

private static final Logger logger = LoggerFactory.getLogger(TomcatJdbcConfiguration.class);

@Bean("tomcatDataSource")

@ConfigurationProperties(prefix = "spring.datasource")

public DataSource tomcatDataSource() {

logger.info("tomcat数据库连接池创建中.......");

org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();

return ds;

}

4.增加配置暴露JdbcTemplate

jdbcTemplate数据源切换成tomcatDataSource:

@Configuration

public class CommonConfiguration {

@Bean

public JdbcTemplate jdbcTemplate(@Qualifier("tomcatDataSource") DataSource dataSource) {

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

return jdbcTemplate;

}

}

5.编写测试代码&测试

重新运行门面类Demo1Application启动应用,调试jdbcTemplate注入DataSource依赖:

这里的DataSource确实已经变成了tomcat的数据源。然后浏览器输入localhost:8080/hello看到如下结果:

查到了数据,也就是我们实现了springboot使用tomcat连接池数据库完成数据库操作。

Dbcp连接池

1.引入dbcp连接池依赖

<dependency>

<groupId>commons-dbcp</groupId>

<artifactId>commons-dbcp</artifactId>

</dependency>

2.添加数据库连接属性配置

数据库连接属性配置文件dbcp.properties:

#数据库设置

spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true

spring.datasource.username=username

spring.datasource.password=password

3.数据库连接配置类

@Configuration

@PropertySource(value = "classpath:dbcp.properties")

public class DbcpConfiguration {

private static final Logger logger = LoggerFactory.getLogger(DbcpConfiguration.class);

@Bean(destroyMethod = "close",name = "dbcpDataSource")

@ConfigurationProperties(prefix = "spring.datasource")

public DataSource tomcatDataSource() {

logger.info("dbcp数据库连接池创建中.......");

BasicDataSource ds = new BasicDataSource();

return ds;

}

}

4.增加配置暴露JdbcTemplate

jdbcTemplate数据源切换成dbcpDataSource:

@Configuration

public class CommonConfiguration {

@Bean

public JdbcTemplate jdbcTemplate(@Qualifier("dbcpDataSource") DataSource dataSource) {

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

return jdbcTemplate;

}

}

5.编写测试代码&测试

重新运行门面类Demo1Application启动应用,调试jdbcTemplate注入DataSource依赖:

这里的DataSource已经变成了dbcp的BasicDataSource。然后浏览器输入localhost:8080/hello看到如下结果:

查到了数据,也就是我们实现了springboot使用dbcp连接池数据库完成数据库操作。

C3p0连接池

C3p0也是我们常用的数据库连接池,也有不错的性能和处理并发能力。

1.引入dbcp连接池依赖

<dependency>

<groupId>com.mchange</groupId>

<artifactId>c3p0</artifactId>

</dependency>

2.添加数据库连接属性配置

数据库连接属性配置文件c3p0.properties:

#数据库设置

spring.datasource.driverClass=com.mysql.jdbc.Driver

spring.datasource.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true

spring.datasource.user=username

spring.datasource.password=password

3.数据库连接配置类

@Configuration

@PropertySource(value = "classpath:c3p0.properties")

public class C3p0Configuration {

private static final Logger logger = LoggerFactory.getLogger(C3p0Configuration.class);

@Bean(destroyMethod = "close",name = "c3p0DataSource")

@ConfigurationProperties(prefix = "spring.datasource")

public DataSource tomcatDataSource() {

logger.info("c3p0数据库连接池创建中.......");

ComboPooledDataSource ds = new ComboPooledDataSource();

return ds;

}

}

4.增加配置暴露JdbcTemplate

jdbcTemplate数据源切换成c3p0DataSource:

@Configuration

public class CommonConfiguration {

@Bean

public JdbcTemplate jdbcTemplate(@Qualifier("c3p0DataSource") DataSource dataSource) {

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

return jdbcTemplate;

}

}

5.编写测试代码&测试

重新运行门面类Demo1Application启动应用,调试jdbcTemplate注入DataSource依赖:

这里的DataSource已经变成了c3p0的ComboPooledDataSource。然后浏览器输入localhost:8080/hello看到如下结果:

查到了数据,也就是我们实现了springboot使用c3p0连接池数据库完成数据库操作。

HikariCP连接池

HikariCP连接池号称是性能最好的连接池,druid作者温少与HikariCP作者的一次对话中温少说druid默认使用了公平锁,导致性能比HikariCP差那么一点点,但是druid扛住了双11的体量,而HikariCP没有那么大体量的真实场景验证。

1.引入HikariCP连接池依赖

在项目引入spring-boot-starter-jdbc依赖的时候,HikariCP依赖已经被带进来了,所以此处不许额外添加依赖。

2.添加数据库连接属性配置

数据库连接属性配置文件hikari.properties:

#数据库设置

spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.jdbcUrl=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false

spring.datasource.username=username

spring.datasource.password=password

spring.jooq.sql-dialect=MYSQL

spring.datasource.initialize=false

spring.datasource.continueOnError=true

spring.datasource.hikari.idleTimeout=30000

spring.datasource.hikari.maximumPoolSize=10

3.数据库连接配置类

@Configuration

@PropertySource(value = "classpath:hikari.properties")

public class HikarIConfiguration {

private static final Logger logger = LoggerFactory.getLogger(HikarIConfiguration.class);

@Bean("hikariDataSource")

@ConfigurationProperties(prefix = "spring.datasource")

public DataSource hikarDataSource() {

logger.info("hikari数据库连接池创建中.......");

HikariDataSource ds = new HikariDataSource();

return ds;

}

}

4.增加配置暴露JdbcTemplate

jdbcTemplate数据源切换成HikariDataSource:

@Configuration

public class CommonConfiguration {

@Bean

public JdbcTemplate jdbcTemplate(@Qualifier("hikariDataSource") DataSource dataSource) {

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

return jdbcTemplate;

}

}

5.编写测试代码&测试

重新运行门面类Demo1Application启动应用,调试jdbcTemplate注入DataSource依赖:

这里的DataSource已经变成了HikariCP的HikariDataSource。然后浏览器输入localhost:8080/hello看到如下结果:

查到了数据,也就是我们实现了springboot使用Hikari连接池数据库完成数据库操作。

总结

我们基于springboot实现了各种常见数据源的使用,性能最好的就是druid和HikariCP连接池,虽然后者号称比druid性能好,但是基于可靠性验证,推荐使用druid,也希望通过此篇给大家在springboot日常开发中带来帮助。

0 人点赞