Domino中Java代理循环可能出现问题

王朝java/jsp·作者佚名  2006-05-27
窄屏简体版  字體: |||超大  

前几天在domino后台发现有错误报出:

AllocHandle: OUT OF PRIVATE HANDLES! -- pid 000039F8 Handles used so far 6399, Maximum handles = 16446, error = 0x107

检查程序代码后确定问题出现在一个java定时代理的循环中。

View docView = config.app_db.getView("ALLDOC");

Document middleDoc;

Document curDoc = docView.getFirstDocument();

Vector cal = new Vector();

while (curDoc != null){

middleDoc = docView.getNextDocument(curDoc);

cal = session.evaluate(config.arc_create_fomular, curDoc);

if (cal.get(0).toString().equals("1.0")){

correspond += 1;

}

curDoc = middleDoc;

if (correspond >= config.maxArchive) break;

}

经与ibm工程师联系,给出的回答是:

Each document opened in an agent allocates a private handle. When the document is closed by the agent, the handle is freed. Loops can be tricky. If the document isn't closed after processing, a handle will be allocated for every document processed in the loop.

This isn't a concern in small databases with few documents processed, but in larger databases, it can become an issue.

之后在designer帮助中,找到:

Java has no knowlege of the heavyweight back-end Domino Objects, only the lightweight Java objects representing them. Garbage collection has no effect on Domino Objects unless you first explicitly recycle them.

从而确定,出现的问题是由于没有及时释放domino后台对象造成的。对代码做了如下:

View docView = config.app_db.getView("ALLDOC");

Document middleDoc;

Document curDoc = docView.getFirstDocument();

Vector cal = new Vector();

while (curDoc != null){

middleDoc = docView.getNextDocument(curDoc);

cal = session.evaluate(config.arc_delete_fomular, curDoc);

if (cal.get(0).toString().equals("1.0")){

correspond += 1;

}

curDoc.recycle();

curDoc = null;

curDoc = middleDoc;

middleDoc = null;

if (correspond >= config.maxArchive) break;

}

再执行代理,后台已无错误。

可以得出结论,对于domino的java代理而言,当目标对象是大数据库对象并执行循环时,仅仅在代理的最后对session进行recycle是不够的,在循环中要注意及时的释放资源。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航