spring Boot数据源配置及数据库连接池的概念

发布时间:2019-05-07 06:00:01发布者:Mr.Zhang阅读(425)

Spring中配置数据源的几种方式

  • 通过在JDBC驱动程序定义的数据源;
  • 通过JNDI查找的数据源;
  • 连接池的数据源;

使用JNDI数据源

Spring应用程序经常部署在Java EE应用服务器中,例如Tomcat、JBoss。这些服务器器允许你通过配置获取数据源,这样做的好处是数据源可以在应用之外进行管理。另外,在应用服务器中数据源通常都是以连接池的方式组织,从而具备更好的性能,并且还支持系统管理员对其进行热切换

对于Tomcat需要在tomcat/conf/context.xml中配置好连接信息,其中name指的是JNDI的名称

 

<Resource auth="Container" 
driverClassName="oracle.jdbc.driver.OracleDriver" 
name="jdbc/dev" 
password="dev" 
type="javax.sql.DataSource" 
url="jdbc:oracle:thin:@127.0.0.1:1521/orcl" 
username="dev"/>

 

对于Sping应用来说需要手动配置

@Bean
public JndiObjectFactoryBean dataSource() {
    JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
    jndiObjectFactoryBean.setJndiName("jdbc/dev");
    jndiObjectFactoryBean.setResourceRef(true);
    jndiObjectFactoryBean.setProxyInterface(javax.sql.DataSource.class);
    return jndiObjectFactoryBean;
}

Spring boot中帮我们自动配置好了,只需要在application.properties中声明指定jndiName就可以了。

spring.datasource.jndi-name=java:comp/env/jdbc/dev
// 或者是
spring.datasource.jndi-name=jdbc/dev

因为Spring boot自带web容器,因此JNDI方式只适用于将war发布到独立的web容器启动的方式。

 

使用连接池的数据源

啥是连接池?

  数据库连接池是web容器(比如Tomcat)提供的一个数据库连接管理的容器,连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

 为什么要用它?

   数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。  一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。 

在Spring Boot中怎么用?

配置连接池参数

  • 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.
  • 最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作
  • 最大空闲时间: 超出这个时间,该连接将被销毁
  • 获取连接超时时间: 超出时间程序将会返回连接超时异常
  • 超时重试连接次数: 超时后重新连接的次数

 

Spring Boot2.0默认使用HikariCP连接池得到数据源

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

这样就搞定了,Spring Boot帮我们把数据源创建、事务管理、JdbcTemplate创建都搞定了。

 

多数据源配置

在Sring boot中配置多数据源需要写多套配置,例如创建两个数据源

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=

分别用Java Config 为不同的配置创建数据源Bean。

首先让Spring boot取消自动配置

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class})

然后手动配置DataSource和TransactionManager,@Primary注解指明当有两个类实现同一接口的时候该采用哪个实现类进行@Autowried,另外可以在实现类上用@Qualifier("className")指定名称,后面@Autowried的时候也用@Qualifier指定注入哪个类。

@Configuration
@Slf4j
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("foo.datasource")
    public DataSourceProperties fooDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    public DataSource fooDataSource() {
        DataSourceProperties dataSourceProperties = fooDataSourceProperties();
        log.info("foo datasource: {}", dataSourceProperties.getUrl());
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    @Bean
    JdbcTemplate fooJdbcTemplate(@Qualifier("fooDataSource")DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @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();
    }

    @Primary
    @Bean
    JdbcTemplate barJdbcTemplate(@Qualifier("barDataSource")DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean
    @Resource
    public PlatformTransactionManager barTxManager(DataSource barDataSource) {
        return new DataSourceTransactionManager(barDataSource);
    }
}

 

到此我们可以使用DataSource了

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class})
@Slf4j
public class MultiDataSourceApplication implements CommandLineRunner {

    @Autowired
    private DataSource dataSource;

    @Autowired
    @Qualifier("barDataSource")
    private DataSource barDataSource;

    @Autowired
    @Qualifier("fooJdbcTemplate")
    private JdbcTemplate fooJdbcTemplate;

    @Autowired
    @Qualifier("barJdbcTemplate")
    private JdbcTemplate barJdbcTemplate;

    public static void main(String[] args) {
        SpringApplication.run(MultiDataSourceApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        showConnection();
    }

    private void showConnection() throws SQLException {
        log.info("fooDataSource数据源: " + dataSource.toString());
        log.info("fooJdbcTemplate: " + fooJdbcTemplate.toString());

        log.info("barDataSource数据源: " + barDataSource.toString());
        log.info("barJdbcTemplate: " + barJdbcTemplate.toString());


    }
}

 

 

 





本文转自博客园,原文地址:https://www.cnblogs.com/zycb/p/10822579.html