.NET ORM, который поддерживает многопоточность лучше? - PullRequest
3 голосов
/ 04 декабря 2010

Я знаю, что вопросы о .net ORM задавались тысячи раз, но я хочу знать, с каким ORM легко работать в многопоточной среде. Коммерческие или бесплатные приветствуются.

В настоящее время я использую XPO от Devexpress, но мне неудобно использовать его в многопоточном приложении. Объект из одного потока не может быть разделен другим потоком, чтобы использовать его в другом потоке, мне нужно найти объект из БД с помощью ключа, это действительно раздражает. Вы не можете сохранить состояние объекта БД в БД, даже если заблокируете состояние объекта. например метод Save () не может быть вызван из другого потока, кроме того, который создает объект.

Кстати, я только начинаю с XPO, возможно, я использую его неправильно.

Ответы [ 3 ]

1 голос
/ 04 декабря 2010

nHibernate использовался во многих приложениях, некоторые из которых являются многопоточными.

См. Документацию по параллелизм , в частности, раздел 10.2 - этоясно говорит, что ISession является не поточно-ориентированным (так что вам нужно управлять этим самостоятельно).

Не могли бы вы уточнить, что сделает ORM "простым в работе", насколькоВы обеспокоены?

0 голосов
/ 04 декабря 2010

ObjectContext в Entity Framework не является поточно-ориентированным, поэтому вам, вероятно, придется реализовать свой собственный с привязкой к нему, если вы хотите использовать его как общий ресурс.

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

Кроме того, наличие ObjectContext для каждого потока может привести к устареванию данных.Как указано ниже:

И последнее, но не менее важное, конечно, это вопрос многопользовательского параллелизма.ObjectContext кэширует свои сущности навсегда до тех пор, пока не будет уничтожен.Если другой пользователь изменяет те же сущности в своем собственном ObjectContext, владелец первого ObjectContext никогда не узнает об этом изменении.Эти проблемы с устаревшими данными могут быть крайне затруднены для отладки, потому что вы можете наблюдать, как запрос отправляется в базу данных и возвращается с новыми данными, но ObjectContext перезапишет его старыми устаревшими данными, которые уже находятся в кэше.Это, на мой взгляд, вероятно, самая важная причина, чтобы избежать долгоживущих экземпляров ObjectContext;даже если вы думаете, что закодировали его для получения самых последних данных из базы данных, ObjectContext решит, что он умнее вас, и вместо этого вернет вам старые объекты.

EntityКонтекст объекта Framework в объекте сеанса ASP.NET?

0 голосов
/ 04 декабря 2010

Каждый O / RM отлично работает в многопоточном приложении. Я использовал LINQ to SQL и Entity Framework в приложениях ASP.NET (которые являются многопоточными по определению).

Если у вас возникли проблемы с использованием O / RM в многопоточной среде, возможно, вы используете его неправильно. Например, большинство инструментов O / RM имеют тип, который реализует шаблон единиц работы (например, LINQ to SQL DataContext, Entity Framework ObjectContext и XPO Session). Единица работы предназначена для создания и управления одним потоком. Если вы используете такой объект таким образом, у меня никогда не возникало проблем с использованием инструмента O / RM в многопоточной среде.

...