如何配置單數據源
搭建項目
主要相關的依賴是H2 和 JDBC, 如果是別的數據庫就選別的,入Mysql
查看datasource是否配置成功
@SpringBootApplication @Slf4j public class DataSourceDemoApplication implements CommandLineRunner { @Autowired private DataSource dataSource; @Autowired private JdbcTemplate jdbcTemplate; public static void main(String[] args) { SpringApplication.run(DataSourceDemoApplication.class, args); } @Override public void run(String... args) throws Exception { showConnection(); showData(); } 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())); } }
啟動程序控制台輸出:
說明spingboot自動幫我們配置好了dataSource和jdbcTemplate.
當然也可以在配置文件中改變數據源的一些連接信息:
spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.username=sa spring.datasource.password= spring.datasource.hikari.maximumPoolSize=5 spring.datasource.hikari.minimumIdle=5 spring.datasource.hikari.idleTimeout=600000 spring.datasource.hikari.connectionTimeout=30000 spring.datasource.hikari.maxLifetime=1800000
CommandLineRunner解釋:在spirngboot啟動完成后會執行它的run方法。
如果不是springboot項目,而是spring項目我們需要怎么配置呢?
我們需要手動地配置dataSource,transactionManager以及JdbcTemplate這些bean.
@Configuration @EnableTransactionManagement public class DataSourceDemo { @Autowired private DataSource dataSource; public static void main(String[] args) throws SQLException { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext*.xml"); showBeans(applicationContext); dataSourceDemo(applicationContext); } @Bean(destroyMethod = "close") public DataSource dataSource() throws Exception { Properties properties = new Properties(); properties.setProperty("driverClassName", "org.h2.Driver"); properties.setProperty("url", "jdbc:h2:mem:testdb"); properties.setProperty("username", "sa"); return BasicDataSourceFactory.createDataSource(properties); } @Bean public PlatformTransactionManager transactionManager() throws Exception { return new DataSourceTransactionManager(dataSource()); } private static void showBeans(ApplicationContext applicationContext) { System.out.println(Arrays.toString(applicationContext.getBeanDefinitionNames())); } private static void dataSourceDemo(ApplicationContext applicationContext) throws SQLException { DataSourceDemo demo = applicationContext.getBean("dataSourceDemo", DataSourceDemo.class); demo.showDataSource(); } public void showDataSource() throws SQLException { System.out.println(dataSource.toString()); Connection conn = dataSource.getConnection(); System.out.println(conn.toString()); conn.close(); } }
所以可以看得出springboot幫我們做了很多的配置bean的工作,如果我們沒有配置,它會幫我們配置,如果我們自己配置了,那就不會自動配置了
如何配置多數據源
配置多數據源的注意事項
不同數據源的配置要分開
關注每次使⽤用的數據源
• 有多個DataSource時系統如何判斷
• 對應的設施(事務、ORM等)如何選擇DataSource
Spring Boot中的多數據源配置
⼿手⼯工配置兩組 DataSource 及相關內容
與Spring Boot協同⼯工作(⼆選一)
• 配置@Primary類型的Bean
• 排除Spring Boot的⾃自動配置
• DataSourceAutoConfiguration
• DataSourceTransactionManagerAutoConfiguration
• JdbcTemplateAutoConfiguration
package geektime.spring.data.multidatasourcedemo; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import javax.annotation.Resource; import javax.sql.DataSource; @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class}) @Slf4j public class MultiDataSourceDemoApplication { public static void main(String[] args) { SpringApplication.run(MultiDataSourceDemoApplication.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); } }