我有一些使用数据库链接的代码,完成后需要关闭。
我打电话给DBMS_SESSION.Close_database_link
,但它给了我错误,ORA-02080,即使该链接已不再使用。
当我在SQL * Plus中尝试它时,它在我运行COMMIT
之后运行良好且已关闭。但是在.Net中,即使我运行提交它也不会关闭。
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();
}
答案 0 :(得分:1)
感谢@Luke,我找到了解决办法。
默认情况下,Oracle会缓存游标并使其保持打开状态。如果光标处于打开状态,则无法关闭数据库链接。
控制游标缓存的连接字符串中的标志是:
Statement Cache Size
您可以通过调用OracleConnection class
的PurgeStatementCache
缓存方法手动清除缓存