Hướng dẫn tích hợp Spring DataSource JNDI với Tomcat
5 phút đọc18/07/2025
Chris Pham
Technical Writer
0 lượt xem
0 lượt xem
Reading Time: 5minutes
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,…
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.
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.
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
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.
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.
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.
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
{"success":true,"head":"<title>Hướng dẫn tích hợp Spring DataSource JNDI với Tomcat - CyStack Tutorial</title>\n<meta name=\"description\" content=\"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\"/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-video-preview:-1, max-image-preview:large\"/>\n<link rel=\"canonical\" href=\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"Hướng dẫn tích hợp Spring DataSource JNDI với Tomcat - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"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\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Chuyên gia\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/18152511/tich-hop-spring-datasource-jndi.png\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/18152511/tich-hop-spring-datasource-jndi.png\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"tích hợp Spring DataSource JNDI\" />\n<meta property=\"og:image:type\" content=\"image/png\" />\n<meta property=\"article:published_time\" content=\"2025-07-18T15:26:08+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"Hướng dẫn tích hợp Spring DataSource JNDI với Tomcat - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"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\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/18152511/tich-hop-spring-datasource-jndi.png\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Chris Pham\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"12 minutes\" />\n<script type=\"application/ld+json\" class=\"rank-math-schema\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://blog.cystack.org/tutorial/#person\",\"name\":\"CyStack Tutorial\"},{\"@type\":\"WebSite\",\"@id\":\"https://blog.cystack.org/tutorial/#website\",\"url\":\"https://blog.cystack.org/tutorial\",\"name\":\"CyStack Tutorial\",\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https://s2.cystack.net/tutorial/18152511/tich-hop-spring-datasource-jndi.png\",\"url\":\"https://s2.cystack.net/tutorial/18152511/tich-hop-spring-datasource-jndi.png\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"t\\u00edch h\\u1ee3p Spring DataSource JNDI\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":\"1\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":\"2\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/category/chuyen-gia/\",\"name\":\"Chuy\\u00ean gia\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/\",\"name\":\"H\\u01b0\\u1edbng d\\u1eabn t\\u00edch h\\u1ee3p Spring DataSource JNDI v\\u1edbi Tomcat\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/\",\"name\":\"H\\u01b0\\u1edbng d\\u1eabn t\\u00edch h\\u1ee3p Spring DataSource JNDI v\\u1edbi Tomcat - CyStack Tutorial\",\"datePublished\":\"2025-07-18T15:26:08+07:00\",\"dateModified\":\"2025-07-18T15:26:08+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/18152511/tich-hop-spring-datasource-jndi.png\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\",\"url\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"caption\":\"Chris Pham\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"H\\u01b0\\u1edbng d\\u1eabn t\\u00edch h\\u1ee3p Spring DataSource JNDI v\\u1edbi Tomcat - CyStack Tutorial\",\"keywords\":\"Spring DataSource JNDI,DataSource JNDI,t\\u00edch h\\u1ee3p DataSource JNDI\",\"datePublished\":\"2025-07-18T15:26:08+07:00\",\"dateModified\":\"2025-07-18T15:26:08+07:00\",\"articleSection\":\"Chuy\\u00ean gia\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"Ch\\u00e0o m\\u1eebng b\\u1ea1n \\u0111\\u1ebfn v\\u1edbi h\\u01b0\\u1edbng d\\u1eabn t\\u00edch h\\u1ee3p Spring DataSource JNDI v\\u1edbi Tomcat. Tr\\u01b0\\u1edbc \\u0111\\u00f3, ch\\u00fang ta \\u0111\\u00e3 t\\u00ecm hi\\u1ec3u c\\u00e1ch th\\u1ef1c hi\\u1ec7n c\\u00e1c thao t\\u00e1c v\\u1edbi c\\u01a1 s\\u1edf d\\u1eef li\\u1ec7u b\\u1eb1ng\",\"name\":\"H\\u01b0\\u1edbng d\\u1eabn t\\u00edch h\\u1ee3p Spring DataSource JNDI v\\u1edbi Tomcat - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/18152511/tich-hop-spring-datasource-jndi.png\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/2025/07/18/tich-hop-spring-datasource-jndi/#webpage\"}}]}</script>\n"}