ORMLite OpenDbConnection提供AccessViolationException

时间:2013-07-27 09:04:29

标签: database oracle connection servicestack ormlite-servicestack

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

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

0 个答案:

没有答案