Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Принятые патчи (http://mangos.ytdb.ru/forumdisplay.php?f=5)
-   -   [11045][patch] Multiple MySQL connections to database (http://mangos.ytdb.ru/showthread.php?t=3480)

Ambal 15.01.2011 03:23

[11045][patch] Multiple MySQL connections to database
 
Всем трямс.

Очередной патч, который гипотетически снова должен что-то улучшить =))) Оригинальная тема на офф форуме: Multiple MySQL connections to database

Вкратце по патчу:
1) переписан код по работе с базами данных. Также проведен рефакторинг.
2) используем несколько соединений с БД, отдельно для синхронных (SELECT) и асинхронных (INSERT+UPDATE+DELETE) запросов. Транзакции обрабатываются в отдельном потоке и только на асинхронном соединении!
3) используем меньшее количество мьютексов для работы. Класс SqlTransaction теперь также не нуждается в мьютексах.

Краткая статистика по типу SQL запросов, которые мы используем в коде мангоса:
1) SELECT - 398
2) INSERT - 88
3) DELETE - 255
4) UPDATE - 158

Чисто теоретически должно повысить производительность сервера. На практике может обернуться траблами с сохранностью данных в БД (что маловероятно) либо их релевантностью при чтении из базы (читаем про уровни изоляции транзакций).

ВНИМАНИЕ: обязательно сделайте бекап базы данных перед тестом! В случае если вдруг начнут обнаруживаться проблемы с целостностью данных - мы откажемся от идеи нескольких параллельных соединений к базе!

Репозиторий: https://github.com/Ambal/mangos
Ветка: master

Любые пожелания и комментарии приветствуются :)

zhenya 15.01.2011 06:38

В кобольде сталкивались с проблемой, что персонаж не успевал сохраниться до попытки входа в мир при логаутах. Решение было метить транзакции отметкой содержащей гуид и в местах, где возможны траблы с чтением из базы использовались проверки нет ли незавершенной транзакции на этого персонажа.. но мы разделяли конекты (1 занимался запросами SELECT, 2 запросами INSERT+DELETE+REPLACE) насколько я помню.

Ambal 15.01.2011 09:01

Цитата:

Сообщение от zhenya (Сообщение 18441)
В кобольде сталкивались с проблемой, что персонаж не успевал сохраниться до попытки входа в мир при логаутах.

В текущем ядре по большому счету сие тоже теоретически возможно - все транзакции выполняются асинхронно. Т.е. если у вас переполненная очередь асинхронных запросов и игрок быстро перелогинивается, то его данные могут неуспеть сохраниться. Я добавлю возможность выполнить транзакцию синхронно - пригодиться если нужно будет подобное проделать, скажем, при старте сервера.

P.S. В этом патче мы также разделяем коннекты: 1) синхронный для SELECT 2) асинхронный для INSERT+DELETE+UPDATE


Текущее время: 11:59. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS