我正在使用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);
}
这是创建连接池的正确方法吗(通过将连接池绑定到模式名称)?如果我尝试在另一个模式上运行查询[使用从池中借来的连接]会有什么影响?
答案 0 :(得分:0)
我认为模式名称不应该是URL的一部分,因为db连接是针对数据库而不是模式本身。此外,还有像DB2这样的数据库,其中currentschema
不起作用。
我们应该牢记模式概念背后的基本目的 - 表的组织 - 功能和用户 - 我们不应该开始将它与连接相关联。
根据授予的架构权限,用户只能连接到特定架构,用户应在所有查询中强制使用架构名称。查询不应该含糊不清。
关于第二个问题,
如果我尝试使用连接运行查询会有什么影响 在另一个架构上从池中借来的?
我认为,你可以很好地测试它,我的猜测它应该不起作用,但行为可能因数据库而异。
我说因为关于setUrl method-
的这个说明,它不会起作用注意:此方法一旦存在,此方法当前无效 初始化。该池首次初始化其中之一 调用以下方法:getConnection,setLogwriter, setLoginTimeout,getLoginTimeout,getLogWriter。
它不应该工作,因为提供的URL不会自动更改为第二个架构。池API应该只是将之前的URL传递给新的查询执行,它可能有效/无效,具体取决于底层驱动程序/ dbs。
在这些API中,没有提供setSchema()
这样的方法可能有其自身的原因 - 您的代码应该尽可能保持中立。
希望它有所帮助!!