Mysql: حصلت على "اطلب tcp 127.0.0.1:3306: connect: لا يمكن تعيين العنوان المطلوب" عند استخدام goroutines متعددة متزامنة

تم إنشاؤها على ١٧ يناير ٢٠١٩  ·  3تعليقات  ·  مصدر: go-sql-driver/mysql

وصف المشكلة

حصلت على "اطلب tcp 127.0.0.1:3306: connect: لا يمكن تعيين العنوان المطلوب" بعد مرور بعض الوقت ، عند استخدام goroutines متعددة متزامنة:

  • عند استخدام 8 goroutines متزامنة => كل شيء على ما يرام
  • عند استخدام المزيد من goroutines => بعد حوالي 15 ثانية ، يفشل كل طلب مع الخطأ = "اطلب tcp 127.0.0.1:3306: connect: لا يمكن تعيين العنوان المطلوب". تم تنفيذ حوالي 35000 طلب بنجاح قبل الفشل الأول.

يبدو أن مشغل SQL لا يمكنه الحصول على منفذ جديد لإنشاء اتصال جديد ، ولكن إذا كان الأمر كذلك ، فأنا لا أفهم لماذا لا يعيد استخدام اتصال موجود من التجمع؟

لدي DBStats التالية عند حدوث الخطأ:
(sql.DBStats) {
MaxOpenConnections: (int) 0 ،
OpenConnections: (int) 64 ،
مستخدم: (int) 64 ،
خامل: (int) 0 ،
WaitCount: (int64) 0 ،
مدة الانتظار: (time.Duration) 0s،
MaxIdleClosed: (int64) 28252 ،
MaxLifetime مغلق: (int64) 0
}

أستخدم go-sql-driver V1.4.1 مع go 1.11.2 ، للوصول إلى mariaDB يعمل محليًا كحاوية رصيف.
أنا المثال أدناه أضفت "الذعر" فقط حتى لا تغمرها مجموعة من الأخطاء المماثلة.

مثال على الكود

// the below code is called repetitly from a configurable number of worker fed using channels (fan-out)
// Mark visa_card entry as migrated
        query := fmt.Sprintf(UPDATE visa_card SET migrated=TRUE WHERE id_card=%s, this.idCard)
        _, err = conf.MySql.ExecContext(ctx, query)
        if err != nil {
            log.Error(ctx, log.EventTypeBusiness, "", err)
            spew.Dump(conf.MySql.Stats())
            panic("the END")
        }
        return err

سجل الخطأ

{"level":"info","dateTime":"2019-01-17T14:58:04.095+0100","msg":"","appVersion":"0.0.0","component":"VISA-MIGRATOR","country":"bw","eventType":"incoming request","requestId":"d25e58f8-8228-4a7f-9cc4-1fd9ea2230b4","useCase":"","parameters":{"request_headers":{},"request_http_method":"POST","request_uri":"/startImportActiveCards"},"caller":"common/utils/log/ginLog.go:70"}
{"level":"error","dateTime":"2019-01-17T14:58:20.562+0100","msg":"","appVersion":"0.0.0","component":"VISA-MIGRATOR","country":"bw","eventType":"internal","requestId":"d25e58f8-8228-4a7f-9cc4-1fd9ea2230b4","useCase":"startMigration","peer":"internal","caller":"migrator/migrate/migrateActiveCards.go:211","errorDetails":"dial tcp 127.0.0.1:3306: connect: cannot assign requested address"}
(sql.DBStats) {
 MaxOpenConnections: (int) 0,
 OpenConnections: (int) 50,
 InUse: (int) 50,
 Idle: (int) 0,
 WaitCount: (int64) 0,
 WaitDuration: (time.Duration) 0s,
 MaxIdleClosed: (int64) 28258,
 MaxLifetimeClosed: (int64) 0
}
panic: the END

ترتيب

* go-sql-driver V1.4.1

* إصدار Go: go version go1.11.2 linux / amd64

* MariaDB 10.4.1 في حاوية الرصيف

نظام تشغيل الخادم: على سبيل المثال Debian 8.1 (Jessie) و Windows 10

التعليق الأكثر فائدة

جرب هذا.

db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (time.Minure)

ال 3 كومينتر

جرب هذا.

db.SetMaxIdleConns (64)
db.SetMaxOpenConns (64)
db.SetConnMaxLifetime (time.Minure)

شكرًا جزيلاً methane على
ما زلت مندهشًا بعض الشيء من أن القيم الافتراضية لا تعمل بشكل صحيح ولا أفهم لماذا ولكنك قمت بالفعل بحل مشكلتي.

انظر هذا المقال.
http://techblog.en.klab-blogs.com/archives/31093990.html

اختفت جميع الصور في المقال. إنهم على قيد الحياة في النسخة اليابانية من المقال.

http://dsas.blog.klab.org/archives/2018-02/configure-sql-db.html

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات