【问题标题】:Specifying schema name while creating ConnectionPool在创建 ConnectionPool 时指定架构名称
【发布时间】:2017-07-03 15:39:44
【问题描述】:

我正在为 JdbcConnectionPooling 使用 commons-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);
    }

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

【问题讨论】:

    标签: database database-connection datasource connection-pooling


    【解决方案1】:

    我会说架构名称不应该是 URL 的一部分,因为 db 连接是与数据库而不是架构本身建立的。此外,还有像 DB2 这样的数据库,其中 currentschema 不起作用。

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

    根据授予的架构权限,用户将只能连接到特定架构,并且用户应在所有查询中强制使用架构名称。查询不应模棱两可。

    第二个问题,

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

    我认为,您可以很好地对其进行测试,我的猜测是它不应该工作,但行为可能因数据库而异。

    我说因为 setUrl 方法上的这个注释所以它不起作用-

    注意:此方法目前在池被删除后无效 初始化。池在第一次初始化时 调用以下方法:getConnection、setLogwriter、 setLoginTimeout、getLoginTimeout、getLogWriter。

    它不应该起作用,因为一旦提供了 URL,第二个架构就不会自动更改。池化 API 应该简单地将之前的 URL 传递给新的查询执行,它可能工作/不工作取决于底层驱动程序/数据库。

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

    希望对你有帮助!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多