1

我使用JdbcConnectionPooling公地dbcp2庫:指定架構名稱在創建連接池

<dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-dbcp2</artifactId> 
     <version>2.1.1</version> 
    </dependency> 

當我通過使架構名稱作爲URL的一部分初始化連接池我與架構名綁定如:

BasicDataSource ds = new BasicDataSource(); 
    String url = "<url>"; 
    ds.setDriverClassName("<DriverClass>"); 
    ds.setUsername("<userName>"); 
    ds.setPassword("<Password>"); 
    ds.setInitialSize(5); 
    ds.setMaxTotal(10); 
    ds.setMaxIdle(5); 
    String schema = "<mySchema>"; 
    ds.setUrl(url + "?currentschema=" + schema); 
    try (Connection conn = ds.getConnection()) { 
    }catch(Exception ex){ 
    LOG.error("Issue while creating connection pool", ex); 
    } 

是創建連接池(通過連接池綁定到架構名稱)的這個正確的方式?如果我嘗試在另一個架構上運行[從池中借用的連接]查詢會產生什麼影響?

回答

0

我會說模式名稱不應該是URL的一部分,因爲數據庫連接是對數據庫進行的,而不是模式本身。另外,還有像DB2這樣的數據庫,其中currentschema不起作用。

我們應該記住模式概念背後的基本目的 - 組織表 - 功能和用戶方面,我們不應該開始將它與連接相關聯。

根據授予的模式權限,用戶將只能連接到特定模式,並且用戶應在所有查詢中強制使用模式名稱。查詢不應該含糊不清。

關於第二個問題,

的影響是什麼,如果我嘗試運行一個查詢[從池借用連接 ]在另一個模式?

我想,你可以很好地測試出來我的猜測是它不應該工作,但行爲可能從數據庫到數據庫的不同而不同。

我說什麼也不會,因爲有這樣一個字條setUrl的工作方法 -

注:此方法目前還沒有效果一旦池已 初始化。池初始化時會調用以下方法之一:getConnection,setLogwriter, setLoginTimeout,getLoginTimeout,getLogWriter。

因爲URL提供一次不會自動爲第二個架構更改它不應該工作。 Pooling API應該簡單地將前一個URL傳遞給新的查詢執行,並且它可能工作/不工作,具體取決於底層驅動程序/ dbs。

在這些API中,不提供像setSchema()這樣的方法可能有其自己的原因 - 您的代碼應該儘可能中立。

希望它有幫助!