Đe thực hiện các Logic nghiệp vụ cho mỗi chức năng của ứng dụng, thông thường, phải thực hiện truy nhập tới nhiều đối tượng khác nhau trên máy chủ. Một vấn đề nảy sinh là việc truy nhập tới nhiều đối tượng thông qua nhiều lời gọi phương thức của các đối tượng này sẽ làm tăng trao đổi dừ liệu trên mạng. Việc bảo trì ứng dụng cũng trở nên khó khăn hơn do việc truy nhập dữ liệu và các qui trình xử lý bị phân mảnh.
Ví dụ, trong một ứng dụng ngân hàng trực tuyến, khi một Servlet nhận được một yêu cầu chuyển tiền từ một tài khoản này sang một tài khoản khác, Servlet phải thực
- 82 -
hiện kiêm tra quyền của người sử dụng, rút tiền từ Entity Bean của một tài khoản, chuyên tiền vào Entity Bean của tài khoản khác.
Hình 4-2: Chuyển tiền giữa các Entity Bean tài khoản
Trong biêu đô trên, các lời gọi các phương thức của các giao diện tại chồ và giao diện từ xa được thực hiện thông qua nhiều lời gọi qua mạng. Cách tiếp cận này sẽ không cho phép ứng dụng có thể phục vụ được một số lượng lớn người sử dụng bởi mỗi yêu cầu này đòi hỏi không dưới 6 lời gọi qua mạng với 3 lời gọi để tìm thành phần Entity Bean cần thiết và 3 lời gọi thực sự thực hiện việc chuyển tiền. Hơn thế nừa, các Entity Bean hoạt động trong các giao dịch. Vì vậy, mỗi lời gọi phương thức của Entity Bean đòi hỏi phải tạo một giao dịch riêng trên máy chủ và đòi hỏi phải đồng bộ dữ liệu của Entity Bean với dữ liệu được lưu trữ.
Ngoài ra, cách tiếp cận này cũng không bảo đảm tính toàn vẹn dữ liệu. Nếu có sự cố xảy ra sau khi thực hiện việc rút tiền và trước khi thực hiện việc chuyển tiền thì có nghĩa là khách hàng sẽ bị mất tiền do hai hoạt động này được thực hiện trên hai giao dịch độc lập nhau.
Một giải pháp cho vấn đề này là tạo dựng thêm các phương thức cho các Entity Bean đê thực hiện cho các yêu cầu khác nhau của người sử dụng. Nhưng giải pháp
này làm cho việc bảo trì ứng dụng trở nên hết sức khó khăn, bởi vì qua thời gian, các Entity Bean sẽ được sử dụng theo rất nhiều cách khác nhau. Neu mồi lần cần giải quyết vấn đề về tốc độ thực hiện lại phải thêm các phương thức mới vào các Entity Bean thì các Entity Bean sẽ ngày càng trở nên cồng kềnh hơn và khó hiểu hơn. Và khi đó, thực hiện việc sát nhập giữa logic của ứng dụng với việc quản lý dừ liệu. Đây là một thiết kế ứng dụng hoàn toàn không tốt.
Một giải pháp cho vấn đề này thường được sử dụng là bao gói tất cả các lời gọi tới Entity Bean bằng các Session Bean. Tất cả mọi lời gọi từ ứng dụng khách tới các Entity Bean sẽ được thực hiện thông qua các Session Bean. Phương pháp này được gọi là khuôn mầu Session Bao Ngoài.
Phương pháp này cho phép có thể che dấu mô hình đối tượng trên máy chủ đối với các máy khách. Hình vẽ sau đây cho thấy hiệu quả của phương pháp này cho việc giải quyết vấn đề đặt ra cho ví dụ nêu ở phần trên:
Hình 4-3: Tăng tốc độ với Session Bao Ngoài
Trong trường hợp này, toàn bộ chức năng chuyển tiền của ứng dụng được gọi
thông qua phương thức transferFund() của Session Bean. Thành phần Session Bean
- 8 4 -
Session Bean BankTeller và các Entity Bean cùng được đặt trên một máy chủ. Vì vậy, có thê cho Session Bean này truy nhập tới các Entity Bean hoàn toàn thông qua các giao diện cục bộ. Như vậy, sẽ giúp làm giảm các trao đổi dữ liệu trên mạng. Hơn thế nữa, mọi phương thức thực hiện thay đổi dữ liệu của các Entity Bean được thực hiện trong giao dịch được khởi tạo bởi Session Bean BankTeller. Do đó, toàn bộ hoạt động của chức năng này sẽ được gói gọn trong một giao dịch giúp đảm bảo được tính toàn vẹn của dữ liệu. [3]
Việc sử dụng Session Bao Ngoài giúp đem lại các lợi ích sau:
• Giảm trao đổi dữ liệu trên mạng: Việc thêm các Session Bean bên ngoài làm tăng các lớp của ứng dụng nhưng cho phép người sử dụng có thể thực hiện được mỗi chức năng của ứne dụng thông qua một lời gọi qua mạng duy nhất. Trên máy chủ các Session Bean thực hiện việc trao đổi cục bộ với Entity Bean vì vậy không đòi hỏi các trao đổi dừ liệu trên mạng. Như vậy, giải pháp này giúp giảm bớt được khối lượng dữ liệu cần trao đổi trên mạng
• Tách biệt rõ ràng giữa Logic nghiệp vụ và biểu diễn dừ liệu: Với việc sử dụng các Session Bao Ngoài, toàn bộ Logic nghiệp vụ được bao gói hoàn toàn bởi Session Bean. Các ứng dụng khách chỉ phải quan tâm đến việc biểu diễn dữ liệu. Toàn bộ việc trao đổi với Logic nghiệp vụ được thực hiện với đúng một lời gọi phương thức của thành phần EJB mà thôi. Như vậy, phần Logic nghiệp vụ và biểu diễn dừ liệu được hoàn toàn tách biệt nhau
• Đảm bảo tính toàn vẹn của dữ liệu: do các lời gọi phương thức làm thay đổi dữ liệu được thực hiện trong cùng một giao dịch.
• Tính sử dụng lại cao: như trong ví dụ trên Session Bean BankTeller có thể được truy nhập bởi nhiều loại ứng dụng khách khác nhau (JSP, Servlets, ...). Như vậy, toàn bộ logic của ứng dụng được thực hiện bởi Session Bean. Entity Bean chỉ thực hiện việc chứa dữ liệu và quản lý việc truy nhập dừ liệu. Như vậy, các Entity Bean này có thể được sử dụng lại cho nhiều
Session Bean khác nhau trong cùng ứng dụng hoặc trong các ứng dụng khác nhau.
Việc sử dụng Session Bao Ngoài trong kiến trúc MVC cho một kiến trúc của ứng dụng như sau: