From c6d444ffbbe215ff2cac1ecf07062ce444309545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E9=B9=8F=E7=A8=8B?= Date: Sun, 1 Nov 2015 13:23:21 +0800 Subject: [PATCH] Remove the codes which create a new HttpSolrServer for each method invocation. Create a HttpSolrServer for each EJB and reuse it for each method call. --- .../iq/dataverse/AutoCompleteBean.java | 11 ++++- .../iq/dataverse/search/IndexServiceBean.java | 45 +++++++++++-------- .../dataverse/search/SearchServiceBean.java | 17 ++++++- .../search/SolrIndexServiceBean.java | 23 +++++++--- 4 files changed, 70 insertions(+), 26 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/AutoCompleteBean.java b/src/main/java/edu/harvard/iq/dataverse/AutoCompleteBean.java index da3b1ff8abb..3f3d9e2a84e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/AutoCompleteBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/AutoCompleteBean.java @@ -24,11 +24,20 @@ public class AutoCompleteBean implements java.io.Serializable { @EJB SystemConfig systemConfig; + + private static SolrServer solrServer; + + public SolrServer getSolrServer(){ + if(solrServer == null){ + solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); + } + return solrServer; + } public List complete(String query) { List results = new ArrayList<>(); - SolrServer solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); + solrServer = getSolrServer(); SolrQuery solrQuery = new SolrQuery(); solrQuery.setParam("qt", "/terms"); solrQuery.setTermsLower(query); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java index 104d256a55c..7415b869f42 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java @@ -38,6 +38,8 @@ import java.util.Set; import java.util.concurrent.Future; import java.util.logging.Logger; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.ejb.AsyncResult; import javax.ejb.EJB; import javax.ejb.EJBException; @@ -99,7 +101,21 @@ public class IndexServiceBean { private static final String DRAFT_STRING = "Draft"; private static final String IN_REVIEW_STRING = "In Review"; private static final String DEACCESSIONED_STRING = "Deaccessioned"; - private Dataverse rootDataverseCached; + private Dataverse rootDataverseCached; + private SolrServer solrServer; + + @PostConstruct + public void init(){ + solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); + } + + @PreDestroy + public void close(){ + if(solrServer != null){ + solrServer.shutdown(); + solrServer = null; + } + } @TransactionAttribute(REQUIRES_NEW) public Future indexDataverseInNewTransaction(Dataverse dataverse) { @@ -193,12 +209,10 @@ public Future indexDataverse(Dataverse dataverse) { solrInputDocument.addField(SearchFields.SUBTREE, dataversePaths); docs.add(solrInputDocument); - SolrServer server = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); - String status; try { if (dataverse.getId() != null) { - server.add(docs); + solrServer.add(docs); } else { logger.info("WARNING: indexing of a dataverse with no id attempted"); } @@ -208,7 +222,7 @@ public Future indexDataverse(Dataverse dataverse) { return new AsyncResult<>(status); } try { - server.commit(); + solrServer.commit(); } catch (SolrServerException | IOException ex) { status = ex.toString(); logger.info(status); @@ -998,15 +1012,13 @@ private String addOrUpdateDataset(IndexableDataset indexableDataset) { } } - SolrServer server = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); - try { - server.add(docs); + solrServer.add(docs); } catch (SolrServerException | IOException ex) { return ex.toString(); } try { - server.commit(); + solrServer.commit(); } catch (SolrServerException | IOException ex) { return ex.toString(); } @@ -1099,17 +1111,15 @@ public static String getDEACCESSIONED_STRING() { } public String delete(Dataverse doomed) { - SolrServer server = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); - logger.fine("deleting Solr document for dataverse " + doomed.getId()); UpdateResponse updateResponse; try { - updateResponse = server.deleteById(solrDocIdentifierDataverse + doomed.getId()); + updateResponse = solrServer.deleteById(solrDocIdentifierDataverse + doomed.getId()); } catch (SolrServerException | IOException ex) { return ex.toString(); } try { - server.commit(); + solrServer.commit(); } catch (SolrServerException | IOException ex) { return ex.toString(); } @@ -1125,17 +1135,16 @@ public String delete(Dataverse doomed) { * https://github.com/IQSS/dataverse/issues/142 */ public String removeSolrDocFromIndex(String doomed) { - SolrServer server = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); - + logger.fine("deleting Solr document: " + doomed); UpdateResponse updateResponse; try { - updateResponse = server.deleteById(doomed); + updateResponse = solrServer.deleteById(doomed); } catch (SolrServerException | IOException ex) { return ex.toString(); } try { - server.commit(); + solrServer.commit(); } catch (SolrServerException | IOException ex) { return ex.toString(); } @@ -1341,7 +1350,6 @@ public List findFilesInSolrOnly() throws SearchException { } private List findDvObjectInSolrOnly(String type) throws SearchException { - SolrServer solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery("*"); solrQuery.setRows(Integer.MAX_VALUE); @@ -1372,7 +1380,6 @@ private List findDvObjectInSolrOnly(String type) throws SearchException { } private List findFilesOfParentDataset(long parentDatasetId) throws SearchException { - SolrServer solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery("*"); solrQuery.setRows(Integer.MAX_VALUE); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SearchServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SearchServiceBean.java index 9a4a2adecd1..2e5e305a4ac 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SearchServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SearchServiceBean.java @@ -31,6 +31,8 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.ejb.EJB; import javax.ejb.EJBTransactionRolledbackException; import javax.ejb.Stateless; @@ -81,6 +83,20 @@ public class SearchServiceBean { SystemConfig systemConfig; public static final JsfHelper JH = new JsfHelper(); + private SolrServer solrServer; + + @PostConstruct + public void init(){ + solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); + } + + @PreDestroy + public void close(){ + if(solrServer != null){ + solrServer.shutdown(); + solrServer = null; + } + } /** * Import note: "onlyDatatRelatedToMe" relies on filterQueries for providing @@ -110,7 +126,6 @@ public SolrQueryResponse search(User user, Dataverse dataverse, String query, Li throw new IllegalArgumentException("numResultsPerPage must be 1 or greater"); } - SolrServer solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); SolrQuery solrQuery = new SolrQuery(); query = SearchUtil.sanitizeQuery(query); solrQuery.setQuery(query); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java index d7d37666bc1..d8bf3497848 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/SolrIndexServiceBean.java @@ -21,6 +21,8 @@ import java.util.Map; import java.util.Set; import java.util.logging.Logger; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.inject.Named; @@ -55,6 +57,20 @@ public class SolrIndexServiceBean { public static String numRowsClearedByClearAllIndexTimes = "numRowsClearedByClearAllIndexTimes"; public static String messageString = "message"; + private SolrServer solrServer; + + @PostConstruct + public void init(){ + solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); + } + + @PreDestroy + public void close(){ + if(solrServer != null){ + solrServer.shutdown(); + solrServer = null; + } + } /** * @deprecated Now that MyData has shipped in 4.1 we have no plans to change @@ -358,7 +374,6 @@ private void persistToSolr(Collection docs) throws SolrServer return; } logger.fine("persisting to Solr..."); - SolrServer solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); /** * @todo Do something with these responses from Solr. */ @@ -500,7 +515,6 @@ public IndexResponse deleteMultipleSolrIds(List solrIdsToDelete) { if (solrIdsToDelete.isEmpty()) { return new IndexResponse("nothing to delete"); } - SolrServer solrServer = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); try { solrServer.deleteById(solrIdsToDelete); } catch (SolrServerException | IOException ex) { @@ -519,10 +533,9 @@ public IndexResponse deleteMultipleSolrIds(List solrIdsToDelete) { public JsonObjectBuilder deleteAllFromSolrAndResetIndexTimes() throws SolrServerException, IOException { JsonObjectBuilder response = Json.createObjectBuilder(); - SolrServer server = new HttpSolrServer("http://" + systemConfig.getSolrHostColonPort() + "/solr"); logger.info("attempting to delete all Solr documents before a complete re-index"); - server.deleteByQuery("*:*"); - server.commit(); + solrServer.deleteByQuery("*:*"); + solrServer.commit(); int numRowsAffected = dvObjectService.clearAllIndexTimes(); response.add(numRowsClearedByClearAllIndexTimes, numRowsAffected); response.add(messageString, "Solr index and database index timestamps cleared.");