最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring boot 項(xiàng)目中oracle datasource設(shè)置schema的問題小結(jié)

 更新時(shí)間:2026年05月09日 08:43:18   作者:低級(jí)知識(shí)傳播者  
文章討論了在Spring Boot項(xiàng)目中使用Oracle數(shù)據(jù)庫時(shí),如何配置schema的問題,討論了CORS配置問題,提出了一種通過Nginx配置CORS的方案來解決該問題,感興趣的朋友跟隨小編一起看看吧

問題1:spring boot 項(xiàng)目中oracle datasource設(shè)置schema

背景

假設(shè)有個(gè)oracle數(shù)據(jù)庫,有個(gè)foo用戶(創(chuàng)建用戶時(shí)就會(huì)創(chuàng)建一個(gè)默認(rèn)的與用戶名同名的schema:foo,schema就是個(gè)名稱空間,用來隔離各類數(shù)據(jù)庫對(duì)象,如表、序列等),密碼11111,項(xiàng)目中對(duì)應(yīng)的yaml配置如下:

spring:
  datasource:
  	url: jdbc:oracle:thin:@1.1.1.1:1521:orcl
    username: foo
    password: 111111
    driver-class-name: oracle.jdbc.OracleDriver
    hikari:
        validationTimeout: 2000
        connectionTimeout: 10000
        keepaliveTime: 180000
        maxLifetime: 600000
        minimumIdle: 3
        maximumPoolSize: 3
        idleTimeout: 600000
        connectionTestQuery: ""

那么上文這種配置,使用foo用戶連接數(shù)據(jù)庫,默認(rèn)就能訪問foo這個(gè)schema下的表,我們寫sql時(shí):

select * from test_table;
其實(shí)就相當(dāng)于訪問:
select * from foo.test_table;

但如果我們換個(gè)用戶bar登錄:

spring:
  datasource:
  	url: jdbc:oracle:thin:@1.1.1.1:1521:orcl
    username: bar
    password: 111111
    driver-class-name: oracle.jdbc.OracleDriver

此時(shí),再執(zhí)行sql:

select * from test_table;
那就相當(dāng)于在bar這個(gè)schema下找表,就會(huì)報(bào)錯(cuò),因?yàn)檫@個(gè)表在bar下不存在:
select * from bar.test_table;

此時(shí),怎么解決呢?

要么,你還是換回foo用戶連接數(shù)據(jù)庫;要么,保持bar用戶連接數(shù)據(jù)庫,但sql中指定表的全稱:

//bar用戶訪問foo下的表時(shí):
select * from foo.test_table;

如果不想每個(gè)sql都這么麻煩呢?能不能全局指定一下schema呢?

當(dāng)然,還有人可能會(huì)問,為啥非要用bar訪問foo下的表,因?yàn)樵谖覀冞@邊:

老系統(tǒng)A,使用foo用戶訪問foo下的表;這次我們上新系統(tǒng)B,訪問foo下的表時(shí),運(yùn)維或者dba要求使用新的賬號(hào),以和老系統(tǒng)A區(qū)分(比如權(quán)限不同,或者是方便管理,或者是通過賬號(hào)就能知道是哪個(gè)系統(tǒng)來的連接),這種還是比較合情合理的要求,應(yīng)該支持。

嘗試方式1

像postgre數(shù)據(jù)庫這類,都是可以u(píng)rl指定schema:

  datasource:
    url: jdbc:postgresql://1.1.1.1:5432/demo?currentSchema=strategy
    username: 111
    password: 111
    driver-class-name: org.postgresql.Driver

但是oracle我試了下,不行。

嘗試方式2

我這邊項(xiàng)目由于使用的是動(dòng)態(tài)多數(shù)據(jù)源:

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.3</version>
    </dependency>
spring:
  datasource:
    dynamic:
      enabled: true
      primary: demo
      strict: false
      grace-destroy: false
      datasource:
        demo:
          url: jdbc:postgresql://11111:5432/11111 
          username: 略
          password: 略
          driver-class-name: org.postgresql.Driver
          hikari:
            validationTimeout: 2000
            connectionTimeout: 10000
            keepaliveTime: 180000
            maxLifetime: 600000
            minimumIdle: 10
            maximumPoolSize: 10
            idleTimeout: 600000
            connectionTestQuery: ""
        foo:
          url: jdbc:oracle:thin:@1.1.1.1:1521:orcl
          username: bar
          password: 111111
          driver-class-name: oracle.jdbc.OracleDriver
          hikari:
            validationTimeout: 2000
            connectionTimeout: 10000
            keepaliveTime: 180000
            maxLifetime: 600000
            minimumIdle: 3
            maximumPoolSize: 3
            idleTimeout: 600000
            connectionTestQuery: ""

另外,連接池就直接用的spring boot默認(rèn)的hikari,hikari是支持指定一個(gè)schema屬性的:

        foo:
          url: jdbc:oracle:thin:@1.1.1.1:1521:orcl
          username: bar
          password: 111111
          driver-class-name: oracle.jdbc.OracleDriver
          hikari:
            schema: foo ------------------- 這里可以指定
            validationTimeout: 2000
            connectionTimeout: 10000
            keepaliveTime: 180000
            maxLifetime: 600000
            minimumIdle: 3
            maximumPoolSize: 3
            idleTimeout: 600000
            connectionTestQuery: ""

但是,最終這個(gè)schema是要傳遞給oracle driver那一層的,我這邊這個(gè)版本的驅(qū)動(dòng),會(huì)報(bào)錯(cuò)。應(yīng)該是高版本的driver才支持設(shè)置schema。

com.baomidou.dynamic.datasource.creator.hikaricp.HikariCpConfig

成功的方式

我們可以指定一個(gè)初始執(zhí)行的sql:

ALTER SESSION SET CURRENT_SCHEMA = foo
      hikari:
        validationTimeout: 2000
        connectionTimeout: 10000
        keepaliveTime: 180000
        maxLifetime: 600000
        minimumIdle: 3
        maximumPoolSize: 3
        idleTimeout: 600000
        connectionTestQuery: ""
        connectionInitSql: "ALTER SESSION SET CURRENT_SCHEMA = foo" ------ 這個(gè)方式

這樣就可以了。各類數(shù)據(jù)庫連接池框架,應(yīng)該都支持類似的特性:連接建立后,執(zhí)行一個(gè)初始sql。配置就大家自己查一下。

注意點(diǎn)

使用bar用戶訪問foo下的表,記得要給bar授予相關(guān)權(quán)限才行。

問題2:在nginx上配置cors的正確方式

背景

我個(gè)人其實(shí)不太習(xí)慣在nginx上配置cors,我目前手里項(xiàng)目是在spring boot項(xiàng)目里,自己寫個(gè)cors的filter就實(shí)現(xiàn)了。但我新接手的一個(gè)項(xiàng)目,發(fā)現(xiàn)有個(gè)小問題:

nginx--》spring gateway --》 spring boot服務(wù)。

我給spring boot服務(wù)加了cors后,默認(rèn)在http返回header時(shí),就會(huì)加上cors相關(guān)的header:

Access-Control-Allow-Origin "*";

結(jié)果前端訪問時(shí),說報(bào)錯(cuò)了。提示有多個(gè)Access-Control-Allow-Origin header。

因?yàn)閟pring gateway 上也開了cors相關(guān)filter,也加了一個(gè)(按理說要判斷是否后端服務(wù)已經(jīng)加了,如果加了,就不應(yīng)該再加了,是spring boot gateway里的配置沒對(duì),導(dǎo)致重復(fù)加了)。

nginx加cors

如果要臨時(shí)解決上述問題,就可以在nginx上實(shí)現(xiàn)cors(location中加如下指令):

proxy_hide_header Access-Control-Allow-Credentials;
proxy_hide_header Access-Control-Allow-Origin;
add_header Access-Control-Allow-Credentials "true";
add_header Access-Control-Allow-Origin "*"; 

重要的是上面的proxy_hide_header,要把后端服務(wù)返回的先隱藏,否則就會(huì)有多個(gè)類似這種的Access-Control-Allow-Origin header,導(dǎo)致報(bào)錯(cuò)。

我這邊配置的比較暴力,是允許了*,大家根據(jù)情況自行配置。

到此這篇關(guān)于spring boot 項(xiàng)目中oracle datasource設(shè)置schema的問題小結(jié)的文章就介紹到這了,更多相關(guān)spring boot oracle datasource設(shè)置schema內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

宜良县| 营口市| 那曲县| 敦化市| 南昌县| 天等县| 无棣县| 诸城市| 弥渡县| 将乐县| 永德县| 富阳市| 平武县| 新巴尔虎右旗| 延川县| 汕头市| 南岸区| 五原县| 黎川县| 新郑市| 丘北县| 广州市| 闵行区| 垣曲县| 隆尧县| 新竹市| 清镇市| 乌海市| 丽江市| 彰武县| 巫溪县| 南汇区| 邵阳市| 乌什县| 弥渡县| 淮北市| 洛川县| 科技| 宜兰市| 阿尔山市| 莫力|