使用RestXQ服务打开的文件太多

时间:2015-01-06 15:41:49

标签: linux exist-db restxq

我在Debian服务器上安装了一个eXist 2.1(版本eXist-db-setup-2.1-rev18721),在该服务器上设置了一个非常简单的RestXQ服务:

declare
    %rest:PUT("{$content}")
    %rest:path("/foo")

function init:init($content as node()*) as item()+ {
    let $log := util:log("INFO", " test")
    let $id := $content/Identifiant/text()
    let $mypath := "/db/test/"
    let $finalpath:=xmldb:store($mypath, concat($id,".xml"),$content)
    let $code := if($finalpath="") then(500) else(201) 
    return (
    <rest:response>
        <http:response status="{$status}">
            <http:header name="Content-Type" value="application/xml; charset=utf-8"/>
        </http:response>
    </rest:response>
    ,$finalpath)
};

当我调用使用它的脚本时,没有问题。

但后来我尝试构建一个脚本,将服务称为2 000次(简而言之,我想在数据库中放置2 000个不同的文件,每个文件都相当小,如100行)。

如果我启动一次,没问题;如果我第二次尝试,那么我会在一段时间后得到一些错误,然后在仪表板上遇到一些问题(根本没有响应),但xmlrpc客户端和其余访问仍然有效,直到我重新启动eXist。

在restxq.log中,我看到了:

引起:java.io.FileNotFoundException:/tmp/_mmtfm_c1600dd8-7203-442c-986b-90328917d6b5/mmtf_1418203231259112417444648192085.tmp(打开的文件太多)。

所以我在linux系统中检查eXist的pid,并且使用lsof,我看到eXist进程使用了​​超过4 000个文件。经过多次实验,4324(或4325)似乎是出现问题的极限。

如果我重新启动eXist,该过程使用450个文件;每次我想调用Web服务时,都会在exists / tools / jetty / tmp /中创建一个文件(和文件夹),然后由进程使用。

有没有人在这个问题面前? PUT完成后为什么不释放这些文件?

谢谢,新年快乐^^

1 个答案:

答案 0 :(得分:0)

@lomobob,您还将此问题发布到了现有开放的邮件列表中。我可以建议你在一个或另一个地方提出这个问题,以免重复工作!