在两个WAR之间共享一个数据库连接池Spring bean

时间:2013-07-01 01:40:56

标签: spring dependency-injection jboss5.x

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

例如,我想要这样的事情: 数据库pool.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>

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

1 个答案:

答案 0 :(得分:1)

我认为如果你使用app-local数据源会很难(如果不是不可能的话)。但是,如果在容器上安装数据源,则可以共享它(请参阅Chapter 17. Datasource Configuration -- JBoss 5 reference)。容器数据源将具有JNDI名称,您可以使用<jee:jndi-lookup>标记将其注入Spring容器:

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

JNDI数据源不仅可以在管理上(管理控制台)进行部署,还可以进行编程。每个war都可以在Spring容器初始化时使用以下代码逻辑:

  1. 检查是否存在具有JNDI名称的数据源 “JDBC / MyDatasource”。
  2. 如果不存在,请创建一个并部署。
  3. 如果存在,只需抓住引用,将其放入Spring容器中。
  4. 然而,这种方法的缺点是,如果您将来必须更改数据源属性(服务器IP /数据库名称),则必须更新并重新编译每次单独的战争。

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