7

tôi thiết lập một cơ sở dữ liệu phản ánh và sau đó sử dụng connectionstring này để kết nối với nó:Cách kết nối với máy chủ SQL được nhân đôi sau khi chuyển đổi dự phòng?

Data Source={0};Failover Partner={1};Initial Catalog=AdventureWorks; 
    Integrated Security=True; 

Sau khi thêm một số dữ liệu vào cơ sở dữ liệu, tôi tắt máy tính, máy chủ chính, vì vậy các máy chủ nhân bản trở thành máy chủ chính. Tôi mở lại kết nối, nhận được lỗi này:

System.Data.SqlClient.SqlException: A transport-level error has 
occurred when sending the request to the server. (provider: Shared Memory 
Provider, error: 0 - No process is on the other end of the pipe.) 

Tôi nghĩ rằng với đối tác chuyển đổi dự phòng được chỉ định trong chuỗi kết nối, ADO.NET sẽ thực hiện công việc cho tôi. Vậy tôi nên làm gì bây giờ?

Câu hỏi này là cấp bách. Cảm ơn rất nhiều vì sự giúp đỡ của bạn.

+1

Bạn nên xác định nếu có một nhân chứng hoặc nếu đây là một cấu hình thủ công fail-over (bạn chỉ có được tự động thất bại hơn nếu bạn có một nhân chứng. Thấy http://technet.microsoft.com/ en-us/library/ms189852 (SQL.90) .aspx). Bạn cũng nên kiểm tra trạng thái của các cơ sở dữ liệu trên cả Principal và Failover. –

+0

Bạn đang sử dụng nhà cung cấp nào? – gbn

+0

@doug_w: Tôi đã kiểm tra thủ công bằng T-SQL, mọi thứ hoạt động tốt :) @gbn: Tôi đang sử dụng ADO.NET – Vimvq1987

Trả lời

3

May mắn thay, tôi đã khắc phục sự cố này. Tất cả những gì tôi cần làm là gọi phương thức ClearPool:

SqlConnection.ClearPool(conn); 

Phương pháp này sẽ xóa hồ bơi kết nối. Sau đó, vấn đề đã biến mất. Tôi rất hạnh phúc với nó.

Cảm ơn tất cả các bạn đã ủng hộ bạn. : D

+0

Đúng - hồ bơi kết nối có thể gây ra loại điều này với cả cụm và gương – onupdatecascade

+0

Làm thế nào để bạn xác định khi nào cần xóa hồ bơi? Bạn có bao quanh nỗ lực để mở conn với một thử/bắt và làm điều đó nếu mở ném một ngoại lệ? Hoặc bạn có tìm thấy bất kỳ sự kiện cụ thể nào mà bạn có thể nối vào để nhận thông báo khi bạn có thể cần xóa hồ bơi không? Ngoài ra, bạn có thể vô hiệu hóa gộp trong chuỗi kết nối nhưng có tác động hiệu suất, giống như luôn luôn xóa hồ bơi trước khi mở kết nối. –

+0

Đó là một thời gian dài trước đây, tôi không có mã nữa, nhưng nếu tôi nhớ chính xác tôi rõ ràng hồ bơi kết nối trong trường hợp ngoại lệ bắt. Không phải là một giải pháp lý tưởng nhưng nó hoạt động cho tôi như một bản demo. – Vimvq1987

2

Tôi không phải là chuyên gia về công cụ .net nhưng bạn cần ứng dụng khách gốc SQL (SQLNCLI) để xử lý chuyển đổi dự phòng. "ado.net" có thể là SQLOLEDB

Tối đa Windows Server 2003 ít nhất nó không được cài đặt theo mặc định. Đó là một trong hai độc lập hoặc một phần của công cụ máy khách SQL, vì vậy tôi nghi ngờ bạn đang sử dụng SQLOLEDB

+0

Bạn có thể cho tôi biết thêm chi tiết không? :). – Vimvq1987

+0

Dùng thử Provider = SQLNCLI; conn chuỗi. Tôi không thể truy cập msdn ngay bây giờ để tìm tài liệu tham khảo – gbn

0

Sau khi bạn tắt hiệu trưởng, bạn đã xác minh rằng chuyển đổi dự phòng thực sự đã trở thành hiệu trưởng chưa? Nếu nó không có khả năng tự động chuyển đổi dự phòng trên Sql Server, thì gương của bạn vẫn là một tấm gương.

+0

SQL Server cho thấy rằng máy nhân bản đã trở thành hiệu trưởng. Tôi đã thử một T-SQL, nó chạy tốt: -s – Vimvq1987

+0

Ok, chỉ từ chơi với failover khoảng một năm trước, tôi biết làm thế nào nó có thể dễ dàng để bỏ lỡ những điều nhỏ ... Không có câu trả lời cho bạn, lấy làm tiếc. – taylonr