2011-03-03 171 views
0

嗨,我在Solaris上使用C语言。我有一个连接到数据库的进程。我需要确定相同的进程是否长时间运行相同的查询(例如15秒),然后我需要断开连接并重新建立数据库连接。终止长时间运行的进程

我知道我可以检查与进程ID相同的 进程。但我 更在意如何确定 如何确定是否有相同的进程是 运行相同的查询?

任何帮助是非常可观的。

+0

您使用的数据库是?某些数据库引擎可以通过SQL访问会话列表(如Oracle的视图V $ SESSION),可以查询该列表。 – Adrian 2011-03-03 16:55:17

+0

我正在使用oracle。 – 2011-03-03 17:02:30

回答

1

如果您直接从客户端开始查询,则可以检查v$session.last_call_et。本专栏显示了此会话最后一次服务器呼叫开始的时间。在这种情况下的服务器调用是执行查询。这是行不通的,你的客户启动一个pl/sql块,并从那里开始查询。在那种情况下,last_call_et将指向pl/sql块的开始,因为这是会话开始的最后一件事。 这可能是最简单的。

它有帮助吗?

罗纳德 - http://ronr.blogspot.com

+0

在我的情况下,可以有多个客户端连接到数据库。因此,对于客户端C1和C2来说,最后一次对数据库的调用可以由C2完成,但是我很有兴趣知道C1执行同一个查询的时间。 – 2011-03-04 17:25:52

+0

如果您的C1会话仍在执行您的查询,您可以通过检查v $ session中该C1会话的last_call_et列来查看它正在运行多长时间。这假定查询由客户端直接执行,而不是使用pl/sql或过程块,因为在那种情况下,last_call_et仅显示最后一次调用运行的秒数。 – 2011-03-15 20:42:58

0

我的建议是,你解决的根本原因,而不是治标。

+0

在我的情况下,你永远不知道哪个查询需要很长时间。所以根本原因是未知的,需要通过计算单个查询的处理时间来找出。 – 2011-03-07 17:48:54

1

“我需要确定相同的进程是否长时间运行相同的查询(比如15秒),那么我需要断开并重新建立数据库连接。”

不知道你在处理什么问题。

如果删除连接,则数据库会话可能会持续一段时间。可能仍然持有锁。另外,如果一个PL/SQL块正在循环并运行1000个查询,每个查询占用十分之一秒,那么应该将它计为1个用于中止逻辑的语句吗?

您可以查看V $ SESSION和SQL_ID或SQL_HASH_VALUE。然后在15秒后再次检查,看看它是否有变化。对于诸如“execute count”或“user calls”之类的东西,您还可以查看v $ sessstat/v $ statname以确定它是长时间运行的同一SQL还是多个SQL调用。