如何在 Spring 中使用 Tomcat 提供的 JNDI 数据源?

据说在 Springjavadoc 关于 DriverManagerDataSource类的文章中,这个类非常简单,建议使用

使用容器提供的 JNDI DataSource。这样的 DataSource可以通过 JndiObjectFactoryBean在 SpringApplicationContext 中作为 DataSourcebean 公开

问题是: 我该怎么做?

例如,如果我希望使用 DataSourcebean 访问我的自定义 MySQL 数据库,那么我需要什么?我应该在上下文配置中写些什么?

277514 次浏览

文件: C. 2.3.1 <jee:jndi-lookup/>(简单)

例如:

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

您只需找出应用服务器将数据源绑定到的 JNDI 名称。这完全是特定于服务器的,请查阅服务器上的文档以了解如何操作。

记住在 bean 文件的顶部声明 jee名称空间,如 C.2.3 jee 模式所述。

假设在 tomcat 配置中有一个“ sampleDS”数据源定义,那么可以在 applicationContext.xml中添加以下代码行,以使用 JNDI 访问数据源。

<jee:jndi-lookup expected-type="javax.sql.DataSource" id="springBeanIdForSampleDS" jndi-name="sampleDS"/>

您必须使用以下方法为 jee前缀定义名称空间和模式位置:

xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"

如果使用 Spring 的基于 XML 模式的配置,在 Spring 上下文中的设置如下:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
...
<jee:jndi-lookup id="dbDataSource"
jndi-name="jdbc/DatabaseName"
expected-type="javax.sql.DataSource" />

或者,使用简单的 bean 配置进行设置,如下所示:

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

您可以使用如下方法在 tomcat 的 server.xml 中声明 JNDI 资源:

<GlobalNamingResources>
<Resource name="jdbc/DatabaseName"
auth="Container"
type="javax.sql.DataSource"
username="dbUser"
password="dbPassword"
url="jdbc:postgresql://localhost/dbname"
driverClassName="org.postgresql.Driver"
initialSize="20"
maxWaitMillis="15000"
maxTotal="75"
maxIdle="20"
maxAge="7200000"
testOnBorrow="true"
validationQuery="select 1"
/>
</GlobalNamingResources>

并像下面这样引用 Tomcat 的 web context.xml 中的 JNDI 资源:

  <ResourceLink name="jdbc/DatabaseName"
global="jdbc/DatabaseName"
type="javax.sql.DataSource"/>

参考文件:

编辑: 这个答案已经针对 Tomcat 8和 Spring 4进行了更新。Tomcat 的 违约数据源资源池设置有一些属性名更改。

使用 Spring 的 JavaConfig 机制,您可以这样做:

@Configuration
public class MainConfig {


...


@Bean
DataSource dataSource() {
DataSource dataSource = null;
JndiTemplate jndi = new JndiTemplate();
try {
dataSource = jndi.lookup("java:comp/env/jdbc/yourname", DataSource.class);
} catch (NamingException e) {
logger.error("NamingException for java:comp/env/jdbc/yourname", e);
}
return dataSource;
}


}

根据 ApacheTomcat 7 JNDI 数据源如何操作页面,web.xml 中必须有一个资源配置:

<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>

我同意

另一个特点: 中添加“ Resource”标记,而不是 server.xml
Your _ application/META-INF/Context.xml (根据 公猫医生) 像这样:

<Context>
<Resource name="jdbc/DatabaseName" auth="Container" type="javax.sql.DataSource"
username="dbUsername" password="dbPasswd"
url="jdbc:postgresql://localhost/dbname"
driverClassName="org.postgresql.Driver"
initialSize="5" maxWait="5000"
maxActive="120" maxIdle="5"
validationQuery="select 1"
poolPreparedStatements="true"/>
</Context>

在您的 Spring 类中,您可以注入一个 bean,注释类似于

@Autowired
@Qualifier("dbDataSource")
private DataSource dataSource;

然后将其添加到 context.xml 中

<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>

您可以使用以下方法在 tomcat 的 server.xml 中声明 JNDI 资源

<Resource name="jdbc/TestDB"
global="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/TestDB"
username="pankaj"
password="pankaj123"


maxActive="100"
maxIdle="20"
minIdle="5"
maxWait="10000"/>

回到 context.xml de spring 添加以下内容

<ResourceLink name="jdbc/MyLocalDB"
global="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource" />

如果像这个示例一样要向数据库注入连接,请确保 tomcat lib 目录中存在 MySQL jar,否则 tomcat 将无法创建 MySQL 数据库连接池。

我发现这个解决方案非常有用,可以干净利落地完全删除 xml 配置。

请使用 JNDI 和 spring 框架检查这个 db 配置。 Http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

通过本文,我们解释了基于数据库 jndi (db/test)配置创建 db 配置是多么容易。一旦您完成了配置,那么所有的 db 存储库都将使用这个 jndi 加载。我确实发现了有用的东西。如果@Pierre 对此有意见,请告诉我。这是编写 db 配置的完整解决方案。