كيفية إعداد مهلة الاتصال اعتمادًا على تسجيل دخول المستخدم في MySQL

StackOverflow https://stackoverflow.com/questions/243644

  •  04-07-2019
  •  | 
  •  

سؤال

لدي حاليًا أكثر من 100 اتصال في حالة السكون.

يجب أن يظل بعض الاتصال في حالة السكون (ولا يتم إغلاقه) لأنه اتصال دائم ولكن البعض الآخر (باسم مستخدم مختلف) يأتي من بعض البرامج النصية php وأريد أن تنتهي مهلة الاتصال بسرعة كبيرة.

هل من الممكن إعداد wait_timeout لكل مستخدم؟وإذا كانت الإجابة بنعم، كيف؟

هل كانت مفيدة؟

المحلول

لا يوجد تكوين للمهلة لكل مستخدم، ولكن يمكنك ضبط wait_timeout القيمة بشكل ديناميكي.أي أنه بعد إجراء اتصال كمستخدم معين، يمكنك إصدار بيان لتغيير قيمة المهلة إلى القيمة التي تريدها لجلسة هذا المستخدم.

جرب التجربة التالية في عميل سطر الأوامر mysql:

mysql> SHOW VARIABLES LIKE 'wait_timeout';

...يظهر 28800 (أي.8 ساعات)، وهو الإعداد الافتراضي wait_timout.

mysql> SET SESSION wait_timeout = 60;
mysql> SHOW VARIABLES LIKE 'wait_timeout';

...يظهر 60.

ثم يمكنك إنهاء الجلسة، وإعادة الاتصال، ومرة ​​أخرى الافتراضي wait_timeout هو 28800.لذا فهو يقتصر على نطاق الجلسة الحالية.

يمكنك أيضًا فتح نافذة ثانية وبدء جلسة عميل MySQL منفصلة لإثبات أن تغيير wait_timeout في جلسة واحدة لا يؤثر على الجلسات المتزامنة الأخرى.

نصائح أخرى

يجب عليك تعيين المتغيرات التالية في ملفك my.conf:

[mysqld]
interactive_timeout=180
wait_timeout=180

wait_timeout هي مهلة ل اتصالات آلية (في رأيي أكثر من 30 على خادم الويب هو أكثر من اللازم).
interactive_timeout هو مهلة تفاعل وحدة التحكم للجلسة الخاملة.

وهناك احتمال آخر: الخلية تدعم اثنين من المتغيرات المختلفة المهلة، wait_timeout للعملاء غير التبادلي، وinteractive_timeout للعملاء التفاعلية

.

والفرق بين العملاء التفاعلية وغير التفاعلية ويبدو أن مجرد ما إذا كنت تحديد الخيار CLIENT_INTERACTIVE عند الاتصال.

وأنا لا أعرف إذا كان هذا يساعدك، لأنك بحاجة للتأكد بطريقة أو بأخرى mysql_real_connect() تمرير هذا الخيار في المعلمة client_flag لها. لست متأكدا ما هي اللغة أو واجهة الذي تستخدمه، لذلك أنا لا أعرف ما إذا كان يسمح لك لتحديد هذا العلم الصدد.

وعلى أي حال إذا يمكنك تمرير هذا العلم العميل، وتحتاج فقط نوعين مختلفين من المستخدمين، ثم هل يمكن تكوين wait_timeout وinteractive_timeout مختلف في التكوين خادم MySQL، ومن ثم استخدام واحد مع قيمة أقصر عندما تريد إعطاء جلسة لمهلة فورا.

إذا كنت تستخدم موصل / J ، يمكنك استخدام على sessionVariables في JDBC URL العميل مثل ذلك: jdbc:mysql://hostname:3306/schema?sessionVariables=wait_timeout=600

وسوف الروابط الأخرى لغات أخرى ربما تسمح نفسه.

وinit_connect سيتم تنفيذها كلما المستخدم بتسجيل الدخول، حتى نتمكن من إرسال بيان حالة صغير وتعيين قيمة يستند المستخدم. يرجى ملاحظة أن init_connect لن يتم تنفيذها للسوبر المستخدم.

وmysql> SET GLOBAL init_connect="SET @@wait_timeout = CASE WHEN CURRENT_USER() LIKE 'app1@%' THEN '30' ELSE @@wait_timeout END";

وراجعت الجدول mysql.user وأنها لا تبدو هناك وضع هناك له:

+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |
| File_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |
| References_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher            | blob                              | NO   |     |         |       |
| x509_issuer           | blob                              | NO   |     |         |       |
| x509_subject          | blob                              | NO   |     |         |       |
| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |
+-----------------------+-----------------------------------+------+-----+---------+-------+
37 rows in set (0.00 sec)

واعتمادا على ما إذا كنت تستخدم MySQLi أو شركة تنمية نفط عمان، لديك اتصالات PHP الخلية إما أن شنق عندما يفعل هذا الطلب، أو أن يشارك في تجمع لعملية أباتشي.

وعلى سبيل المثال، مع شركة تنمية نفط عمان، لإيقاف الاتصالات المستمرة (وأعتقد أن هذا هو الافتراضي)، الاتصال DB مع:

و$ شركة تنمية نفط عمان PDO = الجديدة ($ دسن، $ المستعمل، $ مرور، صفيف (PDO :: ATTR_PERSISTENT => كاذبة))؛

إذا كنت تريد البرامج النصية لاستخدام الاتصالات المستمرة، ولكن لديك الكثير من الاتصالات مفتوحة إلى قاعدة البيانات في وضع السكون، يجب أن نفكر في تكوين الخاص أباتشي MaxServers، MaxSpareServers، MinSpareServers وStartServers بحيث يتعطل يست كثيرة جدا حول عندما ليست هناك حاجة.

http://www.percona.com/doc/ percona-أدوات / 2.1 / PT-kill.html

ومن الممكن أن يقتل اتصالات لكل مستخدم مع حزب العمال القتل. يمكنك جدولة هذا أو إعداد وظيفة الخلفية للتعامل مع هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top