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

Java tomcat 7 JDBC连接池-每个数据库的独立池?,java,postgresql,tomcat,jdbc,connection-pooling,Java,Postgresql,Tomcat,Jdbc,Connection Pooling,我有一个关于Tomcat7JDBC连接池的基本问题:是否为每个单独的数据库(即URL)创建了单独的池?还是创建了一个单独的池来保存来自任意多个不同数据库的打开连接 例如,如果我通过以下操作打开与数据库A和B的连接: PoolProperties poolProperties = new PoolProperties(); poolProperties.setDriverClassName("org.postgresql.Driver"); poolProperties.setUrl("jdbc:

我有一个关于Tomcat7JDBC连接池的基本问题:是否为每个单独的数据库(即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用户邮件列表上的许多好心人!)

JB Nizet是正确的:如果您是从Java代码创建Tomcat数据库连接池,那么您实例化的每个数据源实际上都是/代表一个单独的连接池。这让我很惊讶;来自.NET背景,我假设Tomcat连接池的工作方式类似于SqlServer/ADO.NET连接池:如果使用两个相同的连接字符串来获得两个数据库连接,那么它们都将来自同一个连接池。然而,在Tomcat中,当从Java代码实例化数据源对象时,每个新的数据源实例都是一个全新的连接池。因此,如果您想跨JAX-RS web服务调用持久化这些连接池,例如,您需要构建自己的数据库池(DataSource)缓存,将数据源实例(每个数据库一个)放入其中,并将其存储在JAX-RS将跨web服务调用持久化的对象中。我刚做了这件事,效果很好


顺便说一句,Tomcat数据库连接池提供了类似于SqlServer/ADO.NET连接池的功能,您只需使用JNDI资源来创建数据源实例。(在我的情况下,这不是一个选项,因为数据库是在我的应用程序中动态创建的,JNDI定义通常是从Tomcat启动时读取的配置文件创建的。)

我认为您没有创建任何池。您刚刚指定了两组池配置(稍后将用于创建两个池)。你能展示一下你在哪里使用这些属性的代码吗?你好。这部分工作得很好,所以我不想把我的文章弄得乱七八糟。基本上,我使用“org.apache.tomcat.jdbc.pool.DataSource(poolProperties)”,从池属性创建一个DataSource实例,然后使用数据源创建一个Spring JdbcTemplate对象,代码如下:“namedParameterJdbcTemplate=new namedParameterJdbcTemplate(DataSource);”这一切都很好。我只是想问是什么决定了何时创建两个独立的连接池(如果有的话)。谢谢。当然,您有两个独立的池:您正在创建两个数据源,每个数据源都有自己的属性。“来自Tomcat在启动时读取的配置文件”-这不是真的。Tomcat监视全局
config.xml
,如果更改了,它将重新加载它并相应地更改数据源。在我的tomcat/conf目录下没有“config.xml”。你是说context.xml?是的,对不起,我是说
context.xml