Tomcat JDBC连接池是否在实例之间共享?

时间:2009-08-27 15:15:43

标签: java tomcat jdbc java-ee jndi

我们现在有一个Web应用程序,我们为每个客户端部署一个副本。我们当前的部署策略是为每个实例创建一个唯一命名的jdbc连接池。 所以说jdbc / client。它们被指定为......

< Context path="/"
        reloadable="true"
        docBase="\home\client\ROOT"
        debug="5" >
        < Resource name="jdbc/client"
                auth="Container"
                type="javax.sql.DataSource"
                maxActive="100"
                maxIdle="30"
                validationQuery="SELECT 1"
                testWhileIdle="true"
                timeBetweenEvictionRunsMillis="300000"
                numTestsPerEvictionRun="6"
                minEvictableIdleTimeMillis="1800000"
                maxWait="10000"
                username="user"
                password="pass"
                driverClassName="com.mysql.jdbc.Driver"
                url="jdbc:mysql://databaseserver:3306/client ?zeroDateTimeBehavior=convertToNull&amp;jdbcCompliantTruncation=false"/>
< /Context>

问题是,如果我要对其进行标准化,以便在所有已部署的实例上将连接池称为jdbc / database而不是唯一的名称,是否存在数据库交叉的可能性,即另一个客户的数据库中的一个客户,或者是这些本地化到特定部署的实例?

思考? 谢谢, 斯科特

4 个答案:

答案 0 :(得分:4)

没有。数据源名称的范围是一个Tomcat实例。

如果要为每个客户启动单独的Tomcat进程,那么重要的是如何配置数据源,而不是Tomcat调用它的方式。只要每个数据源配置为使用不同的数据库,就不会有任何串扰。

答案 1 :(得分:3)

这取决于您为每个客户端部署应用程序的方式,

  1. 如果每个客户端都有自己的Tomcat安装(它们有不同的CATALINA_HOME),那么它就没有机会穿过它。
  2. 如果它们都使用相同的安装但在Tomcat中作为不同的主机运行,则需要确保不在conf / context.xml中定义数据源,该数据源由所有主机共享。
  3. 如果所有客户端共享相同的Tomcat实例,并且它们只是不同的Web应用程序,则需要更多关注。您需要在META-INF / context.xml或WEB-INF / web.xml中定义数据源。为了进一步隔离,您应该将dbcp.jar复制到每个应用程序的WEB-INF / lib,以便它们使用自己的DBCP实例。

答案 2 :(得分:1)

如果您要在部署应用程序的Context中定义JNDI DataSource资源,我相信您甚至可以在同一个Tomcat实例中运行相同应用程序的多个副本,并使用相同的JNDI名称访问不同的数据库。如果每个应用程序实例完全在不同的Tomcat实例中运行,那么一个实例肯定无法引用为另一个实例指定的数据库。

答案 3 :(得分:0)

没有数据库交叉的可能性becoz数据源名称的范围是一个Tomcat实例,并且您可以在单个tomcat实例中拥有多个数据源....因此只要数据源不同就没有机会数据库穿越.....