SpringBoot连接池DataSource定义
Boot提供了默认内置集成的DataSource,也可以使用外部的。
1.spring.datasource默认连接池
默认内集成DataSource对象(默认,id名dataSource)
开发只需要添加下面连接池jar包引入,Boot可以自动创建出DataSource连接池对象。
<!-- tomcat连接池和jdbc支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- 驱动包 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency>
- 内部会优先采用tomcat-jdbc连接池;
- 然后找HikariCP连接池;
- 最后找dbcp、dbcp2连接池;
在application.properties配置文件定义连接池参数约定如下
spring.datasource.username=xxx spring.datasource.password=xxx spring.datasource.url=xxx #spring.datasource.driver-class-name=xxx spring.datasource.type=xxx
追加spring-boot-starter-jdbc.jar内部会依赖导入tomcat-jdbc功能。
如果追加了dbcp连接池,默认还是找tomcat-jdbc,想要改变可以设置spring.datasource.type=包名.类名
2.使用外部连接池
连接池种类很多,常用的有dbcp2、c3p0、druid、proxool等
创建c3p0连接池
导入c3p0连接池jar引入
<dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency>
在application.properties定义c3p0连接池参数
spring.datasource.c3p0.user=ZXH spring.datasource.c3p0.password=123 spring.datasource.c3p0.jdbcUrl=jdbc:oracle:thin:@localhost:1521/XE spring.datasource.c3p0.driverClass=oracle.jdbc.OracleDriver
在入口类子包创建C3p0DataSourceConfig.java
@Configuration//支持@Bean,内部带有@Component public class C3p0DataSourceConfig { @Bean(name="c3p0")//将返回的dataSource添加到Spring容器 @ConfigurationProperties(prefix="spring.datasource.c3p0") public DataSource createC3p0(){ // ComboPooledDataSource ds = new ComboPooledDataSource(); DataSource ds = DataSourceBuilder.create() .type(ComboPooledDataSource.class) .build(); return ds; } }
测试类
@RunWith(SpringRunner.class) @SpringBootTest(classes={BootApplication.class}) public class TestDataSource { @Resource(name="c3p0") private DataSource ds; @Test public void test1(){ System.out.println(ds); } }
- druid
提供监控功能。
导入druid连接池jar引入
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.18</version> </dependency>
在application.properties定义druid连接池参数
spring.datasource.druid.username=ZXH spring.datasource.druid.password=123 spring.datasource.druid.url=jdbc:oracle:thin:@localhost:1521/XE spring.datasource.druid.driverClassName=oracle.jdbc.OracleDriver
在入口类子包创建DruidDataSourceConfig.java
@Configuration public class DruidDataSourceConfig { @Bean(name="druid") @Primary//将当前连接池作为默认的 @ConfigurationProperties(prefix="spring.datasource.druid") public DataSource createDruid(){ DataSource ds = DataSourceBuilder.create() .type(DruidDataSource.class).build(); return ds; } }
测试类
@RunWith(SpringRunner.class) @SpringBootTest(classes={BootApplication.class}) public class TestDataSource { @Resource//默认注入带@Primay的连接池 // @Autowired // @Qualifier("druid") private DataSource ds; @Test public void test1(){ System.out.println(ds); } }
多个连接池应用问题
- @Primary
当程序中存在多个DataSource对象时,会出现注入冲突,此时可以将一个连接池设置为@Primary,意思是不指定名称时,会默认注入带有@Primary的连接池。
- spring.datasource默认连接池无效
程序中创建DataSource连接池对象后,默认tomcat连接池无效,如果需要使用可以显式创建,方法如下
@Configuration public class DefaultDataSourceConfig { @Bean(name="dataSource") public DataSource createDefault(){ return DataSourceBuilder.create().build(); } @Bean(name="dbcp") public DataSource createDbcp(){ return DataSourceBuilder.create() .type(BasicDataSource.class).build(); } }
SpringBoot应用JdbcTemplate
根据表编写实体类
实体类属性名和表字段名保持一致。
public class Evaluation implements Serializable{ private Integer id; private Integer user_id; private Integer product_id; private Integer order_id; private String title; //省略其他setter和getter方法 }
编写DAO接口和实现类
DAO接口:
public interface EvaluationDao { public List<Evaluation> findAll(); }
DAO实现类:使用JdbcTemplate实现数据库增删改查;JdbcTemplate对象自动配置会自动创建
@Repository("evalDao") public class JdbcEvaluationDao implements EvaluationDao{ @Resource private JdbcTemplate template; public List<Evaluation> findAll() { String sql = "select * from xdl_product_evaluation"; List<Evaluation> list = template.query( sql, new BeanPropertyRowMapper<Evaluation>(Evaluation.class)); return list; } }
如何为JdbcTemplate指定连接池?
解决方法:注入需要的DataSource,自己创建JdbcTemplate对象
@Configuration public class JdbcTemplateConfig { @Bean(name="c3p0Template") @Autowired public JdbcTemplate createJdbcTemplate1( @Qualifier("c3p0")DataSource ds){ JdbcTemplate template = new JdbcTemplate(ds); return template; } @Bean(name="druidTemplate") @Primary @Autowired public JdbcTemplate createJdbcTemplate2( @Qualifier("druid")DataSource ds){ JdbcTemplate template = new JdbcTemplate(ds); return template; } }
注意:多数据源注入采用@Autowired和@Qualifier(“id名”),使用@Resource(name=”id”)有时无法区分。