因此,根据my previous question的答案,如果在事务期间打开多个连接,则事务做从LTM升级到DTC,即使连接都具有相同的连接连接字符串。
所以,我的下一个问题是,可以采用哪些策略来避免这种“功能”?在我看来,基于资源使用,我想确保尽可能多地使用LTM。在正确的面向对象的业务逻辑层中,我能想到的唯一方法是在数据访问层创建请求级静态连接对象,并在调用之间共享,直到请求完成(这里隐含的知识)是业务对象实体是谨慎的,不知道他们调用的是什么顺序,另外一个事实是,人们不希望将连接对象冒泡到业务对象层,因为这将是数据存储实现细节流血到另一层)。
是否有其他人有任何想法不能完全破坏n层系统的层封装?
答案 0 :(得分:2)
我使用的是TransactionHelper类更新TableAdapter中的所有命令,以将连接和事务替换为启动事务的TableAdapter中的连接和事务。您可以在Scott Lanford的博客some code that does this上找到CodeExperiment,您可以根据需要进行调整。 Ryan Whitaker有similar approach。
请注意,由于我已经开始使用LINQToSQL,因此我不再遇到此问题。您可能需要考虑使用LINQToSQL或nHibernate作为替代解决方案。要么对本地交易有好的支持。
答案 1 :(得分:0)
我建议编写一个包装类来管理连接,事务,命令对象,这就是整个数据库的事情。它是一种非常轻量级的nHibernate。这个类将为executeStatement(...),executeQuery(...),addParameter(...),startTransaction(...)等提供方法。
启动交易时,您可以提供一些(如果需要的唯一)标识符,您可以将有关同一交易的所有后续请求绑定到该标识符。然后,这个包装器类将保存一个静态映射,事务正在该静态映射与哪个连接运行,并且会自动使用正确的映射或根据需要创建一个新映射。
您将获得此方法的一些额外功能,因为您将集中所有持久性内容:
答案 2 :(得分:0)
我不得不问,尝试如此努力避免DTC的原因是什么?在这个或之前的答案中没有提到为什么和它会遇到过早期优化综合症。
答案 3 :(得分:0)
正如卡斯珀所说,避免DTC可能为时过早,尽管它是一个重要的重量。您可以使用静态工厂实现连接,以便只返回新对象,然后如果确定您遇到问题,可以实现一种机制,可以将事务存储在TLS(如果您的ASP中,则为httpcontext)。而且不必更改任何代码。
这个问题实际上已经被提出并得到了回答,但是当我这样做时我找不到它。我会更新。