我正在测试ServiceStack的OrmLite。我之前使用过没有OrmLite的MySql,现在我面临的问题最容易用以下错误消息来描述:
“已经存在与此连接关联的打开的DataReader,必须先关闭它。”
由于我的应用程序是多线程的,某些线程将轮询数据库,而其他线程将根据需要进行插入、更新或选择操作。这导致了上述异常。
我需要做的是能够检测连接(IDbHandler)是否“忙”,是否有打开的DataReader或其他东西。如果它很忙,就使用下一个连接(从我想要实现的“连接池”中)。但问题是,我无法在IDbHandler对象中使用任何方法或属性来确定它是否忙碌。
在“普通”的mysql情况下,我通过使用一个方法来解决这个问题,其中我发送MySqlCommand或只发送查询字符串,例如:
“已经存在与此连接关联的打开的DataReader,必须先关闭它。”
由于我的应用程序是多线程的,某些线程将轮询数据库,而其他线程将根据需要进行插入、更新或选择操作。这导致了上述异常。
我需要做的是能够检测连接(IDbHandler)是否“忙”,是否有打开的DataReader或其他东西。如果它很忙,就使用下一个连接(从我想要实现的“连接池”中)。但问题是,我无法在IDbHandler对象中使用任何方法或属性来确定它是否忙碌。
在“普通”的mysql情况下,我通过使用一个方法来解决这个问题,其中我发送MySqlCommand或只发送查询字符串,例如:
dbConnections.ExecuteQuery("SELECT * FROM test");
dbConnections.ExecuteQuery(cmd); // cmd == MySqlCommand
ExecuteQuery方法会处理查找打开的连接并将cmd/query传递给它。但是,由于我正在使用OrmLite,它有许多扩展方法到IDbConnection,我不想为每个方法创建“代理方法”。在上面简单的mysql情况下,只需要一个方法,它接受MySqlCommand,但在OrmLite中的许多方法中并非如此。
第一个问题:
- 如何检测连接是否繁忙?我想避免try-catch情况来检测它。
第二个问题:
- 是否有一些方法可以传递整个“方法”调用,例如:
示例:
dbConnections.Run(iDbHandler.Select<MyObject>(q => q.Id > 10));
// or
dbConnections.Run(iDbHandler.Where<MyObject>(q => q.Id > 10));
// or
dbConnections.Run(iDbHandler.SomeOtherWeirdMetod<MyObject>(q => bla bla bla));