2011-06-28 63 views
5

Khi xây dựng trang web, người ta phải quyết định cách lưu trữ thông tin phiên, khi người dùng đăng nhập.Ưu điểm/khuyết điểm của việc lưu trữ dữ liệu phiên trong tệp so với cơ sở dữ liệu là gì?

Ưu và khuyết điểm của việc lưu trữ mỗi phiên trong tệp riêng của nó so với lưu trữ trong cơ sở dữ liệu là gì?

+1

Để rõ ràng, ngôn ngữ như PHP lưu trữ phiên trong tệp theo mặc định, bên trong/tmp. Tuy nhiên, các tệp này được quản lý bởi thời gian chạy, bạn sẽ không bao giờ cần truy cập phiên làm việc theo cách bạn sẽ truy cập tệp. RoR sử dụng cookie theo mặc định, một lần nữa, dựa trên tệp nhưng không được xử lý như vậy. –

Trả lời

2

Tôi thường không lưu trữ thông tin này trong tệp - bạn có nguy cơ có khả năng hoán đổi tệp này vào và ra khỏi bộ nhớ (có thể lưu vào bộ nhớ), nhưng tôi muốn sử dụng cơ chế bộ nhớ được thiết kế như vậy và sau đó bạn đang sử dụng một cái gì đó tương đối không chuẩn. Trong ASP.Net

  1. bạn có thể sử dụng trong trong bộ sưu tập bộ nhớ đó là tốt để sử dụng trên một máy chủ duy nhất. nếu bạn cần nhiều máy chủ web cân bằng tải (trang trại) và người dùng có thể truy cập bất kỳ máy chủ nào khác khi họ truy cập vào mỗi yêu cầu, tùy chọn này không tốt. Nếu quá trình web khởi động lại, các phiên sẽ bị mất. Họ cũng có thể hết giờ.

  2. Bạn có thể sử dụng máy chủ trạng thái trong asp.net để truy cập nhiều máy chủ - thao tác này nằm ngoài quy trình của máy chủ web của bạn. Nếu quá trình web khởi động lại - bạn là OK và nhiều máy chủ truy cập điều này. Lưu lượng truy cập này đến máy chủ trạng thái không được mã hóa và bạn sẽ sử dụng lý tưởng các chính sách IPSEC để bảo đảm lưu lượng truy cập trong một môi trường an toàn hơn.

  3. Bạn có thể sử dụng máy chủ sql để quản lý trạng thái (tự động) bằng cách thiết lập web.config để sử dụng máy chủ sql làm cơ sở dữ liệu phiên của bạn. Điều này mang lại lợi thế về cơ sở dữ liệu hiệu năng cao và truy cập đa máy chủ.

  4. Bạn có thể sử dụng phiên của riêng bạn trong một cơ sở dữ liệu nếu bạn cần đến chúng để tồn tại một thời gian dài bên ngoài của cơ chế bình thường và muốn kiểm soát chặt chẽ trên các lĩnh vực cơ sở dữ liệu (có thể bạn muốn truy vấn các lĩnh vực cụ thể)

Ngoài ra chỉ tò mò - có thể bạn đang đề cập đến các phiên làm tùy chọn của người dùng? Trong trường hợp đó, nghiên cứu hồ sơ asp.net

+0

cũng .. tại sao bạn quan tâm đến chi tiết ở đây - mỗi hệ thống có các phương pháp được xây dựng riêng - trừ khi đây là trang web mà bạn rất quan tâm với hiệu suất cao, bạn sẽ không nhận thấy sự khác biệt trong các cơ chế khác nhau. –

1

Asp.net không hỗ trợ lưu trữ phiên trong tệp, tôi không chắc chắn về r-o-r. Tuy nhiên lưu trữ phiên trong bộ nhớ (của cùng một quá trình) là nhanh hơn so với có nó trong một db. Có nó trong một DB có thể cung cấp khả năng tốt hơn cho ứng dụng của bạn (trong trường hợp bạn muốn triển khai ứng dụng của mình trong môi trường trang trại - tất cả các máy chủ đều có chung (db) để tìm phiên).

This bài viết mã dự án cung cấp thông tin chi tiết rất tốt về quản lý phiên asp.net.

1

Tôi đoán, dựa trên câu hỏi trước của bạn, rằng điều này đang được hỏi trong ngữ cảnh sử dụng CGI :: Application module của perl, với CGI :: Application :: Plugin :: Phiên. Nếu bạn sử dụng mô-đun đó với các thiết lập mặc định, nó sẽ ghi dữ liệu phiên vào các tệp được lưu trữ trong thư mục/tmp - rất giống với những gì PHP làm. Nếu ứng dụng của bạn đang chạy trong môi trường lưu trữ được chia sẻ, bạn có thể KHÔNG muốn thực hiện việc này vì lý do bảo mật vì những người dùng khác có thể xem/sửa đổi dữ liệu trong/tmp. Bạn có thể sửa lỗi này bằng cách ghi các tệp vào một thư mục mà chỉ bạn mới được phép đọc/ghi (tức là, không phải/tmp). Trong khi phát triển, tôi thích sử dụng YAML để tuần tự hóa hơn là mặc định (có thể lưu trữ), vì nó có thể đọc được. Nếu bạn có máy chủ web của riêng mình và bạn có thể chạy máy chủ cơ sở dữ liệu (mysql) trên cùng một máy, thì lưu trữ dữ liệu phiên trong cơ sở dữ liệu thay vì tệp thường mang lại hiệu suất cao hơn - đặc biệt nếu bạn có thể để duy trì kết nối cơ sở dữ liệu liên tục (tức là sử dụng mod_perl hoặc fastcgi).NHƯNG - nếu cơ sở dữ liệu của bạn nằm trên máy chủ từ xa và bạn phải mở kết nối mới mỗi lần bạn cần cập nhật dữ liệu phiên, thì hiệu suất có thể tồi tệ hơn và ghi vào tệp có thể tốt hơn. Lưu ý rằng bạn cũng có thể sử dụng sqlite, trông giống như một cơ sở dữ liệu cho ứng dụng của bạn, nhưng thực sự chỉ là một tệp trên hệ thống tệp cục bộ của bạn. Bất kể hiệu suất, tùy chọn cơ sở dữ liệu có thể không mong muốn trong môi trường máy chủ chia sẻ vì giới hạn băng thông và các hạn chế tài nguyên khác. Sự khác biệt về hiệu suất cũng có thể không đáng kể đối với một trang web có lưu lượng truy cập thấp (tức là, một vài nghìn lần truy cập mỗi ngày).

+0

Vâng, đó là chính xác đúng =) Tôi đang thiết lập ở đây và tự hỏi làm thế nào tôi nên lưu trữ này. Tôi cũng là một fan hâm mộ lớn của YAML. "Serialization" nghĩa là gì trong ngữ cảnh này? Tôi không cho rằng bạn sử dụng YAML thay vì một cơ sở dữ liệu? Các sự kiện rất hữu ích về tệp dựa trên cơ sở dữ liệu dựa trên! –

+1

Dữ liệu phiên của bạn được lưu trữ trong cấu trúc dữ liệu perl (thường chỉ là một băm đơn giản). Bạn phải chuyển đổi cấu trúc dữ liệu đó thành một cái gì đó mà bạn có thể đọc và viết, hoặc trong một tệp, hoặc trong một cơ sở dữ liệu. Đó là những gì serialization có nghĩa là. Nếu bạn sử dụng YAML, sau đó bạn tuần tự hóa dữ liệu vào một chuỗi văn bản đơn giản. Mô-đun 'có thể lưu trữ' lưu trữ dữ liệu ở định dạng nhị phân, nhỏ gọn hơn. Nó rất nhanh, và rất hiệu quả - nhưng nó không phải là rất di động. Tôi đã bị đốt cháy trong quá khứ, ví dụ, bằng cách nâng cấp phiên bản, sau đó tìm thấy rằng phiên bản mới của chúng tôi không thể đọc dữ liệu được viết bởi phiên bản cũ. – scorpio17

+1

Tôi sử dụng bộ nối tiếp có thể lưu trữ với mysql để sử dụng sản xuất. Tuy nhiên, khi phát triển một cái gì đó mới, tôi chuyển sang các phiên dựa trên tệp và tuần tự hóa với YAML, để tôi có thể dễ dàng xem dữ liệu phiên nào đang được lưu trữ. Nó làm cho việc gỡ lỗi dễ dàng hơn. Chuyển đổi qua lại dễ dàng với CGI :: Application. Tôi kiểm soát mọi thứ trong một phương thức cgiapp_init bên trong một lớp cơ sở mà tất cả các lớp ứng dụng đều xuất phát từ đó. – scorpio17

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