【问题标题】:Sharing a database connection pool Spring bean between two WAR在两个 WAR 之间共享一个数据库连接池 Spring bean
【发布时间】:2013-07-01 01:40:56
【问题描述】:

我想知道是否可以共享一个数据库连接池 bean(由 Spring 设置)并在部署在 JBoss 中的两个 WAR 之间共享它。

例如,我想要这样的东西: 数据库池.xml

    <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/>

WAR app1 的 applicationContext.xml:

    <import resource="database-pool.xml"/>
    <bean id="someBean1">
        <property name="datasource" ref="datasource"/>
    </bean>

WAR app2 的 applicationContext.xml:

    <import resource="database-pool.xml"/>
    <bean id="someBean2">
        <property name="datasource" ref="datasource"/>
    </bean>

我的最终目标是拥有一个数据库连接池实例。这可行吗?

【问题讨论】:

    标签: spring dependency-injection jboss5.x


    【解决方案1】:

    我认为如果您使用应用程序本地数据源,这将很难(如果不是不可能的话)。但是,如果您在容器上安装数据源,则可以共享它(请参阅Chapter 17. Datasource Configuration -- JBoss 5 reference)。容器数据源将有一个 JNDI 名称,您可以使用 &lt;jee:jndi-lookup&gt; 标签将其注入 Spring 容器:

    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>
    

    JNDI 数据源不仅可以通过管理方式(管理控制台)进行部署,还可以通过编程方式进行部署。在 Spring 容器初始化时,每场战争都可能有以下代码逻辑:

    1. 检查是否存在具有 JNDI 名称的数据源 “jdbc/MyDatasource”。
    2. 如果不存在,则创建一个并部署。
    3. 如果存在,只需获取引用,将其放入 Spring 容器中。

    但是这种方法的弱点是,如果您以后必须更改数据源属性(服务器 ip/数据库名称),则必须更新并重新编译每一次战争。

    在这方面使用管理控制台在容器上配置数据源是一种更流行的方法。

    【讨论】:

    • 这实际上是我们目前的部署模型,也是我们想要摆脱的东西(所以我们不必依赖容器和所有东西,尤其是 JBoss)。不过谢谢!
    • JNDI 数据源不仅可以通过管理方式(管理控制台)进行部署,还可以通过编程方式进行部署。在 Spring 容器初始化时,每场战争都可能有以下代码逻辑: 1. 检查是否存在 JNDI 名称为“jdbc/MyDatasource”的数据源。 2. 如果不存在,则创建一个并部署。 3. 如果存在,只需获取引用,将其放入 Spring 容器中。见:stackoverflow.com/questions/14982125/…
    猜你喜欢
    • 2012-01-03
    • 2020-02-21
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多