最近老和Oracle过不去;Oracle也老和我过不去。
这次的毛病如下:
我的程序是一个Socket Client,并且连接SQL Server 2000和Oracle 9i,把Oracle 9i中的部分数据放进SQL Server 2000。我的环境是Windows XP,Socket Server在本地。程序在我的环境中运行的好好的;但是到正式的测试环境,内存不停的增长,几乎以1秒钟60KB的速度。正式的测试环境是Windows 2000, 其他机器上的Socket Server以及Oracle 8i。
如果是程序逻辑的问题,那么在正式的测试环境中的问题在我的机器上肯定也能出现。如果是OS的问题,可惜我在公司的2000机器上也没有重现。所以想来想去觉得是ODBC或者Oracle版本上的差异。
(调试过程略)
......
......
......
最后发现,是Prepared Statement的问题。Prepared Statement在Oracle 8i中第一次出现,在Oracle 9i中有了很大的改进。我的做法是,Prepare一个Statement,不停的执行,在DBDisconnect之前End Transaction。可惜,在Oracle 8i的ODBC环境中,Prepared Statement在本地执行的时候,每次都新占用本地的内存空间,导致内存不停的增长。
因此在Oracle 8i的ODBC环境中,要么用普通的Statement(效率稍低),要么每次End Transaction。
另外,在调查的时候发现如下资料:
The Oracle8 ODBC Driver does not support the following ODBC 3.0 features:
·Interval data types
·SQL_C_UBIGINT and SQL_C_SBIGINT C data type identifiers
·Binding parameters by name
·Multiple environment handles
·Shared connections
·Shared environments
·The SQL_LOGIN_TIMEOUT attribute of SQLSetConnectAttr
不过话说回来,现在谁还用8i呀......现在我的时间是2005年4月8日凌晨1点22分,刚把Prepared Statement改成普通的,正在等待正式环境的测试结果......