2009-11-24 22 views
11

Tôi nên lưu trữ các tệp liên tục trong ứng dụng web Tomcat ở đâu?Vị trí/cách lưu trữ dữ liệu liên tục với tomcat?

  • javax.servlet.context.tempdir là không khả thi, nó bị xóa khi ứng dụng được tái triển khai/gỡ bỏ
  • Không muốn sử dụng một đường dẫn tuyệt đối trong ví dụ servlet init thông số
  • Lưu trữ các tập tin trong một cơ sở dữ liệu không phải là một lựa chọn
+2

Tôi lấy nó mà bạn không muốn sử dụng cơ sở dữ liệu? – Suppressingfire

+2

Bạn sẽ phải giải thích tại sao một cơ sở dữ liệu không phải là một lựa chọn, chúng rất cơ bản và phổ biến mà không cho phép nó chắc chắn có nghĩa là một cái gì đó khác đang xảy ra. Có lẽ bạn đang ở trong một môi trường đặc biệt hạn chế mà chúng ta nên biết. – Karl

+2

Nó không phải là một lựa chọn vì nó không phải. Tôi có thể tiếp tục giải thích cách các tệp lớn này cần được xử lý bởi các công cụ bên ngoài kế thừa không biết gì về cơ sở dữ liệu, và hiển thị chúng vào cơ sở dữ liệu chỉ vì mục đích kéo chúng ra ngoài một lần nữa phục vụ vào lúc này không có mục đích. Còn nhiều điều nữa, nhưng chỉ cần dùng từ ngữ của tôi cho nó :-) - – nos

Trả lời

9

Nhóm của chúng tôi thực hiện điều này rất nhiều. Quy tắc chung mà chúng tôi tuân theo nằm ngoài ứng dụng web và bên ngoài Tomcat.

Sysadmin của chúng tôi thiết lập thư mục trên máy chủ của chúng tôi mà người dùng tomcat có quyền truy cập vào (ví dụ: /var/tomcat/persist). Chúng tôi có một cấu trúc thư mục được xây dựng theo cách này mà tomcat sử dụng để lưu trữ tệp, đọc tệp init dành riêng cho ứng dụng, v.v.

Nếu bạn không muốn sử dụng đường dẫn tuyệt đối trong init-params cho servlet của mình, hãy xem xét thiết lập thuộc tính hệ thống khi khởi động tomcat. Điều tốt về điều đó là mọi ứng dụng chạy dưới tomcat sẽ có quyền truy cập vào nó. Điều xấu về điều đó là mọi ứng dụng chạy dưới tomcat sẽ có quyền truy cập vào nó. Bạn có thể đặt thuộc tính có tên là base.persist.dir và xây dựng các thư mục con cho mỗi ứng dụng bên dưới nó. Chúng tôi đặt thuộc tính hệ thống trong tập lệnh setenv.sh trong thư mục bin/ trong biến môi trường CATALINA_OPTS.

5

Trả lời câu tiêu đề của câu hỏi, những gì về việc sử dụng một cơ sở dữ liệu, một DataSource và JDNI? Ngay cả trong một bối cảnh web chỉ, bằng văn bản cho các tập tin bằng cách sử dụng java.io là không thực sự được đề nghị vì đồng thời, luồng, bảo mật, phân cụm, các vấn đề về tính di động. Một số trong những vấn đề này có thể được "workarounded" nhưng vẫn còn, đây không phải là thực sự là một thực hành tốt nhất. Cách tiếp cận tiêu chuẩn là sử dụng cơ sở dữ liệu và tôi khuyên bạn nên xem xét lại tùy chọn này, ném cơ sở dữ liệu nhẹ "dựa trên tệp" như HSQLBD hoặc JavaDB vào danh sách kết hợp.

(EDIT: Đối với một lý do không rõ, cơ sở dữ liệu không phải là một lựa chọn Sử dụng JNDI hoặc bối cảnh các thông số hoặc các thông số init để vượt qua một tuyệt đối đường - đó là những tùy chọn ít tồi tệ hơn IMHO - được loại trừ quá Đối với một tương đối.. đường dẫn, có thể xem user.home hoặc user.dir rồi - hoặc bất kỳ thuộc tính hệ thống nào khác mà bạn có thể chuyển trên dòng lệnh. Tôi không thích nó, tôi sẽ không làm điều đó và điều này không giải quyết được các vấn đề đã đề cập trước đó, nhưng đó là lựa chọn của bạn sau khi tất cả.)

+0

Làm rõ. Cơ sở dữ liệu không phải là một lựa chọn. – nos

0

Tôi thường đề xuất sử dụng cơ sở dữ liệu để lưu trữ dữ liệu liên tục và hiển thị dữ liệu thông qua DataSource.

Nếu bạn không muốn làm điều đó, tôi đoán bạn có thể xem xét sử dụng thuộc tính hệ thống "user.home" (Tôi đã thấy điều này được sử dụng trong một số trường hợp). Nhưng ... không có gì đảm bảo rằng servlet của bạn sẽ được chạy với sự cho phép để viết quyền truy cập trừ khi bạn cấu hình chính mình.

4

Lưu trữ các tệp trong thư mục webapp trong thư mục chính của người dùng đang chạy Tomcat là một tùy chọn tốt và thuận tiện. Nó nằm ngoài Tomcat, có nghĩa là nó sẽ tồn tại quá trình triển khai lại, và nó thường là một thư mục có thể ghi được (vì nó được tạo theo thư mục nhà của người dùng). Nhưng nó luôn luôn là một ý tưởng tốt để cho phép ghi đè vị trí của thư mục đó thông qua thuộc tính hệ thống.

1

Nói chung, điều này sẽ chuyển đến cơ sở dữ liệu.Nhưng kể từ khi OP khẳng định không sử dụng cơ sở dữ liệu, tôi sẽ thử một cách tiếp cận khác:

  • Đường dẫn hệ thống tệp được biết: ${user.home}/.myapp. Đôi khi, các ứng dụng sử dụng điều này cho ví dụ: chỉ mục tìm kiếm có thể được tính toán lại dựa trên dữ liệu trong cơ sở dữ liệu. Có thể không sao cho trường hợp sử dụng của bạn để sử dụng nhà của người dùng .
  • Lưu trữ đường dẫn hệ thống tệp có thể định cấu hình trong kho lưu trữ cấu hình chẳng hạn như cơ sở dữ liệu hoặc có lẽ Tùy chọn Java (nếu bạn không thích sử dụng tham số init servlet). Các ứng dụng thương mại như Atlassian JIRA sử dụng đường dẫn hệ thống tệp có thể định cấu hình (nhưng tuyệt đối), nơi chúng lưu trữ tệp đính kèm vấn đề. Nếu họ không biết cách nào tốt hơn, tôi không biết ai làm :)
+0

Ghi vào $ {user.home} trên tomcat7 (ít nhất là trên Ubuntu) sẽ dẫn đến một IOException do quyền. – Jonathan

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