|
Регистрация | Файлы | Правила | Альбомы | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
Языки программирования Изучаем С++, Sql, php, Lua, Python |
|
Опции темы | Поиск в этой теме | Опции просмотра |
03.08.2010, 04:10 | #1 |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
Monodevelop on Debian + Singleton
Доброго времени суток. Вообщем ввиду появления немного свободного времени решил продолжить разработку WWLauncher, если кто помнит...
В серверной части используется паттерн одиночка. Все тесты проводил на сервере под дебианом, кодил я в винде, в монодевелоп 2.4. Через неделю после возобновления разработки перешел на дебиан и на десктопе, поставил там моно 2.6, монодевелоп 2.4 (из сорцов). Каково же было мое удивление, когда я стащил с репо сорцы серверной части и они отказались компилится (а день назад прекрасно компилились под виндой). Юзал свой вариант класса-потомка для классов-синглтонов, после медитации попробовал использовать то, что сейчас на википедии. Код:
public class Singleton<T> where T : class { protected Singleton() { } private sealed class SingletonCreator<S> where S : class { private static readonly S instance = (S) typeof(S).GetConstructor( BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[0], new ParameterModifier[0]).Invoke(null); public static S CreatorInstance { get { return instance; } } } public static T Instance { get { return SingletonCreator<T>.CreatorInstance; } } } Код:
Singleton.cs(38,38): Error CS0305: Using the generic type `Singleton<T>.SingletonCreator<S>' requires `2' type argument(s) (CS0305) Код:
get { return SingletonCreator<T>.CreatorInstance; } Всем заранее спасибо... PS: Если кто то хочет изучать си шарп и присоединится к команде - милости прошу Проект исключительно для самообразования, ну и, скажем так, для внесения своей лепты в опенсорц-комьюнити мангоса/тринити (pet-project), упор на Mono (т.е. работа серверной части под Linux), поддержка configure && make в Linux, обратная совместимость с .NET 2.0. Большие планы на развитие, в частности на создание мощных инструментов для ГМов (ака квайс) но без доступа к серверу mysql/ssh. Куча фишек, которые в принципе не нужны, но просто интересно было их реализовывать (например модуль CompID). Особенно необходим человек, способный рисовать для клиентской части интерфейс (кнопочки и т.д.). |
03.08.2010, 15:15 | #2 |
Гость
Сообщений: n/a
|
Добрый день.
Не знаю, чего и как вы хотели от синглтона. Ваш код у меня в студии, кстати, без вопросов компилируется. На всякий случай предложу альтернативный вариант, он по-моему лексически проще, может компилёру больше понравится. Код:
public static class TSingleton<T> where T : class { private static Dictionary<Type, object> FInstances = new Dictionary<Type, object>(); private static object Instantiate(Type AType) { ConstructorInfo locInfo = AType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, new ParameterModifier[0]); return locInfo.Invoke(null); } public static T Instance { get { if(!FInstances.ContainsKey(typeof(T))) FInstances.Add(typeof(T), Instantiate(typeof(T))); return FInstances[typeof(T)] as T; } } } Код:
(TSingleton<string>.Instance).Split(); (TSingleton<Form>.Instance).Show(); Вообще, в моем представлении синглтон - паттерн бесполезный и выглядит как: Код:
public sealed class TSingle { private static readonly TSingle FInstance = new TSingle(); public static TSingle Instance { get { return FInstance; } } } C# я вроде худо-бедно знаю, но поучаствовал бы в чем-нибудь полезном. Правда, в разработке мангоса я человек новый и многое надо будет мне рассказывать. Но некоторый интерес и чуть-чуть времени есть. Опять-таки, сочиняю я не на моне и не на линуксе, а на винде и студии с фреймворком, но и это обсуждается. Если будет интерес - в личке раззнакомимся ближе. Последний раз редактировалось randle; 03.08.2010 в 15:20. |
Пользователь сказал cпасибо: | LLIbIcpEP (03.08.2010) |
03.08.2010, 15:57 | #3 | |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
Цитата:
А вообще, я использую синглтон для класса, хранящего в памяти конфиги, и класса-интерфейса к мускулу. Очень удобно инициализировать это все при старте сервера, а потом использовать повсеместно в коде без лишних объявлений, конструкторов и инициализаций... PS: Моно это тот же .NET только под линукс. Просто все сервера в основном поднимаются под никсами, вот однажды я и озадачился вопросом, как заставить работать мой ввл-сервер там. Все оказалось довольно просто Разницы в синтаксисе никакой. А проблема, что возникла у меня - это я что то напортачил с версией или сборкой компилятора, но я пока не пойму где именно напортачил, потому и задаю вопросы... То, что вы кодите в винде и в студии ничего страшного - я сам так и кодил долгое время. Между моно и .NET нет различий, если не юзать всякие qt и так далее http://code.google.com/p/wwl3-server/ http://code.google.com/p/wwl3/ вот репо проектов, если интересно - пишите номер аськи в ЛС. Код кривоват, но все это писалось год назад, сейчас я уже поднабрался уму-разуму и потихоньку начал исправлять) Вот сейчас протокол делаю человеческий, вообщем doc/TODO там все есть... |
|
03.08.2010, 16:16 | #4 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
ЗЫ. и не понимаю, зачем изобретать велосипед, если есть готовый класс Settings, никаких хлопот не будет с настройками и их хранением... загрузка данных Код:
_tbHost.Text = Settings.Default.Host; _tbPort.Text = Settings.Default.Port; _tbUser.Text = Settings.Default.User; _tbPass.Text = Settings.Default.Pass; Код:
Settings.Default.Host = _tbHost.Text; Settings.Default.Port = _tbPort.Text; Settings.Default.User = _tbUser.Text; Settings.Default.Pass = _tbPass.Text; Settings.Default.Save(); Последний раз редактировалось Konctantin; 03.08.2010 в 16:22. |
|
Пользователь сказал cпасибо: | LLIbIcpEP (03.08.2010) |
03.08.2010, 16:19 | #5 | |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
Цитата:
PS: А в каком формате храняться конфиг-файлы класса Settings? Последний раз редактировалось LLIbIcpEP; 03.08.2010 в 16:26. |
|
03.08.2010, 16:25 | #6 | |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Цитата:
http://github.com/LordJZ/spellwork_c...ySQLConnect.cs вот посмотрите, один раз идет подключение, а потом делайте что хотите, пока не закроете соединение... ЗЫ... сори, не тут, тут идет закрытие, но все зависит от вас, как сделаете, так и будет... просто после команды не закрываайте соединение... Последний раз редактировалось Konctantin; 03.08.2010 в 16:28. |
|
Пользователь сказал cпасибо: | LLIbIcpEP (03.08.2010) |
03.08.2010, 16:34 | #7 | |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
Цитата:
Но потом делал анализатор гм-логов, и увидел как все это криво работает. В строке отключил пулинг, и перестал закрывать соединение - все заработало намного быстрее. Вот как у меня: http://code.google.com/p/wwl3-server.../DB/DBLayer.cs PS: А используется это все примерно так: http://code.google.com/p/wwl3-server.../DB/DBWorld.cs http://code.google.com/p/wwl3-server.../DBProvider.cs Последний раз редактировалось LLIbIcpEP; 03.08.2010 в 16:41. |
|
03.08.2010, 16:58 | #8 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
я не уверен в том, что Singleton оправдает ваши надежды, да, он создаст единый экземпляр, и вы будуте работать с этим экземпляром, но на сколько я знаю сам Singleton, при использовании его в мульти-поточной среде, в самом этом класе юзается lock, так что проще всего раз сделать подключение, и потом вызывать статик метод, с действием, предварительно сделав lock.
ЗЫ. получится то же самое... ИМХО. |
Пользователь сказал cпасибо: | LLIbIcpEP (03.08.2010) |
03.08.2010, 20:39 | #9 | |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
Цитата:
PS: Я говорю вовсе не о потоках подключаемых клиентов (они у мена асинхронно обрабатываются), просто есть поток, обрабатывающий очередь электронной почты, есть поток генерирующий различную статистику, и еще поток, в котором работает асинхронный сервер. Т.е. потоки использующие DBLayer вовсе не связаны наследственными связями. PPS: Или вы имеете ввиду каждый раз инициализировать новое соединение и подключаться? Но это вообще накладно по ресурсам... Последний раз редактировалось LLIbIcpEP; 03.08.2010 в 21:00. |
|
03.08.2010, 22:23 | #10 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Нет, ну почему же, на стадии включения сервера, вы осуществляете подключение к БД., в статик классе оно так и остается открытым. Далее, используя lock вы просто выполняете команды (чтение запись) при этом не закрывая соединение, его можно будет закрыть, когда вы завершите работу с программой.
Вот пример программы, которая выполняет запросы из разных потоков: PHP код:
Последний раз редактировалось Konctantin; 03.08.2010 в 22:39. |
Пользователь сказал cпасибо: | LLIbIcpEP (03.08.2010) |
03.08.2010, 22:44 | #11 |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
Классно, спасибо, это все упрощает. Хотя не обьясняет, почему не компилилось... наверное умный дебиан хотел мне показать, какой бред я накодил
А еще вопрос, про mysql-connector .NET. Кто знает, как там правильно реализовать пулл соединений его родными средствами? То, как пишется в мануале на сайте мускула - работает гораздо медленнее, чем если не использовать пулл вовсе и держать соединение открытым. Но если мне нужно несколько одновременных соединений... я в принципе уже свыкся с мыслью, что мне придется собственный пулл организовывать, но может кто знает решение получше? |
03.08.2010, 22:50 | #12 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Вообще-то пулл нужен в том случае, если запросы будут выполняться долго (сложная выборка) и такие запросы будет создавать каждый поток. Но я не думаю что у вас такое будет...
ЗЫ. Как показывает практика, к примеру офис с 20 клиентами, частота возникновения параллельных операций крайне мала (или же это доказывает, что никто нифига не делает) |
03.08.2010, 22:54 | #13 |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
И тем не менее, проект образовательный, интересно же...
|
03.08.2010, 22:55 | #14 |
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
ну тогда надо погуглить, черт интересно ведь стало, никогда с таким не работал...
|
Пользователь сказал cпасибо: | LLIbIcpEP (03.08.2010) |
03.08.2010, 23:00 | #15 |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
Из того, что я нагуглил: встроенный пулинг в коннектор активируется опцией Pooling=true, тогда при использовании Close() физически соединение не закрывается а идет в пулл. Время жизни соединения в пуле, и максимальное-минимальное количество соединений указываются отдельными опциями. Эту технологию я и использовал, пока не довелось написать небольшую тулзу с использованием моего DBLayer, которая парсит ГМ-лог (достаточно большой) на предмет .learn и выводит инфу о гме, таргете гма и так далее в датагрид. Вообщем все это происходило невообразимо долго... пока я не убрал пулинг к чертям и не оставил соединение открытым на все время работы программы. Вот и решил, что придется реализовывать пулинг самому. Но может в встроенном пулинге есть какой секрет...
|
15.08.2010, 16:41 | #16 |
Новичок
Регистрация: 08.03.2010
Сообщений: 26
Сказал(а) спасибо: 1
Поблагодарили 4 раз(а) в 4 сообщениях
|
LLIbIcpEP, хорошая большая статья по потокам, а так же как сделать пул потоков... и вообще много полезного
Работа с потоками в C# ч1 Работа с потоками в C# ч2 |
Пользователь сказал cпасибо: | LLIbIcpEP (15.08.2010) |
15.08.2010, 17:16 | #17 |
Новичок
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
|
Спасибо, это я читал года два назад
Только в теме речь идет не о самописном пуле потоков, и вообще не о пуле потоков, а о пуле соединений, реализованном в mysql-connector. Если я не пойму, как его юзать правильно, со временем придется самому реализовывать этот пул соединений, с блекджеком и шл*хами PS: Кстати серверная часть лаучнера уже близка к релизу, сейчас шлифую код... На днях возьмусь перепиливать клиента. |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[10952] Don't use singleton to access static functions. | newsbot | CMaNGOS Commits | 0 | 03.01.2011 14:00 |
[10273] Avoid some redundent and recursive calls to SpellMgr singleton. | newsbot | CMaNGOS Commits | 0 | 26.07.2010 16:00 |