我有一个关于Tomcat 7 JDBC连接池的基本问题:是为每个单独的数据库(即URL)创建的单独池吗?或者是创建的单个池,它保存来自任意数量的不同数据库的开放连接?例如,如果我通过执行以下操作打开与数据库A和B的连接:P...
我有一个关于Tomcat 7 JDBC连接池的基本问题:是为每个单独的数据库(即URL)创建的单独池吗?或者是创建的单个池,它保存来自任意数量的不同数据库的开放连接?
例如,如果我通过执行以下操作打开与数据库A和B的连接:
PoolProperties poolProperties = new PoolProperties();
poolProperties.setDriverClassName("org.postgresql.Driver");
poolProperties.setUrl("jdbc:postgresql://myserver/db_a");
poolProperties.setInitialSize(1);
poolProperties.setMaxActive(10);
poolProperties.setMaxIdle(1);
poolProperties.setMinIdle(0);
然后这个:
PoolProperties poolProperties = new PoolProperties();
poolProperties.setDriverClassName("org.postgresql.Driver");
poolProperties.setUrl("jdbc:postgresql://myserver/db_b");
poolProperties.setInitialSize(1);
poolProperties.setMaxActive(10);
poolProperties.setMaxIdle(1);
poolProperties.setMinIdle(0);
我刚刚创建了一个maxActive为10的池,或者两个池,每个池的maxActive值为10?如果它是一个池,如果在打开数据库B的连接时将maxActive更改为30,那么该怎么办?第一次调用setMaxActive是win,还是第二次调用覆盖,或者这是否会导致创建单独的池?
解决方法:
好的,我做了一些挖掘并自己弄清楚了. (感谢tomcat-users邮件列表中的许多人!)
JB Nizet是对的:如果您是从Java代码创建Tomcat数据库连接池,那么您实际按字面实例化的每个DataSource都是/表示一个单独的连接池.这让我很惊讶;来自.NET背景,我假设Tomcat连接池将像SqlServer / ADO.NET连接池一样工作:如果使用两个相同的连接字符串来获得两个数据库连接,这些连接池将来自同一个连接池.但是,在Tomcat中,当从Java代码实例化DataSource对象时,每个新的DataSource实例都是一个全新的连接池.因此,例如,如果要在JAX-RS Web服务调用中保留这些连接池,则需要构建自己的数据库池(DataSource)缓存,将DataSource实例(每个数据库一个)放入其中,然后存储它在JAX-RS将持续跨Web服务调用的对象中.我刚刚这样做了,它工作正常.
顺便说一句,Tomcat数据库连接池确实提供类似于SqlServer / ADO.NET连接池的功能,您只需使用JNDI资源来创建DataSource实例. (在我的情况下,这不是一个选项,因为数据库是在我的应用程序中动态创建的,而JNDI定义通常是从Tomcat在启动时读取的配置文件创建的.)
本文标题为:java – tomcat 7 JDBC连接池 – 每个数据库的独立池?
基础教程推荐
- Java二维数组与稀疏数组相互转换实现详解 2023-06-01
- 关于maven的用法和几个常用的命令 2023-06-30
- Java向上转型和向下转型的区别说明 2022-12-16
- 详解JDBC的概念及获取数据库连接的5种方式 2023-05-19
- java中类加载与双亲委派机制详解 2023-04-18
- ShardingSphere解析SQL示例详解 2023-03-22
- Java实现单线程聊天室 2023-05-19
- Hystrix Dashboard断路监控仪表盘的实现详细介绍 2023-05-08
- 你知道Java判断字符串是否为数字的多种方式吗 2023-02-19
- java实现计算器模板及源码 2022-12-03