簡體   English   中英

如何在Perl腳本中斷開與MongoDB的連接?

[英]How to disconnect from MongoDB in a Perl script?

我正在嘗試編寫一個Perl5腳本,每分鍾檢查一次MongoDB服務器的狀態,並通知我它是否已關閉。 任何建議都歡迎這項任務。 目前,我使用'MongoDB'模塊和'MongoDB :: MongoClient'建立連接以查看服務器是否可用。 這是基本的想法:

while(1)
{
        my $conn = connectMongoDB();

        if($conn){
                sleep 60;
        }   
        else{
                sendMail();
                last;
        }   
}

sub connectMongoDB
{
        my $client;

        eval{ $client =  MongoDB::MongoClient->new( host => "mongodb://:\@$server");};

        return ($client)?1:0;       
}

主要問題是無法斷開與服務器的連接。 以下是它在cpan頁面上的內容:

“沒有辦法明確地與數據庫斷開連接。但是,當沒有對MongoDB :: MongoClient對象的引用時,連接將自動關閉並清除,當$ client超出范圍時會發生(或者如果你取消定義則更早)它與undef)。“

我試過'undef'和子程序。 它們都沒有終止連接。 由於循環,連接數量不斷增加。 有沒有其他方法可以嘗試控制連接數量?

只要不涉及crontab,任何其他解決此問題的建議都會受到贊賞。

謝謝。

編輯:

這是睡眠時間設置為2秒時的輸出,其中db版本為v2.4.4且MongoDB模塊版本為0.701.4。 將MongoDB模塊升級到0.702.1后問題仍然存在。

Fri Aug 16 20:33:06.986 [initandlisten] connection accepted from 127.0.0.1:51031 #3 (1 connection now open)
Fri Aug 16 20:33:08.989 [initandlisten] connection accepted from 127.0.0.1:51033 #4 (2 connections now open)
Fri Aug 16 20:33:10.991 [initandlisten] connection accepted from 127.0.0.1:51034 #5 (3 connections now open)
Fri Aug 16 20:33:12.994 [initandlisten] connection accepted from 127.0.0.1:51035 #6 (4 connections now open)
Fri Aug 16 20:33:14.996 [initandlisten] connection accepted from 127.0.0.1:51036 #7 (5 connections now open)
Fri Aug 16 20:33:16.999 [initandlisten] connection accepted from 127.0.0.1:51038 #8 (6 connections now open)
Fri Aug 16 20:33:19.003 [initandlisten] connection accepted from 127.0.0.1:51039 #9 (7 connections now open)
Fri Aug 16 20:33:21.006 [initandlisten] connection accepted from 127.0.0.1:51040 #10 (8 connections now open)
Fri Aug 16 20:33:23.009 [initandlisten] connection accepted from 127.0.0.1:51042 #11 (9 connections now open)
Fri Aug 16 20:33:25.013 [initandlisten] connection accepted from 127.0.0.1:51043 #12 (10 connections now open)
Fri Aug 16 20:33:27.016 [initandlisten] connection accepted from 127.0.0.1:51044 #13 (11 connections now open)
Fri Aug 16 20:33:29.019 [initandlisten] connection accepted from 127.0.0.1:51045 #14 (12 connections now open)
Fri Aug 16 20:33:31.022 [initandlisten] connection accepted from 127.0.0.1:51047 #15 (13 connections now open)

編輯2:已解決!!

我相信這個問題與auto_connect選項有關。 一旦禁用,代碼工作正常。 以下是現在有用的東西。

sub connectMongoDB
{
        my $client;

        eval{
                $client =  MongoDB::MongoClient->new( host => "mongodb://:\@$server",
                      auto_connect => 0); 
                $client->connect;
        };  
        return (!$@)?1:0;
}

最好

我無法使用CPAN的MongoDB 2.4.1和版本0.702.1的MongoDB驅動程序重現此問題。

我運行你的代碼,睡眠超時改為10秒,連接到localhost。 運行幾分鍾后,在mongo shell中運行db.serverStatus()繼續只顯示一個連接。 (這是shell會話的連接。)

這是mongod的輸出,顯示連接每十秒打開和關閉一次。 (你可以看到我在前兩個連接循環后啟動了shell。)

Fri Aug 16 21:36:43.589 [conn1] end connection 127.0.0.1:57722 (0 connections now open)
Fri Aug 16 21:36:53.526 [initandlisten] connection accepted from 127.0.0.1:57723 #2 (1 connection now open)
Fri Aug 16 21:36:53.527 [conn2] end connection 127.0.0.1:57723 (0 connections now open)
Fri Aug 16 21:36:58.421 [initandlisten] connection accepted from 127.0.0.1:57724 #3 (1 connection now open)
Fri Aug 16 21:37:03.529 [initandlisten] connection accepted from 127.0.0.1:57725 #4 (2 connections now open)
Fri Aug 16 21:37:03.529 [conn4] end connection 127.0.0.1:57725 (1 connection now open)
Fri Aug 16 21:37:13.531 [initandlisten] connection accepted from 127.0.0.1:57726 #5 (2 connections now open)
Fri Aug 16 21:37:13.532 [conn5] end connection 127.0.0.1:57726 (1 connection now open)
Fri Aug 16 21:37:23.534 [initandlisten] connection accepted from 127.0.0.1:57727 #6 (2 connections now open)
Fri Aug 16 21:37:23.535 [conn6] end connection 127.0.0.1:57727 (1 connection now open)
Fri Aug 16 21:37:33.537 [initandlisten] connection accepted from 127.0.0.1:57728 #7 (2 connections now open)
Fri Aug 16 21:37:33.538 [conn7] end connection 127.0.0.1:57728 (1 connection now open)
Fri Aug 16 21:37:43.540 [initandlisten] connection accepted from 127.0.0.1:57729 #8 (2 connections now open)
Fri Aug 16 21:37:43.540 [conn8] end connection 127.0.0.1:57729 (1 connection now open)
Fri Aug 16 21:37:53.542 [initandlisten] connection accepted from 127.0.0.1:57730 #9 (2 connections now open)
Fri Aug 16 21:37:53.543 [conn9] end connection 127.0.0.1:57730 (1 connection now open)
Fri Aug 16 21:38:03.545 [initandlisten] connection accepted from 127.0.0.1:57731 #10 (2 connections now open)
Fri Aug 16 21:38:03.545 [conn10] end connection 127.0.0.1:57731 (1 connection now open)
Fri Aug 16 21:38:13.547 [initandlisten] connection accepted from 127.0.0.1:57732 #11 (2 connections now open)
Fri Aug 16 21:38:13.548 [conn11] end connection 127.0.0.1:57732 (1 connection now open)
Fri Aug 16 21:38:23.550 [initandlisten] connection accepted from 127.0.0.1:57734 #12 (2 connections now open)
Fri Aug 16 21:38:23.550 [conn12] end connection 127.0.0.1:57734 (1 connection now open)
Fri Aug 16 21:38:33.552 [initandlisten] connection accepted from 127.0.0.1:57735 #13 (2 connections now open)
Fri Aug 16 21:38:33.553 [conn13] end connection 127.0.0.1:57735 (1 connection now open)
Fri Aug 16 21:38:43.555 [initandlisten] connection accepted from 127.0.0.1:57736 #14 (2 connections now open)
Fri Aug 16 21:38:43.555 [conn14] end connection 127.0.0.1:57736 (1 connection now open)
Fri Aug 16 21:38:53.557 [initandlisten] connection accepted from 127.0.0.1:57737 #15 (2 connections now open)
Fri Aug 16 21:38:53.559 [conn15] end connection 127.0.0.1:57737 (1 connection now open)
Fri Aug 16 21:39:03.560 [initandlisten] connection accepted from 127.0.0.1:57738 #16 (2 connections now open)
Fri Aug 16 21:39:03.561 [conn16] end connection 127.0.0.1:57738 (1 connection now open)
Fri Aug 16 21:39:13.563 [initandlisten] connection accepted from 127.0.0.1:57740 #17 (2 connections now open)
Fri Aug 16 21:39:13.564 [conn17] end connection 127.0.0.1:57740 (1 connection now open)
Fri Aug 16 21:39:23.566 [initandlisten] connection accepted from 127.0.0.1:57741 #18 (2 connections now open)
Fri Aug 16 21:39:23.567 [conn18] end connection 127.0.0.1:57741 (1 connection now open)
Fri Aug 16 21:39:33.569 [initandlisten] connection accepted from 127.0.0.1:57747 #19 (2 connections now open)
Fri Aug 16 21:39:33.570 [conn19] end connection 127.0.0.1:57747 (1 connection now open)
Fri Aug 16 21:39:43.572 [initandlisten] connection accepted from 127.0.0.1:57748 #20 (2 connections now open)
Fri Aug 16 21:39:43.573 [conn20] end connection 127.0.0.1:57748 (1 connection now open)
Fri Aug 16 21:39:53.575 [initandlisten] connection accepted from 127.0.0.1:57750 #21 (2 connections now open)
Fri Aug 16 21:39:53.576 [conn21] end connection 127.0.0.1:57750 (1 connection now open)
Fri Aug 16 21:40:03.579 [initandlisten] connection accepted from 127.0.0.1:57751 #22 (2 connections now open)
Fri Aug 16 21:40:03.579 [conn22] end connection 127.0.0.1:57751 (1 connection now open)
Fri Aug 16 21:40:13.580 [initandlisten] connection accepted from 127.0.0.1:57753 #23 (2 connections now open)
Fri Aug 16 21:40:13.581 [conn23] end connection 127.0.0.1:57753 (1 connection now open)
Fri Aug 16 21:40:23.584 [initandlisten] connection accepted from 127.0.0.1:57754 #24 (2 connections now open)
Fri Aug 16 21:40:23.584 [conn24] end connection 127.0.0.1:57754 (1 connection now open)
Fri Aug 16 21:40:33.586 [initandlisten] connection accepted from 127.0.0.1:57755 #25 (2 connections now open)
Fri Aug 16 21:40:33.586 [conn25] end connection 127.0.0.1:57755 (1 connection now open)
Fri Aug 16 21:40:43.588 [initandlisten] connection accepted from 127.0.0.1:57758 #26 (2 connections now open)
Fri Aug 16 21:40:43.588 [conn26] end connection 127.0.0.1:57758 (1 connection now open)
Fri Aug 16 21:40:53.590 [initandlisten] connection accepted from 127.0.0.1:57760 #27 (2 connections now open)
Fri Aug 16 21:40:53.591 [conn27] end connection 127.0.0.1:57760 (1 connection now open)
Fri Aug 16 21:41:03.592 [initandlisten] connection accepted from 127.0.0.1:57761 #28 (2 connections now open)
Fri Aug 16 21:41:03.593 [conn28] end connection 127.0.0.1:57761 (1 connection now open)

你能告訴我你正在使用的MongoDB(服務器)和MongoDB(驅動程序)的版本嗎?

更改子程序如下,

sub connectMongoDB
{
        my $client;

        eval{
                $client =  MongoDB::MongoClient->new( host => "mongodb://:\@$server",
                      auto_connect => 0); 
                $client->connect;
        };  
        return (!$@)?1:0;
}

問題是'auto_reconnect'選項一直以來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM