我有一个用java编写的小实用程序,它从Postgresql数据库获取大量记录并将它们放入Solr。
在Solr记录中建立索引后,必须在Postgresql中将其标记为索引。 为此,我采用Postgresql程序并传递给它的记录数组'主键。
这是用于标记的java过程的片段:
private void IndexDocumentsAndMark() throws SolrServerException, IOException, SQLException {
logger.debug("Indexing start execution ...");
UpdateResponse resp = solrClient.add(documents, solrCommitTimeOut);
if (resp.getStatus() != 0) {
logger.error("Indexing error: " + resp.getStatus());
} else {
logger.debug("Indexing completed. Indexed " + documents.size() + " documents ...");
logger.debug("Solr commit start execution ...");
solrClient.commit(); // Needs to be done in every bulk
logger.debug("Solr commit completed ...");
// Mark data in Postgresql as completed if bulk indexed successfully and Postgresql procedure for marking in defined
if (databaseQueryStringMark != null) {
// Prepare statement
PreparedStatement pstmt = con.prepareStatement(databaseQueryStringMark);
// Prepare parameters (primary keys)
java.sql.Array array = con.createArrayOf("integer", paramsArray.toArray());
pstmt.setArray(1, array);
logger.debug("Query for mark bulk data as completed start execution ...");
// Execute procedure
pstmt.executeQuery();
logger.debug("Query for mark bulk data as completed execution completed ...");
}
}
}
这个问题的问题是:
如果Postgresql服务器上没有高负载,实用程序工作正常,没有问题。
然而,对于Postgresql的高负载,服务器标记过程(Postgresql过程)的工作时间足够长(大约两个小时)。标记过程(完成Postgresql程序)后我可以看到我的java进程在内存中。它没有终止。
Postgresql函数的代码是
CREATE OR REPLACE FUNCTION affiliates_service_json_data_mark("id$arr" integer[])
RETURNS void AS
$BODY$
declare
begin
update solr_interface.affiliates_json_data
set is_transfered_to_solr = true
where id in (select unnest(id$arr)
);
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION affiliates_service_json_data_mark(integer[])
OWNER TO postgres;
你能否告诉我这个问题的根源在哪里以及如何解决?