我使用SWI-Prolog ODBC interface连接Oracle Xe 12.0数据库。重复使用系统后,我收到ORA-01000错误,"超过打开游标的最大数量&#34 ;;然后迫使我重新启动应用程序。
StackOverflow上有很多关于此错误的问题,但没有一个与SWI-Prolog ODBC接口有关。我使用代码(下面采样)进行了调查和测试,发现调用odbc_prepare/4
然后调用odbc_execute/3
不释放ODBC语句对象。
这是我跑的测试。连接后(使用适当的DSN,用户和密码):
:- odbc_connect(DSN,C,[user(USER),password(PASSWD),alias(swi),open(once)]).
我的测试谓词,其中' a_table'是数据库中的一个表,其中包含列' colname':
go_test(N):-
N1 is N+1,
write(N1),nl,
odbc_prepare(swi,'select count(colname) from a_table',[],Statement),
odbc_execute(Statement,[]),
%(point of change)
go_test(N1).
打印最多300次然后崩溃并出现错误(这正是我所期望的,因为在SQL Plus中运行select value from v$parameter where name = ‘open_cursors’;
告诉我300)。
替换" %(变更点)"使用odbc_free_statement(Statement),
,go_test
似乎无限期地运行。
然而,虽然(我想),但我已在我的计划中将每个odbc_prepare
和odbc_execute
与odbc_free_statement
配对;我仍然在(更多)使用后得到错误。还有什么可能导致这个"光标泄漏"?
我意识到我可以在SQL Plus中运行查询以尝试识别连接游标使用量的增加,但似乎很难在Prolog应用程序中与谓词调用协调。真正帮助我的是通过SWI-Prolog的ODBC接口查询当前连接使用的游标数量的方法。理想情况下,odbc_get_connection
之类的东西可以做到;但properties没有一个是我正在寻找的。如何通过SWI-Prolog ODBC接口找出活动连接游标的数量?