我正在使用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为null时,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,说“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”。那是什么意思?这是OS,ODBC还是OrmLite错误?知道为什么会这样吗?
我必须说,因为我使用的是Oracle 7.3,所以我必须重新编译ServiceStack.OrmLite.Oracle.dll,因此它使用System.Data.Odbc而不是System.Data.OracleClient(仅与v8 +兼容)。
我真的想避免在每次通话时测试连接是否存在,因此非常感谢任何帮助使这项工作。感谢