首页 文章

tomcat 7 JDBC连接池 - 每个数据库的独立池?

提问于
浏览
4

我有一个关于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,还是第二次调用覆盖,或者这是否会导致创建单独的池?

1 回答

  • 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在启动时读取的配置文件创建的 . )

相关问题