我有一个关于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对象初始化过程代码块和构造器的调用顺序 2022-09-03
- java System类和Arrays类详解 2023-05-08
- 为何HashSet中使用PRESENT而不是null作为value 2023-06-10
- js实现百度地图同时显示多个路书效果 2023-08-02
- 告诉你为什么 ThreadLocal 可以做到线程隔离 2023-03-21
- java – Mysql流结果集和jOOQ fetchLazy 2023-11-01
- Go Java算法之交错字符串示例详解 2023-04-06
- Spring多线程通过@Scheduled实现定时任务 2022-11-08
- Sentinel热点key限流的实现详解 2023-05-08
- Thread类interrupt interrupted及isInterrupted区别 2023-06-24