如何在运行时动态连接到DataSources?

时间:2016-08-12 12:03:05

标签: java spring jboss jndi

这种情况 - 我将JBOSS EAP 6.4设置为我的应用服务器,并在其中定义了一些JNDI数据源。数据源的名称和数量可能因环境而异。我需要编写一个Web服务,它将JNDI数据源和查询作为输入。它应该连接到相应的数据源并执行查询。

因此,JNDI数据源名称不应在应用程序中进行硬编码,而应在运行时将其作为输入。

我无法使用下面的spring配置来定义数据源,因为这会使其硬编码 -

<bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:jboss/datasources/myDS2"/>
</bean>

我想做点什么:

<bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="${dataSourceInput}"/>
</bean>

其中${dataSourceInput}是webservice的输入。

请让我知道如何实现它。

更新 -

我不希望数据源名称作为JVM参数或通过参数文件传递。必须将数据源名称作为输入传递给Web服务。上面的代码片段可能不是正确的方法。通过spring配置文件可能无法做到这一点。

请告诉我是否有其他方法可以达到同样目的。

2 个答案:

答案 0 :(得分:1)

搜索了一段时间后,我找到了我正在寻找的答案。

我可以从JNDI名称创建数据源,该名称作为webservice的输入,如下所示。

dataSourceInput = <input from the webservice>
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup(dataSourceInput);

参考 - http://www.journaldev.com/2513/tomcat-datasource-jndi-example-java

答案 1 :(得分:0)

您可以将属性文件或-D参数填充到JVM -

所以在JVM参数的情况下 -

-DdataSourceInput=java:jboss/datasources/myDS2

还有其他方法可以实现类似,但这是最简单的

如果您使用的是xml,则会通过 -

导入属性文件
<context:property-placeholder location="classpath*:META-INF/spring/myproperties.properties" />

使用包含 -

的属性
dataSourceInput=java:jboss/datasources/myDS2