我已经使用以下artical
在Dapper中实现了我的DAL但它创建了与db的每个数据库调用的连接。它不重用连接池。我相信我已经关闭并正确处理了连接。
这是如何从服务层调用的示例
dtoList = unitofWork.RegionalSettingRepository.GetCurrencySymbols();
unitofWork.Commit(); // To close the connections
这是存储库调用
public List<CurrencySymbolDTO> GetCurrencySymbols()
{
List<CurrencySymbolDTO> dtoList = null;
try
{
string strSQL = "SELECT * from CurrencySymbol";
dtoList = this.Connection.Query<CurrencySymbolDTO>(strSQL, null, transaction: Transaction).ToList();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
}
return dtoList;
}
有人可以告诉我为什么要为每个数据库调用创建大量连接。 我确实使用以下SQL查询来监视连接数
SELECT
DB_NAME(dbid) as DBName,
COUNT(dbid) as NumberOfConnections,
loginame as LoginName
FROM sys.sysprocesses
WHERE DB_NAME(dbid) ='database name'
GROUP BY dbid, loginame
提前致谢
答案 0 :(得分:0)
您提到的文章非常适合用Dapper学习UoW;我自己开始用那篇文章研究UoW。在实现它以满足我的业务需求时我遇到了类似的问题,并且我对代码进行了一些修改。您可以在this回答中找到详细的代码。
使用此代码,您可以更好地控制连接/事务;你这样称呼它:
使用交易:
@SuppressWarnings("unchecked")
@Component
public class EntityEventListenerRegistry {
@Autowired
private SessionFactory sessionFactory;
/**
* EventListenerRegistry:http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#annotations-jpa-entitylisteners
*/
@PostConstruct
public void registerListeners(){
EventListenerRegistry eventListenerRegistry = ((SessionFactoryImplementor) sessionFactory).getServiceRegistry().getService(EventListenerRegistry.class);
eventListenerRegistry.prependListeners(EventType.PRE_INSERT, EntityListener.class);
eventListenerRegistry.prependListeners(EventType.PRE_UPDATE, EntityListener.class);
}
}
没有交易:
using(DalSession dalSession = new DalSession())
{
UnitOfWork unitOfWork = dalSession.UnitOfWork;
unitOfWork.Begin();
try
{
//Your database code here
unitOfWork.Commit();
}
catch
{
unitOfWork.Rollback();
throw;
}
}