6

我们现在有一个 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

4 回答 4

5

不可以。数据源名称的范围是一个 Tomcat 实例。

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

于 2009-08-27T15:38:47.410 回答
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 实例。
于 2009-08-28T05:48:03.797 回答
1

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

于 2009-08-27T16:07:16.867 回答
0

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

于 2009-09-02T21:23:43.983 回答