2010-07-01 31 views
18

Ứng dụng web Java của tôi (myapp.war) ist được triển khai bằng cách đặt nó vào số webapps direcotry trên Tomcat trên Ubuntu 10.04.Ứng dụng web Java nên lưu trữ dữ liệu của nó ở đâu?

Ứng dụng này cần lưu một số dữ liệu trong tệp. Nhưng người dùng đang chạy Tomcat (tomcat6) không có quyền ghi vào thư mục chính /usr/share/tomcat6/ và không có quyền ghi vào thư mục làm việc hiện tại /var/lib/tomcat6/, vì cả hai đều thuộc về root.

Vậy ứng dụng web nên lưu trữ dữ liệu ở đâu? Tôi hy vọng nó không phải là kho lưu trữ được trích xuất trong direcotry webapps. Điều này có thể bị xóa rất dễ dàng do tai nạn. Và Tomcat có thể được cấu hình, không phải để trích xuất các tệp .war. Sau đó, sẽ không có trích xuất direcotry.

Có lẽ /var/lib/tomcat6/ nên thuộc về người dùng tomcat6 kiến ​​đây là lỗi trong Ubuntu?

+0

Không đảm bảo rằng vùng chứa web sẽ cho phép bạn sử dụng hệ thống tệp ... –

+0

Bạn đang cố gắng đọc dữ liệu hoặc ghi? Thông thường các ứng dụng web không sử dụng hệ thống tệp để lưu dữ liệu, chúng sử dụng DB, dịch vụ web hoặc hàng đợi JMS để giao tiếp với một hệ thống khác một cách đồng bộ hoặc không đồng bộ tương ứng. –

+0

Tôi cần đọc và ghi dữ liệu. Tôi có khung lưu trữ của riêng tôi, nó hoạt động tốt hơn nhiều so với bất kỳ cơ sở dữ liệu nào cho tôi. – Witek

Trả lời

2

Tôi đã tìm thấy giải pháp trên Launchpad. /var/lib/tomcat6/webapps/ có thể ghi. Điều này có nghĩa, rằng các công việc sau:

File myFile = new File("webapps/myfile.txt"); 
+1

Ok, nhưng đó có thể không phải là giải pháp di động (nó hoạt động với Tomcat, nhưng có thể không hoạt động nếu bạn chạy ứng dụng web của mình trên một máy chủ ứng dụng Java EE khác). – Jesper

+0

Và nó sẽ không hoạt động nếu bạn thay đổi thư mục làm việc (thư mục từ nơi lệnh bắt đầu Tomcat được phát hành). Sử dụng đường dẫn tương đối trong Java IO là một ý tưởng khủng khiếp. Thay vào đó sử dụng đường dẫn tuyệt đối trong Java IO như '/ var/lib/tomcat6/webapps/myfile.txt'. – BalusC

+0

Đường dẫn tuyệt đối sẽ ràng buộc tôi với Tomcat trên Linux. Tôi muốn cung cấp một tập tin .war mà chỉ cần được thả vào thư mục webapps trên gần như tất cả các nền tảng có thể. – Witek

0

Tôi chưa thấy bất kỳ hướng dẫn cụ thể nào về nơi bạn nên lưu trữ loại dữ liệu đó cục bộ - có thể vì bạn thường lưu trữ loại dữ liệu đó trong cơ sở dữ liệu.

Khi tôi cần lưu trữ dữ liệu nhanh chóng và bẩn như vậy, tôi lưu trữ dữ liệu đó trên một hệ thống tệp cụ thể cho dữ liệu đó, để tách nó khỏi các khu vực khác nơi nó có thể bị bắt trong hoạt động khác. Đã không có bất kỳ vấn đề với cách tiếp cận cho đến nay. Ngoài ra, nếu điều quan trọng, hãy đảm bảo bạn lưu trữ nó ở nơi bạn đang sao lưu :)

+1

Thậm chí nếu tôi lưu trữ dữ liệu trong cơ sở dữ liệu, tôi sẽ phải lưu trữ dữ liệu truy cập cho cơ sở dữ liệu ở đâu đó. – Witek

+0

Bạn có ý nghĩa gì với "truy cập dữ liệu"? – Dolph

+2

@Witek, Tomcat có thể cung cấp dữ liệu JDBC được định cấu hình sẵn thông qua JNDI. Cấu hình cho những người đi trong các tập tin cấu hình Tomcat thông thường. –

2

Tôi nghĩ điều đó phụ thuộc vào loại dữ liệu bạn đang xử lý. Hầu hết thời gian, dữ liệu đi vào cơ sở dữ liệu đơn giản chỉ vì nó nhanh và dễ thực hiện CRUD. Nếu bạn muốn lưu trữ cấu hình người dùng được bản địa hóa và bạn không quan tâm nó di động như thế nào, có lẽ bạn có thể lưu trữ dưới user.home, tôi đã làm điều đó cho một trong các dự án của tôi và hoạt động tốt. Tất cả những gì được nói, tôi thực sự không nghĩ rằng có bất kỳ thực hành tốt nhất về điều này và cơ sở dữ liệu có vẻ là sự lựa chọn rõ ràng nhất bởi vì bạn có thể làm rất nhiều nhiệm vụ khác nhau chống lại nó, và hầu hết trong số họ là miễn phí để bắt đầu. :)

+0

user.home không hoạt động. Trên Ubuntu nó thuộc về root. – Witek

4

Nếu các tập tin không cần phải kéo dài lâu hơn so với vòng đời của bối cảnh servlet, servlet container cung cấp một thư mục tạm thời tin cho từng bối cảnh servlet, theo quy định của javax.servlet.context.tempdir thuộc tính.

Xem Servlet Specification 2.3, Chương 3 Servlet Context

3.7.1 tạm thời làm việc Thư mục

Sự tiện lợi của một thư mục lưu trữ tạm thời là cần thiết cho mỗi bối cảnh servlet. Hộp chứa Servlet phải cung cấp thư mục tạm thời riêng lẻ mỗi ngữ cảnh servlet và làm cho nó có sẵn thông qua thuộc tính javax.servlet.context.tempdircontext . Các đối tượng liên quan đến thuộc tính phải có loại java.io.File

2

Trả lời câu hỏi của chính mình, Witek nói /var/lib/tomcat6/webapps/ is writable - ít nhất là trên cài đặt của mình phiên bản của ông Ubuntu. Trên RHEL 5 của tôi.2 hệ thống /var/lib/tomcat<X> thậm chí không tồn tại, do đó không có thư mục con webapps có thể ghi được hay không, dẫn đến câu trả lời của tôi.

Q: Ứng dụng web Java nên lưu trữ dữ liệu ở đâu?
A: Bất cứ nơi nào bạn đã định cấu hình để lưu trữ dữ liệu của nó.

Đặt cấu hình vị trí, trong web.xml dưới dạng <context-param> hoặc trong tệp myApplication.properties.

  • Tôi có thể đặt ở nơi tôi muốn trên hộp của mình, SysAdmins có thể đặt ở nơi họ muốn trên hệ thống sản xuất.
  • Bạn có thể đổi ý sau này.
  • Bạn không cần phải liên kết tượng trưng (mà kỳ diệu biến mất vào tôi trước, phá vỡ hệ thống.)
  • Bạn có thể có một vài bộ dữ liệu thử nghiệm, và chỉ cần trỏ cấu hình tại bất cứ một bạn muốn.
  • Bạn có thể đặt nó ở bất cứ đâu có dung lượng ổ đĩa.
  • Bạn sẽ thay đổi quyết định của bạn sau này.
+2

Cấu hình trong web.xml sẽ gây ra các sự cố lớn trong khi cập nhật. Mỗi chiến dịch mới được phát triển bởi các nhà phát triển sẽ ghi đè lên cấu hình quản trị viên. – Witek

+1

Đọc tệp myApplication.properties tùy chỉnh làm tăng sự cố, chúng tôi muốn tìm tệp. – Witek

Các vấn đề liên quan