1

我有一些代码使用完成后需要关闭的数据库链接。我打电话DBMS_SESSION.Close_database_link,但它给了我错误,ORA-02080,即使链接不再使用。

当我在 SQL*Plus 中尝试它时,它运行良好并在我运行COMMIT. 但是在 .Net 中,即使我运行 commit 它也不会关闭。

using (var con = new Oracle.DataAccess.Client.OracleConnection(@"Data Source=firefly8;User Id=USER;Password=PWD;Pooling=false;"))
            {
                con.Open();
                var c = con.CreateCommand();
                c.CommandText = "select a from tnoam@link_2";
                using (var r = c.ExecuteReader())
                {
                    r.Read();
                }
                c.Dispose();

                var c2 = con.CreateCommand();
                c2.CommandText = "begin commit; dbms_session.close_database_link ('link_2');end;";

                c2.ExecuteNonQuery();
            }

我很坚持这个。请帮忙

根据@Ben 的评论,我尝试了以下方法,但效果不佳:

    using (var con = new Oracle.DataAccess.Client.OracleConnection(@"Data Source=firefly8;User Id=MILK_NEW;Password=MILK_NEW;Pooling=false;"))
{
    con.Open();
    var t = con.BeginTransaction();
    var c = con.CreateCommand();
    c.Transaction = t;
    c.CommandText = "select a from tnoam@link_2";
    using (var r = c.ExecuteReader())
    {
        r.Read();
    }
    t.Commit();
    c.Dispose();

    var c2 = con.CreateCommand();
    c2.CommandText = "begin commit; dbms_session.close_database_link ('link_2');end;";

    c2.ExecuteNonQuery();
}
4

1 回答 1

1

感谢@Luke,我上路并找到了解决方案。

似乎默认情况下,Oracle 会缓存游标并使其保持打开状态。如果游标打开,则无法关闭数据库链接。

连接字符串中控制游标缓存的标志是:

Statement Cache Size

可以通过调用OracleConnection类PurgeStatementCache的缓存方法手动清除缓存

于 2012-06-10T14:25:44.890 回答