Spring DataSource JNDI 的 Tomcat配置示例

欢迎使用Spring DataSource JNDI Tomcat示例教程。之前我们看到了如何使用Spring JDBC集成实现数据库操作。但是,大多数情况下企业应用程序都部署在一个servlet容器中,例如Tomcat,JBoss等。

目录[ 隐藏 ]

  • 1 Spring DataSource

    • 1.1数据库设置
    • 1.2 Spring DataSource MVC项目
    • 1.3 Spring JDBC和Jackson依赖项
    • 1.4模型类
    • 1.5弹簧控制器类
    • 1.6 Spring Bean配置
    • 1.7 Tomcat DataSource JNDI配置
    • 1.8运行Spring DataSource JNDI示例项目

Spring DataSource

我们知道带有JNDI的DataSource是实现连接池并获得容器实现优势的首选方式。今天我们将看看如何配置Spring Web应用程序以使用Tomcat提供的JNDI连接。

对于我的例子,我将使用MySQL数据库服务器并创建一个包含一些行的简单表。我们将创建一个Spring Rest Web服务,该服务将返回JSON响应,其中包含表中所有数据的列表。

数据库设置


CREATE TABLE `Employee` (`id` int(11) unsigned NOT NULL,`name` varchar(20) DEFAULT NULL,`role` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `Employee` (`id`, `name`, `role`)
VALUES(1, 'Pankaj', 'CEO'),(2, 'David', 'Manager');
commit;

Spring DataSource MVC项目

在Spring Tool Suite中创建一个Spring MVC项目,以便我们的spring应用程序框架代码准备就绪。一旦我们完成了我们的实现,我们的项目结构将如下图所示。

Spring JDBC和Jackson Dependencies

我们将不得不将Spring JDBC,Jackson和MySQL Database驱动程序添加为pom.xml文件中的依赖项。我的最终pom.xml文件如下所示。


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.journaldev.spring</groupId><artifactId>SpringDataSource</artifactId><name>SpringDataSource</name><packaging>war</packaging><version>1.0.0-BUILD-SNAPSHOT</version><properties><java-version>1.6</java-version><org.springframework-version>4.0.2.RELEASE</org.springframework-version><org.aspectj-version>1.7.4</org.aspectj-version><org.slf4j-version>1.7.5</org.slf4j-version><jackson.databind-version>2.2.3</jackson.databind-version></properties><dependencies><!-- Spring JDBC Support --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${org.springframework-version}</version></dependency><!-- MySQL Driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.0.5</version></dependency><!-- Jackson --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.databind-version}</version></dependency><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${org.springframework-version}</version><exclusions><!-- Exclude Commons Logging in favor of SLF4j --><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${org.springframework-version}</version></dependency><!-- AspectJ --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>${org.aspectj-version}</version></dependency>   <!-- Logging --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${org.slf4j-version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${org.slf4j-version}</version><scope>runtime</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${org.slf4j-version}</version><scope>runtime</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.15</version><exclusions><exclusion><groupId>javax.mail</groupId><artifactId>mail</artifactId></exclusion><exclusion><groupId>javax.jms</groupId><artifactId>jms</artifactId></exclusion><exclusion><groupId>com.sun.jdmk</groupId><artifactId>jmxtools</artifactId></exclusion><exclusion><groupId>com.sun.jmx</groupId><artifactId>jmxri</artifactId></exclusion></exclusions><scope>runtime</scope></dependency><!-- @Inject --><dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version></dependency><!-- Servlet --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- Test --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.7</version><scope>test</scope></dependency>        </dependencies><build><plugins><plugin><artifactId>maven-eclipse-plugin</artifactId><version>2.9</version><configuration><additionalProjectnatures><projectnature>org.springframework.ide.eclipse.core.springnature</projectnature></additionalProjectnatures><additionalBuildcommands><buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand></additionalBuildcommands><downloadSources>true</downloadSources><downloadJavadocs>true</downloadJavadocs></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><source>1.6</source><target>1.6</target><compilerArgument>-Xlint:all</compilerArgument><showWarnings>true</showWarnings><showDeprecation>true</showDeprecation></configuration></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>1.2.1</version><configuration><mainClass>org.test.int1.Main</mainClass></configuration></plugin></plugins></build>
</project>

如果您不熟悉Rest in Spring,请阅读Spring Restful Webservice示例。

模型类

我们在Employee表之后建模的Employee bean如下所示。


package com.journaldev.spring.jdbc.model;import java.io.Serializable;public class Employee implements Serializable{private static final long serialVersionUID = -7788619177798333712L;private int id;private String name;private String role;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getRole() {return role;}public void setRole(String role) {this.role = role;}}

Spring 控制器类

我们的简单控制器类如下所示。


package com.journaldev.spring.jdbc.controller;import java.util.ArrayList;
import java.util.List;
import java.util.Map;import javax.sql.DataSource;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import com.journaldev.spring.jdbc.model.Employee;/*** Handles requests for the Employee JDBC Service.*/
@Controller
public class EmployeeController {private static final Logger logger = LoggerFactory.getLogger(EmployeeController.class);@Autowired@Qualifier("dbDataSource")private DataSource dataSource;public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}@RequestMapping(value = "/rest/emps", method = RequestMethod.GET)public @ResponseBody List<Employee> getAllEmployees() {logger.info("Start getAllEmployees.");List<Employee> empList = new ArrayList<Employee>();//JDBC Code - StartString query = "select id, name, role from Employee";JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);List<Map<String,Object>> empRows = jdbcTemplate.queryForList(query);for(Map<String,Object> empRow : empRows){Employee emp = new Employee();emp.setId(Integer.parseInt(String.valueOf(empRow.get("id"))));emp.setName(String.valueOf(empRow.get("name")));emp.setRole(String.valueOf(empRow.get("role")));empList.add(emp);}return empList;}}

关于Controller类的重点是:

  • DataSource将通过名为dbDataSource的Spring Bean配置连接。
  • 我们使用JdbcTemplate来避免资源泄漏等常见错误并删除JDBC样板代码。
  • 检索Employee列表的URI将是http:// {host}:{port} / SpringDataSource / rest / emps
  • 我们使用@ResponseBody发送Employee对象列表作为响应,Spring将负责将其转换为JSON。

Spring Bean配置

我们可以通过两种方式查找JNDI并将其连接到Controller DataSource,我的spring bean配置文件包含它们,但其中一个被注释。您可以在这些之间切换,响应也是一样的。

  1. 使用jee namespace标签执行JNDI查找并将其配置为Spring Bean。在这种情况下,我们还需要包含jee名称空间和模式定义。
  2. org.springframework.jndi.JndiObjectFactoryBean通过传递JNDI上下文名称来创建类型的bean 。jndiName是此配置的必需参数。

我的spring bean配置文件如下所示。


<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"xmlns:jee="http://www.springframework.org/schema/jee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --><!-- Enables the Spring MVC @Controller programming model --><annotation-driven /><!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --><resources mapping="/resources/**" location="/resources/" /><!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --><beans:beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><beans:property name="prefix" value="/WEB-INF/views/" /><beans:property name="suffix" value=".jsp" /></beans:bean><!-- Configure to plugin JSON as request and response in method handler --><beans:beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><beans:property name="messageConverters"><beans:list><beans:ref bean="jsonMessageConverter" /></beans:list></beans:property></beans:bean><!-- Configure bean to convert JSON to POJO and vice versa --><beans:bean id="jsonMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></beans:bean><!-- Create DataSource Bean --><beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean"><beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/></beans:bean><!-- using JEE namespace for lookup --><!-- <jee:jndi-lookup id="dbDataSource" jndi-name="jdbc/MyLocalDB"expected-type="javax.sql.DataSource" />--><context:component-scan base-package="com.journaldev.spring.jdbc.controller" /></beans:beans>

Tomcat DataSource JNDI配置

现在我们已完成项目,最后一部分是在Tomcat容器中执行JNDI配置以创建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"/>

在server.xml文件的GlobalNamingResources部分中添加以上配置。


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

我们还需要创建Resource Link以在我们的应用程序中使用JNDI配置,这是将其添加到服务器context.xml文件中的最佳方式。

请注意,ResourceLink名称应与我们在应用程序中使用的JNDI上下文名称匹配。还要确保tomcat lib目录中存在MySQL jar,否则tomcat将无法创建MySQL数据库连接池。

运行Spring DataSource JNDI示例项目

我们的项目和服务器配置已完成,我们已准备好进行测试。将项目导出为WAR文件并将其放在tomcat部署目录中。

Rest调用的JSON响应如下图所示。

这就是Spring与servlet容器JNDI上下文集成的全部内容,从下面的链接下载示例项目并使用它来了解更多信息。

下载Spring DataSource JNDI项目

转载来源:https://www.journaldev.com/2597/spring-datasource-jndi-with-tomcat-example

Spring DataSource JNDI - Tomcat JNDI 配置示例相关推荐

  1. java tomcat jndi,Tomcat JNDI 资源

    JNDI 资源 本章概述 Tomcat 为每个在其上运行的 Web 应用都提供了一个 JNDI 的 InitialContext 实现实例,它与Java 企业版应用服务器所提供的对应类完全兼容.Jav ...

  2. Spring Boot application.properties 常用配置

    SPRING CONFIG (ConfigFileApplicationListener) spring.config.name 配置文件名称,默认为application spring.config ...

  3. Spring Boot Jpa多数据源配置

    2019独角兽企业重金招聘Python工程师标准>>> 前言 随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,如:user一个库,busine ...

  4. 启动错误:Could not resolve placeholder 'spring.datasource.url' in value ${spring.datasource.url}

    项目启动报错:Could not resolve placeholder 'spring.datasource.url' in value "${spring.datasource.url} ...

  5. (十九)Alian 的 Spring Cloud Config 集群配置

    目录 一.简介 1.1.第一步 二.maven依赖 三.配置 3.1.application.properties 3.2.主类 四.客户端修改(支付系统) 4.1 maven依赖 4.2 支付系统主 ...

  6. tomcat中配置jndi数据源以便spring获取

    [0]README 0)intro to jndi, plase visit intro to jndi: 1)本文译自 Configuring Spring MVC JdbcTemplate wit ...

  7. Hibernate Tomcat JNDI DataSource示例教程

    Hibernate Tomcat JNDI DataSource示例教程 欢迎来到Hibernate Tomcat JNDI DataSource示例教程.我们已经看到如何在独立的Java应用程序中使 ...

  8. spring配置jndi_在Spring Framework中通过JNDI进行配置

    spring配置jndi 从某个时候开始,应用程序必须是可配置的. 从第一个版本0.9开始,Spring Framework就为该问题提供了一个很好的辅助工具,该类为PropertyPlacehold ...

  9. 在Spring Framework中通过JNDI进行配置

    从某个时候开始,应用程序必须是可配置的. 自第一个版本0.9起,Spring Framework就为该问题提供了一个很好的辅助工具,该类为PropertyPlaceholderConfigurer类, ...

最新文章

  1. C API向MySQL插入批量数据的快速方法——关于mysql_autocommit
  2. 模板网站建设过程中需要注意哪些细节问题?
  3. bootstrap中图片的一些小事情
  4. 网络协议:HTTPS
  5. STM系列单片机中文参考手册下载方法
  6. ubuntu 18.10增加和设置Swap交换分区
  7. 累累白骨下,共享单车的困局
  8. BirtViewer和Struts2框架的整合
  9. zabbix数据库优化
  10. SIM300命令参考
  11. access百度翻译 get_求助,百度翻译后我还是不知道怎么解决这个问题
  12. 浅谈Redisson底层源码
  13. python量化策略——改进的美林时钟轮动策略(二)
  14. 超级节点MLN012-算法作曲
  15. oracle enlisttransaction,WAS运行时抛出的两种异常,经过google找到解决方案,记录以备案...
  16. 开放集识别之GPD and GEV Classi ers
  17. 解决给word中表格设置“跨页断行”后出现大片空白
  18. 如何优化你在百度搜索中的排行
  19. 【自考必看】《信息资源管理》信息化规划与组织,第2章
  20. 硬盘数据恢复软件 去限制版

热门文章

  1. Memcache安全性
  2. 你所不知的 CSS ::before 和 ::after 伪元素用法
  3. 浅谈ajax中get与post的区别,以及ajax中的乱码问题的解决方法
  4. 神奇的python(二)之python打包成应用程序
  5. 【AI视野·今日Robot 机器人论文速览 第二十一期】Fri, 24 Sep 2021
  6. 【shell资源限制】RLIMIT_MEMLOCK too small
  7. 【tfcoreml】tensorflow向CoreML模型的转换工具封装
  8. java循环嵌套 0228 2101班
  9. 演练 宠物店挑小动物 java 1615136001
  10. 接口成员的特点 java 1614101629