我正在测试 ServiceStacks OrmLite。我以前使用过没有 OrmLite 的 MySql,现在我遇到了这个错误消息中最容易描述的问题:
已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭它。
由于我有一个多线程应用程序,某些线程将轮询数据库,而其他线程将在需要时插入、更新或选择“按需”。这导致上述异常。
我需要做的是能够检测连接(IDbHandler)是否“忙”;有一个开放的 DataReader 或其他东西。如果它很忙,请进行下一个连接(来自我要实现的“连接池”)。问题是,我无法在 IDbHandler 对象中使用任何方法或属性来确定它是否忙。
我在“正常” mysql 案例中解决了这个问题,只需使用一个方法,我发送 MySqlCommand 或仅发送查询字符串,例如:
dbConnections.ExecuteQuery("SELECT * FROM test");
dbConnections.ExecuteQuery(cmd); // cmd == MySqlCommand
并且 ExecuteQuery 将处理找到一个打开的连接并在那里传递 cmd/查询。
但是,由于我使用的是 OrmLite,它有很多 IDbConnection 的扩展方法,我不想为每个方法创建“代理方法”。在上面的简单 mysql 案例中,实际上只需要一个方法,它接受一个 MySqlCommand,但对于 OrmLite 中的许多方法则不然。
第一个问题:
- 如何检测连接是否繁忙?我想避免尝试捕获的情况来检测它。
第二个问题:
- 是否有某种方法可以传递整个“方法”调用,例如:
例子:
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));