我有一个关于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,还是第二次调用覆盖,或者这是否会导致创建一个单独的池?
答案 0 :(得分:3)
好的,我做了一些挖掘并自己弄清楚了。 (感谢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在启动时读取的配置文件创建的。)