2

我正在使用 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+ 兼容)。

我真的很想避免在每次通话时测试连接是否有效,因此非常感谢任何有助于完成这项工作的帮助。谢谢

4

0 回答 0