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

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

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

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

背景

假設(shè)有個oracle數(shù)據(jù)庫,有個foo用戶(創(chuàng)建用戶時就會創(chuàng)建一個默認的與用戶名同名的schema:foo,schema就是個名稱空間,用來隔離各類數(shù)據(jù)庫對象,如表、序列等),密碼11111,項目中對應(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ù)庫,默認就能訪問foo這個schema下的表,我們寫sql時:

select * from test_table;
其實就相當于訪問:
select * from foo.test_table;

但如果我們換個用戶bar登錄:

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

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

select * from test_table;
那就相當于在bar這個schema下找表,就會報錯,因為這個表在bar下不存在:
select * from bar.test_table;

此時,怎么解決呢?

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

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

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

當然,還有人可能會問,為啥非要用bar訪問foo下的表,因為在我們這邊:

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

嘗試方式1

像postgre數(shù)據(jù)庫這類,都是可以url指定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

我這邊項目由于使用的是動態(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默認的hikari,hikari是支持指定一個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: ""

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

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

成功的方式

我們可以指定一個初始執(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" ------ 這個方式

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

注意點

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

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

背景

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

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

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

Access-Control-Allow-Origin "*";

結(jié)果前端訪問時,說報錯了。提示有多個Access-Control-Allow-Origin header。

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

nginx加cors

如果要臨時解決上述問題,就可以在nginx上實現(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ù)返回的先隱藏,否則就會有多個類似這種的Access-Control-Allow-Origin header,導致報錯。

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

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

相關(guān)文章

最新評論

惠安县| 涟源市| 七台河市| 无锡市| 泰安市| 香格里拉县| 页游| 宿州市| 永城市| 天峻县| 内乡县| 西乌珠穆沁旗| 随州市| 南岸区| 洛宁县| 霸州市| 太仓市| 武胜县| 仁布县| 自贡市| 两当县| 江津市| 贡山| 武强县| 汨罗市| 潼关县| 旌德县| 民乐县| 米易县| 自治县| 涿州市| 浦江县| 公主岭市| 新绛县| 马尔康县| 泰宁县| 千阳县| 孙吴县| 成都市| 竹山县| 密云县|