【问题标题】:Do Tomcat JDBC Connection pools get shared between instances?Tomcat JDBC 连接池是否在实例之间共享?
【发布时间】:2010-11-23 10:16:03
【问题描述】:

我们现在有一个 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 而不是唯一名称,是否有可能跨越数据库,即一个客户在另一个客户的数据库中,或者是这些本地化到特定部署的实例?

想法? 谢谢, 斯科特

【问题讨论】:

  • 内存中只运行了1个tomcat副本,但上面部署了多个war文件

标签: java tomcat jdbc jakarta-ee jndi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我有 2 个应用程序使用相同的 JNDI 名称,但每个应用程序都有一个指向不同数据库模式的数据源资源,不幸的是,两者都只使用了一个资源......你能帮帮我吗?
    【解决方案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 实例。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 2012-01-03
        • 1970-01-01
        • 2012-03-02
        • 1970-01-01
        • 2010-10-14
        • 2013-05-01
        • 2014-12-26
        • 1970-01-01
        相关资源
        最近更新 更多