2009-02-25 30 views
10

Cách tốt nhất để lập trình phản ứng ngay lập tức cho bản cập nhật dữ liệu trong cơ sở dữ liệu là gì? Phương pháp đơn giản nhất mà tôi có thể nghĩ ra là một chuỗi kiểm tra cơ sở dữ liệu cho một thay đổi cụ thể đối với một số dữ liệu và liên tục đợi để kiểm tra lại nó trong một khoảng thời gian xác định trước. Giải pháp này có vẻ là lãng phí và tối ưu với tôi, vì vậy tôi đã tự hỏi nếu có một cách tốt hơn.Cách tốt nhất để ứng dụng khách ngay lập tức phản ứng với bản cập nhật trong cơ sở dữ liệu là gì?

Tôi thấy có một số cách, sau khi tất cả, một ứng dụng web như gmail dường như có thể cập nhật hộp thư đến của tôi gần như ngay lập tức sau khi một email mới được gửi cho tôi. Chắc chắn khách hàng của tôi không liên tục kiểm tra cập nhật mọi lúc. Tôi nghĩ rằng cách họ làm điều này là với AJAX, nhưng làm thế nào AJAX có thể cư xử như một cuộc gọi chức năng từ xa tôi không biết. Tôi muốn được tò mò để biết làm thế nào gmail hiện này, nhưng những gì tôi muốn biết nhất là làm thế nào để làm điều này trong trường hợp chung với một cơ sở dữ liệu.

Chỉnh sửa: Xin lưu ý tôi muốn phản ứng ngay lập tức với bản cập nhật trong mã máy khách, chứ không phải trong cơ sở dữ liệu, vì vậy theo tôi biết trình kích hoạt không thể thực hiện việc này. Về cơ bản tôi muốn NGƯỜI DÙNG nhận được thông báo hoặc cập nhật màn hình của mình sau khi thay đổi cơ sở dữ liệu đã được thực hiện.

+0

wow rất nhiều người dường như đang phản hồi tiêu đề chủ đề, mà không thực sự đọc câu hỏi. Nó không phải là một người kích hoạt !! Nếu tôi có bất kỳ phiếu bầu nào hôm nay, tôi sẽ bỏ phiếu cho tất cả họ để dạy cho họ một bài học để đọc câu hỏi chết tiệt trước khi trả lời. –

+0

Vâng, đó là một chút khắc nghiệt. Câu hỏi là tất cả nhưng yêu cầu ma thuật. Nếu anh ta muốn một phản ứng ngay lập tức, gây nên có lẽ sẽ được tham gia một nơi nào đó trong quá trình này. – Dana

+0

@Dana: Không phải là không khắc nghiệt khi mong đợi mọi người đọc một câu hỏi trước khi cố gắng trả lời. Không, anh ta hầu như không đòi hỏi phép thuật, anh ta sử dụng ví dụ workd thực (gmail) làm mô hình. Và không, gây nên có lẽ sẽ không được tham gia. –

Trả lời

7

Bạn về cơ bản có hai vấn đề ở đây:

  1. Bạn muốn có một trình duyệt để có thể nhận các sự kiện không đồng bộ từ máy chủ ứng dụng web mà không cần bỏ phiếu trong một vòng lặp chặt chẽ.

  2. Bạn muốn ứng dụng web có thể nhận các sự kiện không đồng bộ từ cơ sở dữ liệu mà không cần bỏ phiếu trong vòng lặp chặt chẽ.

Đối với vấn đề # 1

Xem các liên kết wikipedia cho các loại kỹ thuật tôi nghĩ rằng bạn đang tìm kiếm:

EDIT: 19 Mar 2009 - Chỉ cần truy cập ReverseHTTP mà có thể quan tâm đến Vấn đề # 1.

Đối với vấn đề # 2

Các giải pháp sẽ là cụ thể mà cơ sở dữ liệu bạn đang sử dụng và có lẽ người lái xe cơ sở dữ liệu máy chủ của bạn sử dụng quá. Ví dụ: với PostgreSQL bạn sẽ sử dụng LISTENNOTIFY. (Và có nguy cơ bị bỏ phiếu, bạn có thể sử dụng trình kích hoạt cơ sở dữ liệu để gọi lệnh NOTIFY khi thay đổi dữ liệu của bảng.)

Một cách khác có thể thực hiện được là cơ sở dữ liệu có an interface để tạo lưu trữ thủ tục hoặc trình kích hoạt liên kết đến thư viện động (ví dụ: tệp DLL hoặc .so). Sau đó, bạn có thể viết mã tín hiệu máy chủ trong C or whatever.

Cùng một chủ đề, một số cơ sở dữ liệu cho phép bạn viết các thủ tục được lưu trữ bằng các ngôn ngữ như Java, Ruby, Pythonothers. Bạn có thể sử dụng một trong những thứ này (thay vì cái gì đó biên dịch thành một mã máy DLL như C) cho cơ chế báo hiệu.

Hy vọng cung cấp cho bạn đủ ý tưởng để bắt đầu.

+0

Đây chính xác là những gì tôi đang tìm kiếm. Cảm ơn! – Daniel

+0

Tôi không biết tại sao nhưng việc đẩy máy chủ hiếm khi được sử dụng tốt. – Faiz

1

Vâng, cách tốt nhất là cơ sở dữ liệu trigger. Phụ thuộc vào khả năng của DBMS của bạn mà bạn chưa chỉ định, để hỗ trợ chúng.

Chỉnh sửa của bạn: Cách các ứng dụng như Gmail thực hiện, thực tế là với việc bỏ phiếu AJAX. Cài đặt tiện ích mở rộng Tamper Data Firefox để xem nó hoạt động. Bí quyết để giữ cho truy vấn bỏ phiếu của bạn nhanh chóng trong trường hợp "không có tin tức".

+0

Vui lòng xem chỉnh sửa của tôi ở trên, theo như tôi biết trình kích hoạt không thể làm những gì tôi yêu cầu. – Daniel

+0

Chỉnh sửa lại của bạn: Điều này có vẻ điên rồ với tôi vì gmail có rất nhiều khách hàng, để có tất cả trong số họ bỏ phiếu cho máy chủ mọi lúc dường như không hiệu quả. Phải có một cách tốt hơn ... Nhưng cảm ơn vì cái nhìn sâu sắc đó, tôi sẽ không nghĩ đó là cách nó thực sự được thực hiện. – Daniel

+0

Cách thay thế, "đẩy máy chủ", Điều quan trọng mới sẽ cách mạng Web năm 1994 hay như vậy, liên quan đến việc giữ một kết nối TCP trực tiếp cho mọi khách hàng, đó là một ý tưởng tồi tệ hơn theo cấp số nhân. – chaos

6

Tôi hình dung thì phải có một cách nào đó, sau khi tất cả, ứng dụng web như gmail vẻ để cập nhật hộp thư của tôi gần như ngay lập tức sau một email mới được gửi đến cho tôi. Chắc chắn khách hàng của tôi không liên tục kiểm tra cập nhật mọi lúc. Tôi nghĩ cách họ thực hiện điều này là với AJAX, nhưng cách AJAX có thể hoạt động như một cuộc gọi chức năng từ xa mà tôi không biết. Tôi muốn tò mò muốn biết gmail thực hiện điều này như thế nào , nhưng điều tôi muốn biết nhất là cách thực hiện điều này trong trường hợp chung bằng cơ sở dữ liệu.

Xem nhanh bằng wireshark đôi khi ... có một số lưu lượng truy cập google đang diễn ra ở đó khá thường xuyên, xuất hiện.

Tùy thuộc vào DB của bạn, trình kích hoạt có thể hữu ích. Một ứng dụng tôi đã viết dựa trên các bộ kích hoạt nhưng tôi sử dụng cơ chế bỏ phiếu để thực sự 'biết' rằng một cái gì đó đã thay đổi. Trừ khi bạn có thể truyền đạt sự thay đổi của DB, một số cơ chế bỏ phiếu là cần thiết, tôi sẽ nói.

Chỉ hai xu của tôi.

1

Thật không may là không có cách nào để đẩy dữ liệu vào trình duyệt web - bạn chỉ có thể gửi dữ liệu dưới dạng phản hồi cho yêu cầu - đó chỉ là cách hoạt động của HTTP.

AJAX là những gì bạn muốn sử dụng: gọi dịch vụ web sau một giây không quá, miễn là bạn thiết kế dịch vụ web để đảm bảo nhận được một lượng nhỏ dữ liệu, gửi một số tiền nhỏ và có thể chạy rất nhanh chóng để tạo ra phản ứng đó.

+0

Điều gì về các ứng dụng máy tính để bàn bình thường với một cơ sở dữ liệu back-end. Có cách nào để đẩy dữ liệu vào ứng dụng từ cơ sở dữ liệu không? Có lẽ một số loại kết nối vẫn mở? – Daniel

+0

Không thực sự đúng. Máy chủ đẩy không hoạt động. Đó chỉ là một ý tưởng tồi tệ. – chaos

+0

Cảm ơn sự hỗn loạn - Tôi không biết điều đó. Tôi đoán vì đó là một ý tưởng tồi, tôi chưa bao giờ nghe nói về nó! :-) – teedyay

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