CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Mục lục

Trang chủBlogHướng dẫn tích hợp Spring...
Chuyên gia

Hướng dẫn tích hợp Spring DataSource JNDI với Tomcat

5 phút đọc18/07/2025
CyStack Author
Chris Pham

Technical Writer

0 lượt xem
Reading Time: 5 minutes

Chào mừng bạn đến với hướng dẫn tích hợp Spring DataSource JNDI với Tomcat. Trước đó, chúng ta đã tìm hiểu cách thực hiện các thao tác với cơ sở dữ liệu bằng cách tích hợp Spring JDBC. Tuy nhiên, trong hầu hết các trường hợp, các ứng dụng doanh nghiệp thường được triển khai trên các servlet container như Tomcat, JBoss,…

tích hợp Spring DataSource JNDI

Spring DataSource JNDI

Chúng ta đều biết rằng sử dụng DataSource với JNDI là cách ưu tiên để đạt được connection pooling và tận dụng lợi ích từ các container. Hôm nay, chúng ta sẽ cùng tìm hiểu cách cấu hình một ứng dụng web Spring để sử dụng kết nối JNDI do Tomcat cung cấp. Trong ví dụ này, tôi sẽ sử dụng MySQL làm máy chủ cơ sở dữ liệu và tạo một bảng đơn giản với một số dòng dữ liệu. Chúng ta sẽ xây dựng một dịch vụ web Spring Rest trả về dữ liệu dưới dạng JSON.

Thiết lập cơ sở dữ liệu

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;

Dự án Spring DataSource MVC

Tạo một dự án Spring MVC trong Spring Tool Suite để khởi tạo bộ khung ứng dụng Spring. Sau khi hoàn thành việc triển khai, cấu trúc dự án của chúng ta sẽ giống như hình ảnh bên dưới.

Spring JDBC và Jackson Dependencies

Chúng ta cần thêm các dependency cho Spring JDBC, Jackson và MySQL Database driver trong file pom.xml. File pom.xml cuối cùng của tôi trông như sau.



	4.0.0
	com.journaldev.spring
	SpringDataSource
	SpringDataSource
	war
	1.0.0-BUILD-SNAPSHOT
	
		1.6
		4.0.2.RELEASE
		1.7.4
		1.7.5
		2.2.3
	
	
		
		
			org.springframework
			spring-jdbc
			${org.springframework-version}
		
		
		
		
			mysql
			mysql-connector-java
			5.0.5
		
		
		
			com.fasterxml.jackson.core
			jackson-databind
			${jackson.databind-version}
		
		
		
			org.springframework
			spring-context
			${org.springframework-version}
			
				
				
					commons-logging
					commons-logging
				 
			
		
		
			org.springframework
			spring-webmvc
			${org.springframework-version}
		
				
		
		
			org.aspectj
			aspectjrt
			${org.aspectj-version}
			
		
		
		
			org.slf4j
			slf4j-api
			${org.slf4j-version}
		
		
			org.slf4j
			jcl-over-slf4j
			${org.slf4j-version}
			runtime
		
		
			org.slf4j
			slf4j-log4j12
			${org.slf4j-version}
			runtime
		
		
			log4j
			log4j
			1.2.15
			
				
					javax.mail
					mail
				
				
					javax.jms
					jms
				
				
					com.sun.jdmk
					jmxtools
				
				
					com.sun.jmx
					jmxri
				
			
			runtime
		

		
		
			javax.inject
			javax.inject
			1
		
				
		
		
			javax.servlet
			servlet-api
			2.5
			provided
		
		
			javax.servlet.jsp
			jsp-api
			2.1
			provided
		
		
			javax.servlet
			jstl
			1.2
		
	
		
		
			junit
			junit
			4.7
			test
		        
	
    
        
            
                maven-eclipse-plugin
                2.9
                
                    
                        org.springframework.ide.eclipse.core.springnature
                    
                    
                        org.springframework.ide.eclipse.core.springbuilder
                    
                    true
                    true
                
            
            
                org.apache.maven.plugins
                maven-compiler-plugin
                2.5.1
                
                    1.6
                    1.6
                    -Xlint:all
                    true
                    true
                
            
            
                org.codehaus.mojo
                exec-maven-plugin
                1.2.1
                
                    org.test.int1.Main
                
            
        
    

Nếu bạn chưa quen với Rest trong Spring, vui lòng đọc bài viết Spring Restful Webservice Example.

Lớp Model

Bean Employee của chúng ta được mô phỏng theo bảng Employee, trông như sau.

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;
	}
	
	
}

Lớp Controller trong Spring

Lớp controller đơn giản của chúng ta trông như sau.

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 getAllEmployees() {
		logger.info("Start getAllEmployees.");
		List empList = new ArrayList();
		//JDBC Code - Start
		String query = "select id, name, role from Employee";
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

		List> empRows = jdbcTemplate.queryForList(query);
		
		for(Map 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;
	}

}

Một số điểm quan trọng về lớp Controller:

  • DataSource sẽ được Spring cấu hình và inject thông qua bean có tên dbDataSource.
  • Chúng ta sử dụng JdbcTemplate để tránh những lỗi phổ biến như rò rỉ tài nguyên và loại bỏ phần code mẫu (boilerplate) trong JDBC.
  • URI để truy xuất danh sách Employee sẽ là: https://{host}:{port}/SpringDataSource/rest/emps
  • Chúng ta sử dụng @ResponseBody để trả về danh sách đối tượng Employee dưới dạng phản hồi. Spring sẽ tự động chuyển đổi nó thành JSON.

Cấu hình Spring Bean

Có hai cách để thực hiện tra cứu JNDI và liên kết nó với DataSource trong Controller. File cấu hình Spring Bean của tôi chứa cả hai cách, nhưng một trong số đó được comment. Bạn có thể chuyển đổi qua lại giữa hai cách này và kết quả phản hồi sẽ giống nhau.

  1. Sử dụng thẻ jee trong namespace để thực hiện tra cứu JNDI và cấu hình như một Spring Bean. Trong trường hợp này, chúng ta cũng cần khai báo namespace và schema tương ứng cho jee.
  2. Tạo một bean kiểu org.springframework.jndi.JndiObjectFactoryBean bằng cách truyền vào tên context JNDI. jndiName là tham số bắt buộc trong cấu hình này.

File cấu hình Spring Bean của tôi trông như sau.




	

	
	

	
	

	
	
		
		
	

	
	
		
			
				
			
		
	

	
	
	
	
	
	 
	
    	
	
	 
	 
	 
	  
	


Cấu hình Spring DataSource JNDI trong Tomcat

Bây giờ dự án đã hoàn tất, bước cuối cùng là cấu hình JNDI trong container Tomcat để tạo resource JNDI.


Thêm cấu hình trên vào phần GlobalNamingResources trong file server.xml.


Chúng ta cũng cần tạo một ResourceLink để ứng dụng sử dụng cấu hình JNDI, cách tốt nhất là thêm nó vào file context.xml của Tomcat. Lưu ý rằng tên của ResourceLink phải khớp với tên context JNDI mà chúng ta sử dụng trong ứng dụng. Ngoài ra, hãy đảm bảo rằng file jar của MySQL có trong thư mục lib của Tomcat, nếu không Tomcat sẽ không thể tạo pool kết nối đến cơ sở dữ liệu MySQL.

Chạy dự án Spring DataSource JNDI

Dự án và cấu hình máy chủ của chúng ta đã hoàn tất, giờ có thể tiến hành kiểm tra. Xuất dự án dưới dạng file WAR và đặt nó vào thư mục triển khai của Tomcat. Phản hồi JSON cho lời gọi Rest được hiển thị trong hình dưới đây.

Vậy là xong phần tích hợp Spring với JNDI context của servlet container. Tải về dự án mẫu từ liên kết bên dưới và thử nghiệm để hiểu thêm.

Tải dự án Spring DataSource JNDI

Về tác giả

Chris Pham
Chris PhamTechnical Writer

I have over 5 years of experience writing technical documentation for tech products, making them accessible and user-friendly. My focus is always on providing clear and precise information. @#@ Tôi đã có hơn 5 năm kinh nghiệm viết tài liệu kỹ thuật cho các sản phẩm công nghệ, giúp người dùng dễ dàng tiếp cận và sử dụng. Tôi luôn tập trung vào việc cung cấp thông tin chính xác và dễ hiểu.

Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn

Thảo luận (0)

Đăng nhập để thảo luận

Bài viết liên quan