Как получить информацию об идентификаторе соединения по запросу? - PullRequest
1 голос
/ 09 апреля 2019

Я хочу получить идентификатор соединения (threadId) при выполнении длинного запроса на тот случай, если пользователь во внешнем интерфейсе (Vue.js) захочет отменить запрос (в случае, если запрос никогда не заканчивается ...). Поэтому, когда пользователь нажимает «Стоп запрос», я выполняю KILL (threadId) для Mysql ..

Я использую пул с ведомым (client = mysql). Я считаю, что это что-то тривиальное, но может кто-нибудь, пожалуйста, опишите, как я могу получить доступ к этому. мой бэкэнд (node.js) настроен по-другому - - был сделан умным парнем, который определил пулы и соединение следующим образом:

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

  console.log('connected as id ' + connection.threadId);
});
const knex = require("knex");

// Helpers -------------------------------------------------------------------
const connection = (user, password) =>
  knex({
    client: "mysql",
    connection: {
      multipleStatements: true,
      host: process.env.MYSQL_IP,
      port: process.env.MYSQL_PORT,
      user,
      password,
      database: "",
      dateStrings: true,
      idleTimeoutMillis: -1
    },
    debug: true,
    pool: {
      min: 0,
      max: 7
    }
  });

const knex_session = pool => (user, password) => {
  if (pool[user] === undefined) {
    pool[user] = connection(user, password);
  }
  return pool[user];
};

// Pool ----------------------------------------------------------------------
const connections = {};

// Exports -------------------------------------------------------------------
exports.admin = connection(
  process.env.MYSQL_USERNAME,
  process.env.MYSQL_PASSWORD
);
exports.client = knex_session(connections);

// ---------------------------------------------------------------------------

Я ищу способ получить mysql threadId как-то - я представляю из функции (route). Другие варианты - это другой вызов mysql (SELECT CONNECTION_ID ()) или каким-то образом извлечение его данных из объекта запроса (однако и здесь не удалось). Чем бы я выполнял команду KILL QUERY (threadId), чтобы убедиться, что запрос не зависает и что я могу отобразить для пользователя правильный компонент vue.

1 Ответ

0 голосов
/ 09 апреля 2019

Как вы обнаружили, идентификатор соединения MySQL находится в качестве атрибута объекта соединения: connection.threadId. Это верно для knex , потому что он наложен на mysql .

Вы можете извлечь его из объекта подключения, когда он находится в области видимости, и поместить его в полезное место ... что-то вроде этого, если вы находитесь в экспрессе.

    function whatever (req, res, next) {
       ...
       res.dbmsThreadId = connection.threadId
       ...
    }
...