2013-04-26 32 views
9

Tôi có một nhiệm vụ dòng lệnh Symfony có thói quen thả kết nối mysql.Làm mới kết nối cơ sở dữ liệu nếu kết nối bị giảm hoặc hết thời gian

Nhiệm vụ nhập dữ liệu của nó. Mà lấy dữ liệu từ nhiều kết nối. Nó không phải là một truy vấn lớn mà là một truy vấn nhỏ hơn.

Dường như thả kết nối lần đầu tiên nó được chạy. Khoảng một nửa thông qua kịch bản. Tuy nhiên lần thứ hai nó chạy (ngay từ đầu) nó luôn hoàn thành nhiệm vụ.

Không tính thời gian trên truy vấn vì phản hồi lỗi mà tôi nhận được là kết nối đã bị ngắt và chạy tự động. Vì vậy, im nghĩ rằng một số loại vấn đề thời gian chờ của nó mà là tránh khi nó chạy lần thứ hai do bộ nhớ đệm truy vấn tăng tốc lên kịch bản.

Vì vậy, câu hỏi của tôi là làm cách nào để làm mới kết nối cơ sở dữ liệu?

[Doctrine\DBAL\DBALException]
SQLSTATE[HY000]: General error: 2013 Lost connection to MySQL server during query

+0

Bạn có thể cho chúng tôi biết các truy vấn không? Bạn đang sử dụng học thuyết? Có bao nhiêu hàng chúng ta đang nói về (việc nhập khẩu)? –

+0

Nhật ký MySQL có bất kỳ mục nhập nào sau khi thử không thành công không? – likeitlikeit

Trả lời

8

Tôi đoán bạn muốn kết nối với cơ sở dữ liệu nếu kết nối bị mất vì một lý do nào đó. Với một EntityManager, bạn có thể làm điều đó theo cách sau:

$success = $_em->getConnection()->connect(); 

Với getConnection, bạn đang lấy các đối tượng kết nối học thuyết sử dụng (Doctrine\DBAL\Connection), trong đó cho thấy nhiều phương pháp connect.

Bạn có thể gọi connect bất kỳ lúc nào, vì nó kiểm tra kết nối đã được thiết lập chưa. Nếu đây là trường hợp, nó trả về false.

Ngoài ra còn có phương pháp isConnected để kiểm tra thời gian kết nối được thiết lập. Bạn có thể sử dụng nó để xem chính xác kết nối đang rơi ở đâu để có bức tranh rõ ràng hơn về những gì đang xảy ra.

+1

Nó không hoạt động. Khi kết nối bị mất quản lý thực thể những điều mà nó đã được kết nối, gây ra không có người nghe cho điều đó. Giải pháp làm việc là http://stackoverflow.com/questions/15362070/zf2-doctrine2-server-has-gone-away-how-to-jog-an-old-connection –

6

Một cách tiếp cận khác là kiểm tra xem học thuyết vẫn được kết nối với máy chủ mysql thông qua phương thức ping() trong kết nối. Nếu kết nối bị mất, hãy đóng kết nối đang hoạt động vì nó chưa thực sự bị đóng và bắt đầu một kết nối mới.

if(FALSE == $em->getConnection()->ping()){ 
    $em->getConnection()->close(); 
    $em->getConnection()->connect(); 
} 
+0

Đó là câu trả lời đúng !! – Sliq

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