missautumn's BLOG

devote to innovation of technique

通过配置启动参数或连接字符串来跟踪Sybase SQL AnyWhere的SQL语句执行情况

象其他数据系统一样SQL Anywhere在执行sql语句的时候会维持一个db handle,当语句结束调用结束后释放这个handle.我们在开发过程成往往会忘记去释放这个handle或者异常发生后没有对它进行有效的处理,而造成超出连接级数据库属性Max_statement_count 的设定值,进而引起数据库抛错误信息.接下来就这个问题进行分析.
一、如何做到始终释放open的handle
在处理db的框架中每个处理函数都应该象下面一样处理
try
{
   //execute sql
}
catch(...)
{

}
finally
{
   //handle dispose codes snippet
}

二、如何通过配置db启动选项来找到你犯的错
sybase提供了一些很好的启动参数可以让你抓出你想要的sql log,这里我只介绍 -zr 和 -zo
1.-zr
语法:
 -zr { all | SQL | none | SQL+hostvars } ...
可取值 ALL、SQL、NONE 或 SQL+hostvar。ON 和 ALL 是等效的。OFF 和 NONE 是等效的。此调用对发送到数据库服务器的各 SQL 语句启用日志,以便用于疑难解答,此选项同数据库服务器选项 -zr 和 -zo 一起使用。

如果将 -zr设置为 OFF,则会关闭请求日志文件。

如果选择 SQL,则仅记录以下类型的请求:

START DATABASE

STOP ENGINE

STOP DATABASE

语句准备

语句执行

EXECUTE IMMEDIATE 语句

选项设置

COMMIT 语句

ROLLBACK 语句

PREPARE TO COMMIT 操作

连接

断开连接

事务开头

DROP STATEMENT 语句

游标解释

游标关闭

游标重新开始

错误

将 -zr 设置为 SQL+hostvar 时将在日志中输出 SQL和 主机变量值。

使用 property('RequestLogging') 可以得到 -zr 设置的当前值。
2.-zo
语法:
-zo filename...
将请求记录信息重定向到与常规日志文件不同的文件中

三、通过得到的log文件得到你未释放的handle
log 片断
每一个handle必须经过Prepare->Drop_Stmt这个过程,而如果我们在代码中忘记释放handle的话log中是不会有对应的DROP_STMT语句的。
可以通过Prepare后的句柄号来查找对应的DROP_STMT语句(如代码中的第2行和第37行),如果没找到的话那可以查看对应的sql语句从而找到对应的代码。

整理的比较仓促,如有考虑不周指出请帮我指出。同时希望这篇文章对你有所帮助。

posted on 2007-07-05 18:06 william 阅读(2287) 评论(0)  编辑 收藏 引用 所属分类: Database(MSSQL,Oracle,Sybase)


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理