Thật sự rất khó để biện minh cho một cái gì đó tái cấu trúc mà "tác phẩm" như vậy. Bạn dành rất nhiều công sức để trở lại nơi bạn bắt đầu.
Điều đó nói.
Chuyển đổi từ EJB 2.1 Phiên sang EJB 3 là khá tầm thường. Đối với chúng tôi, khi chúng tôi thực hiện chuyển đổi, hầu hết các EJB của chúng tôi được triển khai riêng biệt hơn là trong một EAR kết hợp. Nhưng bạn không có vấn đề đó. Ngay cả với EJB 3, bạn rất có thể vẫn có tệp ejb-jar.xml (hoặc tệp).
Nhưng, vẫn còn lợi ích, tôi nghĩ và chi phí rất thấp. Bạn có thể từng bước làm điều đó, đậu theo bean so với "tất cả cùng một lúc", điều này rất hay, đơn giản bằng cách di chuyển phần lớn thông tin trong các tệp ejb-jar.xml hiện tại vào các chú thích trong ứng dụng. Nếu không có gì khác, nó sẽ mang lại khả năng hiển thị (như yêu cầu giao dịch, v.v.) vào mã và không "ẩn đi" trong các tệp ejb-jar.xml.
Không có lý do gì để triển khai "tầng ứng dụng" trên một máy chủ/máy chủ riêng biệt. Lớp web có gọi là bean phiên từ xa không? vs Địa phương? Bạn có thể hoặc không thấy tốc độ bằng cách chuyển sang cuộc gọi cục bộ (nhiều triển khai "cùng nằm" có thể được thực hiện tương tự như lời gọi cục bộ trên một số máy chủ nếu được định cấu hình đúng, dunno nếu bạn đang thực hiện điều đó).
Rủi ro lớn nhất khi chuyển sang cục bộ là với cuộc gọi từ xa, các đối số của bạn "an toàn" không bị thay đổi, vì chúng được đăng trên mạng.Với ngữ nghĩa cục bộ, nếu bạn thay đổi giá trị của một đối số, có mục đích hay không, (tức là, thay đổi giá trị của một thuộc tính trong một bean), thay đổi đó sẽ được phản ánh trong người gọi. Điều đó có thể hoặc không có thể là một vấn đề. Nếu họ đã sử dụng ngữ nghĩa cuộc gọi cục bộ, ngay cả đối với một bean "từ xa", thì họ đã gặp sự cố này.
Đối với JPA và SQL, tôi sẽ để nguyên như vậy. Nó không đáng làm lại toàn bộ tầng dữ liệu thành swtich thành JPA và nếu bạn thực sự muốn các lợi ích của thời gian chạy JPA (so với thời gian phát triển), đặc biệt là bộ nhớ đệm, v.v ... thì bạn phải chuyển đổi lớp dữ liệu TOÀN BỘ (hoặc ít nhất là lớn) các phần của các phần liên quan) cùng một lúc. Thực sự nguy hiểm và dễ bị lỗi.
Đối với sự cố "trùng lặp lọ", đó là một tạo tác bao bì và xây dựng, không phải triển khai. Để khắc phục vấn đề mơ hồ, bạn cần phải làm việc trên môi trường phát triển của mình để sử dụng kho chứa jar được chia sẻ và nhận thức được thực tế là nếu bạn nâng cấp jar cho một, bạn sẽ nâng cấp nó cho tất cả. Mọi người giải thích rằng đó là một nhu cầu không hợp lý, buộc toàn bộ ứng dụng phải nâng cấp nếu một cái bình thay đổi. Đối với các ứng dụng khổng lồ, khác biệt, chắc chắn. Nhưng đối với các ứng dụng trong một JVM duy nhất, không, nó không phải. Nhiều như chúng tôi muốn mỗi một chút để trở thành một thế giới bị cô lập trong món súp đầy ắp, chúng tôi gọi là môi trường trình nạp lớp Java, nó đơn giản là không đúng sự thật. Và chúng ta càng có thể giữ cho đơn giản hơn, chúng ta càng tốt về mặt phức tạp và bảo trì. Đối với các lọ thông thường, bạn cân nhắc việc gộp các lọ đó vào máy chủ ứng dụng và ra khỏi ứng dụng. Tôi không thích cách tiếp cận đó, nhưng nó có nó sử dụng nếu bạn có thể làm cho nó làm việc cho bạn. Nó chắc chắn làm giảm kích thước triển khai.
Phía máy khách, không khó để chuyển đổi từ Struts 1 sang Struts 2, vì cả hai đều rất giống nhau ở mức cao (đáng chú ý là cả hai khung hành động). Chìa khóa ở đây là cả hai khuôn khổ có thể sống cạnh nhau với nhau, cho phép, một lần nữa, thay đổi gia tăng. Bạn có thể từ từ di chuyển mã cũ hơn hoặc bạn chỉ có thể triển khai mã mới trong khung công tác mới. Điều này khác với việc cố gắng trộn và kết hợp một khung hành động và một khung thành phần. Đó là nghĩa đen là một "chó và mèo, sống chung với nhau" tình hình. Nếu tôi đi tuyến đường đó, tôi chỉ đơn giản là triển khai các thành phần trong WAR của riêng họ và tiếp tục. Việc quản lý nhà nước của các khung thành phần làm cho hoạt động tương tác với chúng ở mặt sau thực sự rắc rối. Nếu bạn chọn thực hiện thông qua một WAR mới, hãy chắc chắn bạn dành một chút thời gian làm một số loại "Đăng nhập một lần" để mọi người "đăng nhập" vào từng mô-đun thích hợp. Miễn là các ứng dụng không chia sẻ bất kỳ trạng thái phiên nào, điều này là xa như sự tích hợp thực sự cần phải đi. Và một khi bạn đã chọn để thêm một hệ thống con mới thông qua một WAR mới, bạn có thể sử dụng bất kỳ công nghệ nào bạn muốn cho phía máy khách.
Caching là một vấn đề khác. Các bộ đệm khác nhau giải quyết các vấn đề khác nhau. Đó là một điều để lưu trữ và ghi nhớ một số bit nhỏ trong hệ thống (như kết xuất JSP) hoặc sử dụng bộ nhớ cache được phân phối để truyền các phiên qua dụ trong quá trình chuyển đổi dự phòng hoặc cân bằng tải. Nó khá khác để có một lớp tên miền dựa trên bộ nhớ cache, nơi sự kiên trì và bộ nhớ đệm được tích hợp rất chặt chẽ. Điều đó phức tạp hơn nhiều. Chỉ cần giữ nó thẳng trong đầu là đau đớn.
Trước đây, bạn có thể sử dụng nhiều ứng dụng khi bạn gặp phải nhu cầu, và những loại cache này có thể đứng yên một mình chứ không phải là một phần của khung đệm lưu trữ được điều phối.
Loại thứ hai, là khác nhau. Ở đó, bạn cần phải làm lại toàn bộ mô hình dữ liệu của mình, ngay cả đối với các phần mà bạn không lưu vào bộ đệm, vì bạn muốn đảm bảo rằng bạn có quyền truy cập nhất quán vào dữ liệu và chế độ xem bộ nhớ cache của nó. Đây là những gì JPA có hiệu quả, với hai cấp độ bộ nhớ đệm của nó, và tại sao tôi đã đề cập trước đó, nó không phải là thứ bạn có thể tình cờ lọt vào một ứng dụng, tiết kiệm cho phần lớn các hệ thống của bạn. Khi bạn có các mô-đun riêng biệt nhấn cùng một tài nguyên phụ trợ, tính nhất quán của bộ nhớ cache và tính nhất quán sẽ trở thành một vấn đề thực sự, và đó là lý do tại sao bạn muốn những thứ đó được tích hợp trên cả hai hệ thống.
Tâm trí, nó có thể được thực hiện. Bí quyết đơn giản là tích hợp mức truy cập dữ liệu, và sau đó bạn có thể bắt đầu bộ nhớ đệm ở cấp đó. Nhưng nếu bạn có folks thực hiện cuộc gọi SQL trực tiếp, những người phải đi.
Cuối cùng, tôi nghĩ thuật ngữ sử dụng là tiến hóa chứ không phải cuộc cách mạng. Di chuyển sang EJB 3 hoặc 3.1 Tôi không nghĩ rằng phải đau đớn, vì nó khá nhiều Chỉ cần làm việc với EJB 2.1, đó là một lợi ích. Bạn CÓ THỂ có một môi trường "hỗn hợp". Sự tích hợp đau đớn nhất sẽ là nếu bạn sử dụng đậu thực thể, nhưng bạn đã không làm vậy, vì vậy điều đó tốt. Và đối với tất cả những người dùng eJB, khả năng tương thích ngược này trải dài, những gì, gần 10 năm của EJB, là những gì cho phép bạn thực sự giữ một số lượng lớn mã của bạn nhưng vẫn tiếp tục.
Cảm ơn bạn đã trả lời hữu ích. Của bạn và "lội vào mùa xuân" bài bổ sung cho nhau và giải quyết các lĩnh vực quan tâm của chúng tôi. Đối với 'từ xa' so với 'cục bộ', tôi có một chút không rõ ràng. Trong thực tế tất cả các cuộc gọi là địa phương - bởi vì Jboss xử lý các cuộc gọi ejb trong cùng một vm như địa phương. Tôi không lường trước được việc đưa ejb vào vm riêng biệt như tầng web. Chúng tôi sẽ xem xét vấn đề và triển khai 'trùng lặp' của chúng tôi. AFAIK và IIRC các phiên bản trước đó mơ hồ về các lọ jars và jear. (Jboss có mô hình 'flatclassloader' của nó xử lý mọi bình trong tai/chiến tranh bằng nhau. Nhưng đó là một chủ đề khác) – user331465
Yea, Glassfish cũng có " một mô hình một trình nạp lớp trên mỗi EAR, với mô hình "một cho mỗi WAR" là một tùy chọn. Đây là một vấn đề thực sự khi tôi cố gắng kết hợp hai WAR trong cùng một EAR. Thông số EJB không xác định hành vi theo cách này hay cách khác, vì vậy cả hai mô hình đều "tuân thủ", nhưng tôi coi đây là lỗ khi ứng dụng được xây dựng trong hai môi trường khác nhau không thực sự hoán đổi cho nhau, ngay cả khi cả hai được mã hóa " spec ". –
+1 vì câu trả lời này chỉ nhận được 1 lần cập nhật khác tại thời điểm này. –