我正在使用 ServiceStack 和 OrmLite.Oracle。我在 Windows Server 2012 x64 上使用 ODBC Driver for Oracle 连接到旧的 Oracle 7.3 实例。ODBC 设置为 ODBC32。
我像这样从我的仓库连接并查询数据库:
using (IDbConnection db = _context.DbFactory.OpenDbConnection())
{
return db.Select<T>();
}
_context 保存 OrmLiteConnectionFactory,它是这样创建的:
DbFactory= new OrmLiteConnectionFactory(conInfo.ConnectionString,false, ServiceStack.OrmLite.Oracle.OracleDialect.Provider);
我的服务运行良好,我可以访问和查询数据库,没问题。但经过一段时间(30 分钟左右)后,连接丢失,我必须重新启动我的服务(托管在 Windows 服务中),因为调用打开连接会给我这个错误:无法分配环境处理。
一段时间后释放连接的句柄可能是正常的事情,但为什么它根本不重新连接呢?从 OrmLite 代码中,我可以看到当 AutoDisposeConnection 设置为 True 或内部 ormLiteConnection 为空时,OpenDbConnection 应该返回其连接的新实例。我想我的连接不是空的,但不是很活跃......
private OrmLiteConnection ormLiteConnection;
private OrmLiteConnection OrmLiteConnection
{
get
{
if (ormLiteConnection == null)
{
ormLiteConnection = new OrmLiteConnection(this);
}
return ormLiteConnection;
}
}
public IDbConnection OpenDbConnection()
{
var connection = CreateDbConnection();
connection.Open();
return connection;
}
public IDbConnection CreateDbConnection()
{
if (this.ConnectionString == null)
throw new ArgumentNullException("ConnectionString", "ConnectionString must be set");
var connection = AutoDisposeConnection
? new OrmLiteConnection(this)
: OrmLiteConnection;
return connection;
}
我曾尝试将 AutoDisposeConnection 设置为 True,但是当我这样做时,我总是会收到 AccessViolationException 提示“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”。这意味着什么?这是操作系统、ODBC 还是 OrmLite 错误?知道为什么会这样吗?
我不得不说,因为我使用的是 Oracle 7.3,我不得不重新编译 ServiceStack.OrmLite.Oracle.dll,所以它使用 System.Data.Odbc 而不是 System.Data.OracleClient(仅与 v8+ 兼容)。
我真的很想避免在每次通话时测试连接是否有效,因此非常感谢任何有助于完成这项工作的帮助。谢谢