Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在运行时动态连接到数据源?_Java_Spring_Jboss_Jndi - Fatal编程技术网

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

Java 如何在运行时动态连接到数据源?,java,spring,jboss,jndi,Java,Spring,Jboss,Jndi,情况就是这样——我将JBOSS EAP 6.4设置为我的应用服务器,并在其中定义了一些JNDI数据源。数据源的名称和数量可能因环境而异。我需要编写一个以JNDI数据源和查询为输入的Web服务。它应该连接到相应的数据源并执行查询 因此,JNDI数据源名称不应在应用程序中硬编码,而应在运行时作为输入 我不能使用下面的spring配置来定义数据源,因为这会使它硬编码- <bean id="dbDataSource" class="org.springframework.jndi.JndiObje

情况就是这样——我将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}
是Web服务的输入

请让我知道如何实现它

更新--

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


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

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

所以在JVM参数的情况下-

-DdataSourceInput=java:jboss/datasources/myDS2
还有其他方法可以达到类似的效果,但这是最简单的

如果您使用的是xml,则属性文件将通过以下方式导入—

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

经过一段时间的搜索,我找到了我一直在寻找的答案

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

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

参考-

JNDI数据源名称应作为Web服务的输入而不是JVM参数传递。可能我在spring中配置的方式是错误的。我可能需要在代码中配置它,而不是在spring配置文件中使用我使用的方法更新它的强制要求是将JNDI名称作为输入传递给Web服务,而不是通过属性文件。如果spring找不到属性,则会出现异常,因此属性为mandatory。您可以检查这一点。定义一个主DS和多个DS,并检查要动态调用的DS。您的
${dataSourceInput}
将只是一个字符串。我浏览了链接。它仍然需要在spring配置文件中定义所有数据源。然后动态地决定需要使用其中的哪一个。这里我的要求不同。我不知道在应用服务器级别定义的数据源的数量/名称。因此,无法在spring配置文件中定义所有这些。
dataSourceInput = <input from the webservice>
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup(dataSourceInput);