如何在运行时动态连接到数据源?

How to connect to DataSources dynamically at runtime?

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

因此 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} 是网络服务的输入。

请告诉我如何实现它。

更新--

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

请让我知道是否有任何其他方法可以达到同样的效果。

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

所以在 JVM 参数的情况下 -

-DdataSourceInput=java:jboss/datasources/myDS2

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

如果您使用的是 xml,则属性文件由 -

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

属性包含 -

dataSourceInput=java:jboss/datasources/myDS2

经过一段时间的搜索,我找到了我要找的答案。

我可以从 JNDI 名称创建数据源,该名称被用作 Web 服务的输入,如下所示。

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

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