在创建ConnectionPool时指定模式名称

时间:2017-02-15 05:45:39

标签: database database-connection datasource connection-pooling

我正在使用commons-dbcp2库进行JdbcConnectionPooling:

   <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);
    }

这是创建连接池的正确方法吗(通过将连接池绑定到模式名称)?如果我尝试在另一个模式上运行查询[使用从池中借来的连接]会有什么影响?

1 个答案:

答案 0 :(得分:0)

我认为模式名称不应该是URL的一部分,因为db连接是针对数据库而不是模式本身。此外,还有像DB2这样的数据库,其中currentschema不起作用。

我们应该牢记模式概念背后的基本目的 - 表的组织 - 功能和用户 - 我们不应该开始将它与连接相关联。

根据授予的架构权限,用户只能连接到特定架构,用户应在所有查询中强制使用架构名称。查询不应该含糊不清。

关于第二个问题,

  

如果我尝试使用连接运行查询会有什么影响   在另一个架构上从池中借来的?

我认为,你可以很好地测试它,我的猜测它应该不起作用,但行为可能因数据库而异。

我说因为关于setUrl method-

的这个说明,它不会起作用
  

注意:此方法一旦存在,此方法当前无效   初始化。该池首次初始化其中之一   调用以下方法:getConnection,setLogwriter,   setLoginTimeout,getLoginTimeout,getLogWriter。

它不应该工作,因为提供的URL不会自动更改为第二个架构。池API应该只是将之前的URL传递给新的查询执行,它可能有效/无效,具体取决于底层驱动程序/ dbs。

在这些API中,没有提供setSchema()这样的方法可能有其自身的原因 - 您的代码应该尽可能保持中立。

希望它有所帮助!!