我使用Apache Jackrabbit
存储PDF,doc文件并使用FileDataStore
作为基础数据存储。设置二进制数据值后,会在临时目录中创建许多临时/假脱机文件(bin * .tmp)。在JVM关闭之前,这些文件永远不会被删除。这些临时文件充斥着tmp目录,导致no space left on device
错误。
以下是代码段:
Node childFileNode = childLeafFolder.addNode(file.pdf, NodeType.NT_FILE);
Node childContentNode = childFileNode.addNode(Node.JCR_CONTENT,
NodeType.NT_RESOURCE);
Property property = childContentNode.setProperty(Property.JCR_DATA, binary);
我尝试调用property.getBinary.dispose()
,指向AbstractQValue dispose()
,并发现它是一个空方法。
我用Google搜索并遇到了JCR-3568,这仍然没有得到解决。我的应用程序运行时间很长,无法经常关机。
看起来我错过了一些东西,因为这可能是一个非常常见的问题。
答案 0 :(得分:0)
jackrabbit-spi-commons库中存在资源泄漏,但仍未修复。当您将文件写入服务器并且文件大小超过64kb时,客户端库会在临时文件夹中创建2份原始文件,但只删除1。 虽然没有修复,但您可以使用解决方法:
public class JcrHelper {
public static Value createBinaryValue(Session jcrSession, InputStream in) throws UnsupportedRepositoryOperationException, RepositoryException {
ValueFactory valueFactory = jcrSession.getValueFactory();
Value value = valueFactory.createValue(in);
return value;
}
public static void discardBinary(Value value) {
if (value instanceof QValueValue) {
QValueValue qValueValue = (QValueValue)value;
qValueValue.getQValue().discard();
}
}
}
在代码中你应该使用Value而不是Binary:
Value value = JcrHelper.createBinaryValue(jcrSession, inputStream);
try {
contentNode.setProperty(Property.JCR_DATA, value);
jcrSession.save();
} finally {
JcrHelper.discardBinary(value);
}
JcrHelper类使用不推荐使用的方法,并且违反了封装,但代码没有泄漏。我认为它唯一可行的解决方法,而二进制实现中的泄漏并未修复。 此外,此代码仅在临时文件夹中创建您的文件的一个副本(将在GC上删除)