单数据源配置
springboot1.0中默认使用tomcat连接池,但在springboot2.0后使用了HikariCP连接池(很强的)。
springboot的application.properties
中配置
spring.datasource.url=jdbc:h2:mem:testdb ## 数据源地址
spring.datasource.username=sa ## 用户名
spring.datasource.password= ## 密码
spring.datasource.hikari.maximumPoolSize=5 ##最大池数量
直接注入DataSource即可使用
@Autowired
private DataSource dataSource;
@Autowired
private JdbcTemplate jdbcTemplate;
private void showConnection() throws SQLException {
log.info(dataSource.toString());
Connection conn = dataSource.getConnection();
log.info(conn.toString());
conn.close();
}
private void showData() {
jdbcTemplate.queryForList("SELECT * FROM FOO")
.forEach(row -> log.info(row.toString()));
}
springboot会通过@DataSourceAutoConfiguration
帮我们配置数据源,@DataSourceTransactionManagerAutoConfiguration
帮我们配置事务管理器,@JdbcTemplateAutoConfiguration
帮我们配置JdbcTemplate。
多数据源配置
如果我们要配置多数据源,那么我们肯定要排除这3个配置注解。
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
JdbcTemplateAutoConfiguration.class})
@Slf4j
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
/**
* 配置多数据源
*/
@Bean
@ConfigurationProperties("foo.datasource")
public DataSourceProperties fooDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public DataSource fooDataSource() {
DataSourceProperties dataSourceProperties = fooDataSourceProperties();
log.info("foo datasource: {}", dataSourceProperties.getUrl());
return dataSourceProperties.initializeDataSourceBuilder().build();
}
@Bean
@Resource
public PlatformTransactionManager fooTxManager(DataSource fooDataSource) {
return new DataSourceTransactionManager(fooDataSource);
}
@Bean
@ConfigurationProperties("bar.datasource")
public DataSourceProperties barDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
public DataSource barDataSource() {
DataSourceProperties dataSourceProperties = barDataSourceProperties();
log.info("bar datasource: {}", dataSourceProperties.getUrl());
return dataSourceProperties.initializeDataSourceBuilder().build();
}
@Bean
@Resource
public PlatformTransactionManager barTxManager(DataSource barDataSource) {
return new DataSourceTransactionManager(barDataSource);
}
}
下面是application.properties
foo.datasource.url=jdbc:h2:mem:foo
foo.datasource.username=sa
foo.datasource.password=
bar.datasource.url=jdbc:h2:mem:bar
bar.datasource.username=sa
bar.datasource.password=
然后通过DataSourceProperties
创建数据源和事务管理器。执行结果打印:
HikariCP
列出来它的优化点:
- 字节码精简:优化代码,直到编译后的字节码最少。利用了一个第三方的Java字节码修改类库Javassist来生成委托实现动态代理。
- 使用了ConcurrentBag。是一个专门为连接池设计的lock-less集合,实现了比LinkedBlockingQueue、LinkedTransferQueue更好的并发性能。使用了ThreadLocal和CopyOnWriteArrayList。如果ThreadLocal没有,那么从CopyOnWriteArrayList中获取。
- 使用了FastList代替ArrayList保存statement。减少了索引检查并且ArrayList的remove是从前往后遍历。而FastList是从后往前,后打开的statement会先关闭。