java - Spring中如何使用Tomcat提供的JNDI DataSource?

标签 java spring tomcat datasource jndi

据说在Spring javadoc关于DriverManagerDataSource类的文章中,这个类很简单,值得推荐

to use a JNDI DataSource provided by the container. Such a DataSource can be exposed as a DataSource bean in a Spring ApplicationContext via JndiObjectFactoryBean

问题是:我该如何做到这一点?

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

最佳答案

如果使用 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 的 default 数据源资源池设置的属性名称发生了一些变化。

关于java - Spring中如何使用Tomcat提供的JNDI DataSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9183321/

相关文章:

java - 在 @Scheduled 注解中注入(inject) bean 属性

java - 无法编译我的代码

java - Spring:Tomcat 响应中的 HTTP 状态 406

java - Tomcat 和接受的最大请求数

java - 删除 JAR 时 Tomcat 6 中的 ClassNotFoundException

tomcat - SpringSource 工具套件 : How to get my project to run on Tomcat 5. 5/Java 5?

java - 运行 'mvn package' 命令时 Maven 不工作

java - 确保对象始终是列表的成员?

java - Spring启动java.lang.ClassNotFoundException : org. hibernate.engine.jndi.JndiException

java - Spring Security fullyAuthenticated() 和 hasRole ("ADMIN")