0

node.js に以下のコードがあります。長時間実行されるバックグラウンド サービスであり、

  1. status = 0 のメッセージ テーブルをスキャンします
  2. そこから日付を読み取ります
  3. Amazon SES を使用して E メールを送信します
  4. メッセージ テーブルのステータスを 1 に更新します。

私のMacでこれを実行すると、メモリ使用量は30M未満でかなり一定ですが、CENTOSサーバーでこれを実行すると、メモリ消費量が増加し続けます。私はnode.jsにかなり慣れていません。誰かが私を導くことができますか?これは再帰のためですか?

   var nodemailer = require('../lib/nodemailer'),
    fs = require("fs"),
    pathlib = require("path");
    var mysql = require("mysql");

    // Create an Amazon SES transport object
    var transport = nodemailer.createTransport("SES", {
        AWSAccessKeyID: "xxxxxxx",
        AWSSecretKey: "yyyyyyyyy",
        ServiceUrl: "https://email.us-east-1.amazonaws.com" // optional
    });

    console.log('SES Configured');

    var connection = mysql.createConnection({
        user: "user",
        password: "xxxxxx",
        database: "db_content"
    }); 

    // Message object

    function loop(){
        console.log("Reading from DB");
        connection.query('SELECT * FROM mm_messages where status = 0 limit 1;', function (error, rows, fields) {

            if( rows.length == 1 ) {        
                var message = {
                    from: 'abc <abc@xxxxx.com>',
                    to: rows[0]["to"],
                    subject: rows[0]["subject"] + rows[0]["id"], //
                    text: 'Hello to myself!',
                    html:'<p><b>Hello</b> to myself <img src="cid:note@node"/></p>'
                };

                console.log('Sending Mail');

                transport.sendMail(message, function(error){
                    if(error){
                        console.log('Error occured');
                        console.log(error.message);
                    //return;
                    }

                    console.log('Message sent successfully!');


                    connection.query('update mm_messages set status = 1 where id='+rows[0]["id"] + ';', function (errorq, rowsq, fieldsq) {
                        message = null;
                        error = null;
                        errorq = null;
                        rowsq = null;
                        rows = null;
                        fieldsq = null;
                        fields = null;
                        setTimeout(loop, 2000);     
                    });

                });
            } else {
                message = null;         
                rows = null;
                fields =null;
                error= null;
                setTimeout(loop, 2000);
            }

        });


    }

    loop();
4

1 に答える 1

0

それはまだ私にはかなり無害に見えます。変更してから再測定できる項目がいくつかあります。

  • インライン匿名コールバック関数をトップレベルの名前付き関数に変換します。
    • connection.query('SELECT * FROM mm_messages where status = 0 limit 1;', function (error, rows, fields) {
    • connection.query('SELECT * FROM mm_messages where status = 0 limit 1;', messageCallback
  • 文字列連結の代わりにパラメーター化された SQL を使用して、SQL 更新ステートメントを作成します
  • foo = null;それらのステートメントをすべて削除します。それらは不要です。彼らは一様です。コードが必要以上に長くなります。それらは、実際の目的を持つのではなく、FUD によって推進されます。
于 2013-10-01T14:52:01.150 に答える