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()这样的方法可能有其自己的原因 - 您的代码应该尽可能中立。

希望它有帮助!