springboot2如何将数据源配置到tomcat的context.xml中并交给spring的DruidDataSource对象?

环境:
1、springboot2 jpa tomcat8
2、启动方式:tomcat8启动
3、没有xml文件和其他配置文件,全部要集成到yml文件中

我需要详细的代码,包括config文件中引入的包。

数据源的相关配置全部要放到tomcat的context.xml中。

如果可以,最好使用JNDI

愿意有偿酬谢,我QQ529629886

3个回答

已经测试验证,两步即可:
1、yml配置如下
jndi-datasource: #jndi数据源的配置
open: true #是否开启jndi配置
jndiNameList: #开启jndi配置时,配置如下信息,spring.datasource不在生效
- dataSourceName: dataSource
dialect: oracle
jndiName: java:comp/env/jdbc/ccense
- dataSourceName: dataSource2
dialect: oracle
jndiName: java:comp/env/jdbc/face
2、创建JndiDataSourceConfig.java
@ConditionalOnProperty(prefix = "jndi-datasource", name = "open", havingValue = "true")
@Configuration
@EnableTransactionManagement(order = 2)
@Slf4j
public class JndiDataSourceConfig {

@Bean
@ConfigurationProperties(prefix = "newcap.jndi-datasource")
public JNDIProperties jndiProperties() {
    JNDIProperties jndiProperties = new JNDIProperties();
    return jndiProperties;
}

@Bean(name = "dataSource")
public DynamicDataSource dataSource() {
    HashMap<Object, Object> hashMap = new HashMap<>();

    JNDIProperties jndiProperties = jndiProperties();

    for (JndiProperties properties : jndiProperties.getJndiNameList()){
        DataSourceDialect.dataSourceNameDialect.put(properties.getDataSourceName(), properties.getDataSourceName());

        JndiDataSourceLookup lookup = new JndiDataSourceLookup();
        lookup.setResourceRef(true);
        DataSource dataSource = lookup.getDataSource(properties.getJndiName());
        hashMap.put(properties.getDataSourceName(), dataSource);
    }

    DynamicDataSource dynamicDataSource = new DynamicDataSource();

    dynamicDataSource.setTargetDataSources(hashMap);
    //设置主数据源
    dynamicDataSource.setDefaultTargetDataSource(hashMap.get(DatasourceEnum.DATA_SOURCE));
    return dynamicDataSource;
}

}

(1)配置tomcat的context.xml文件中,增加如下配置

<Resource name="jdbc/mbr"  
    factory="com.alibaba.druid.pool.DruidDataSourceFactory"  
    auth="Container"  
    type="javax.sql.DataSource"  
    driverClassName="oracle.jdbc.OracleDriver"  
    url="jdbc:oracle:thin:@//192.168.1.5:1901/testdb"  
    username="root"  
    password="root"  
    maxActive="50"  
    maxWait="10000"  
    removeabandoned="true"  
    removeabandonedtimeout="60"  
    logabandoned="false"  

    filters="stat" />

(2)yml配置文件中引用

spring:
  datasource:
    jndiName:
      masterDB: java:comp/env/jdbc/master
      clusterDB: java:comp/env/jdbc/mbr
            type: org.springframework.jndi.JndiObjectFactoryBean
            druid:
                # 下面为连接池的补充设置,应用到上面所有数据源中
                # 初始化大小,最小,最大
                initial-size: 5
                min-idle: 5
                max-active: 20
                # 配置获取连接等待超时的时间
                max-wait: 60000
                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
                time-between-eviction-runs-millis: 60000
                # 配置一个连接在池中最小生存的时间,单位是毫秒
                min-evictable-idle-time-millis: 300000
                validation-query: SELECT 1 FROM DUAL
                test-while-idle: true
                test-on-borrow: false
                test-on-return: false
                # 打开PSCache,并且指定每个连接上PSCache的大小
                pool-prepared-statements: true
                #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
                max-pool-prepared-statement-per-connection-size: 20
                filters: stat,wall
                use-global-data-source-stat: true
                # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
                connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
                # 配置监控服务器
                stat-view-servlet:
                    login-username: admin
                    login-password: 123456
                    reset-enable: false
                    url-pattern: /druid/*
                    # 添加IP白名单
                    #allow:
                    # 添加IP黑名单,当白名单和黑名单重复时,黑名单优先级更高
                    #deny:
                web-stat-filter:
                    # 添加过滤规则
                    url-pattern: /*
                    # 忽略过滤格式
                    exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"



qq_33333654
AFinal翻车鱼 回复jasondyoung: yml支持jndi-name,但是我如果获取他从tomcat中读取的数据呢?封装到哪个对象中去了?已经尝试了不下30种方法了。你可以亲自试下
9 个月之前 回复
u011126065
jasondyoung spring.datasource.jndi-name=java:comp/env/jdbc/j4s 这种是properties格式,换成yml应该是上面的没错
9 个月之前 回复
u011126065
jasondyoung 把db换成spring试试
9 个月之前 回复
qq_33333654
AFinal翻车鱼 回复jasondyoung: 这个博客我看过了,也尝试过了,不行,应该是版本问题。我的是springboot2.0
9 个月之前 回复
u011126065
jasondyoung 多个的时候这样引入
9 个月之前 回复
qq_33333654
AFinal翻车鱼 我这里没有xml文件,全部是Yml文件的,你看下能否集成到yml文件中,我需要详细的demo。项目是springboot2.0不是ssm
9 个月之前 回复
qq_33333654
AFinal翻车鱼 你这个不是我想要的,你这属于基础的配置,看看我的提问
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问