【问题标题】:how to get a spring declared datasource in an xml config file如何在 xml 配置文件中获取 spring 声明的数据源
【发布时间】:2011-06-21 10:26:20
【问题描述】:

我有一个如下所示的 spring 数据源:

<bean id="dataSource1" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${database.driver}" />
    <property name="url" value="${database1.url}" />
    <property name="username" value="${database1.username}" />
    <property name="password" value="${database1.password}" />
</bean>

我需要在 jndi 或 jee 上提供此功能。一些相关的事情:

<bean id="dataSourceJNDI1" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/dataSource1"/>
    <property name="beanClassLoader" ref="dataSource1"></property>
</bean>

或者也许:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/database1" />

不确定如何让 jndi 或 jee 与 dbcp 一起工作。任何帮助将不胜感激。

提前致谢。

ps:伙计们,这是一个特殊的针。所以我必须这样做。请不要发布不必要的建议,说明为什么我应该使用 tomcat 服务器作为数据源。我知道以这种方式设置数据源。我再说一遍,这是一个特殊的需要。也请不要为我提供 java 代码解决方案,不是必需的。

ps:不知道怎么做的人,请不要占用这个帖子的空间,说不可能。如果您不知道答案,则无需发布和垃圾邮件。

【问题讨论】:

  • 第二个 XML 文件是什么?它是您自己的应用程序代码正在解析的自定义配置文件吗?
  • 嗨 kevin ,它是一个 ha-jdbc 配置文件。它需要使用 jndi 为数据源获取信息。这就是我需要这样做的原因。我知道这听起来有点像 hack。

标签: java database spring jdbc datasource


【解决方案1】:

您需要将 DataSource 绑定到 JNDI 树。您需要提供用于连接到本地 JNDI 树的参数。 JndiTemplate 可以做到这一点。本地 InitialContext 可能不需要某些 JNDI 环境属性。我认为“java.naming.factory.initial”是唯一需要的。另一个用于连接到进程外的 JNDI 服务器:

    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.provider.url">${jndi.provider.url}</prop>
            <prop key="java.naming.factory.initial">${jndi.factory.initial}</prop>
            <prop key="java.naming.security.principal">${jndi.security.principal}</prop>
            <prop key="java.naming.security.credentials">${jndi.security.credentials}</prop>
        </props>
    </property>
</bean>

<bean factory-bean="jndiTemplate" factory-method="bind">
    <constructor-arg type="java.lang.String" value="java:com/env/DataSoure"/>
    <constructor-arg type="java.lang.Object" ref="dataSource"/>
</bean>

如果您在同一个 Spring 上下文中执行 JNDI 查找,您需要让 JNDI bean 依赖于此查找 bean,或者使 JNDI 查找变得惰性,以便它在第一次使用时执行查找。

【讨论】:

    【解决方案2】:

    由于您使用的是 jndi,因此您必须将数据源声明为 jndi 源。

    <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/database1" />
    
    <bean id="dataSource1" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="dataSource" ref="dataSource" />
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database1.url}" />
        <property name="username" value="${database1.username}" />
        <property name="password" value="${database1.password}" />
    </bean>
    

    假设您对 dataSource1 的 bean 定义是正确的,这应该可以工作。

    【讨论】:

    • dbcp 中没有作为数据源的属性,您真的在自动完成 ide 中尝试过吗?请尝试一下。我确定你不会在那里找到它。
    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多