Changeset 7891 for RevitalizationWS


Ignore:
Timestamp:
22/02/11 14:31:03 (8 years ago)
Author:
mnagni
Message:

Rewritten the recordset_counter update procedure to use a single UPDATE instead of a loop.

Location:
RevitalizationWS/ws/DiscoveryService/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • RevitalizationWS/ws/DiscoveryService/trunk

    • Property svn:ignore
      •  

        old new  
        11DummyForEclipse 
        2  
        32.settings 
        4  
        53.classpath 
        6  
        74.project 
         5target 
  • RevitalizationWS/ws/DiscoveryService/trunk/src/main/java/ndg/services/discovery/model/SearchAgent.java

    r7773 r7891  
    22 
    33import java.sql.Connection; 
    4 import java.sql.PreparedStatement; 
    54import java.sql.ResultSet; 
    65import java.sql.SQLException; 
     
    109import java.util.Collections; 
    1110import java.util.Comparator; 
     11import java.util.Iterator; 
    1212import java.util.List; 
    1313 
     
    2727import ndg.services.schemas.discovery.RetrieveCriteriaType; 
    2828import ndg.services.schemas.discovery.SearchType; 
     29import ndg.services.schemas.discovery.SearchType.SearchCriteria; 
    2930import ndg.services.schemas.discovery.SpatialType; 
    3031import ndg.services.schemas.discovery.TemporalType; 
    3132import ndg.services.schemas.discovery.TermSearchType; 
    32 import ndg.services.schemas.discovery.SearchType.SearchCriteria; 
    3333 
    3434import org.apache.log4j.Level; 
     
    4545 
    4646        private NdgLogger logHelper = DiscoveryBasic.getInstance().getNdgInstance(SearchAgent.class.getName()); 
    47  
    48         private String updateCounterSQL = "UPDATE original_document SET resultset_count = ? WHERE original_document_filename = ?"; 
    49         private String getValue = "SELECT resultset_count as counter from original_document"; 
    5047 
    5148        private enum OPERATOR { 
     
    418415                return ret; 
    419416        } 
    420  
    421         private void updateCountVal(List<String> documentIDs) throws NdgSQLException, ResourceNotAvailable { 
    422                 Connection conn = DiscoveryBasic.getInstance().getDiscoveryConnection(); 
    423                 boolean commit = false; 
    424                 try { 
    425                         conn.setAutoCommit(false); 
    426                         for (String docId : documentIDs) { 
    427                                 executeUpdateCountVal(conn, docId); 
    428                         } 
    429                         commit = true; 
    430                 } catch (SQLException e) { 
    431                         // NdgMessage msg = new NdgMessage("sql.resultset.parsing.error", 
    432                         // new Object[] { sqlQuery }); 
    433                         throw new NdgSQLException(e); 
    434                 } finally { 
    435                         commitOrRollback(conn, commit); 
    436                 } 
    437         } 
    438  
    439         private void executeUpdateCountVal(Connection conn, String docId) throws NdgSQLException { 
    440                 try { 
    441                         Statement statement = conn.createStatement(); 
    442                         ResultSet rs = statement.executeQuery(getValue); 
    443                         if (!rs.next()) 
    444                                 return; 
    445                         Integer counter = rs.getInt("counter"); 
    446  
    447                         PreparedStatement updateCounter = conn.prepareStatement(updateCounterSQL); 
    448                         updateCounter.setInt(1, counter + 1); 
    449                         updateCounter.setString(2, docId); 
    450                         updateCounter.execute(); 
    451                 } catch (SQLException e) { 
    452                         throw new NdgSQLException(e); 
    453                 } 
    454         } 
    455417         
    456418        private class UpdateCountVal implements Runnable{ 
     
    479441                        Connection conn = DiscoveryBasic.getInstance().getDiscoveryConnection(); 
    480442                        boolean commit = false; 
     443                        int ret = 0; 
    481444                        try { 
    482445                                conn.setAutoCommit(false); 
    483                                 for (String docId : documentIDs) { 
    484                                         executeUpdateCountVal(conn, docId); 
    485                                 } 
     446                                ret = doUpdateVal(conn); 
    486447                                commit = true; 
    487448                        } catch (SQLException e) { 
     
    491452                        } finally { 
    492453                                commitOrRollback(conn, commit); 
    493                         } 
    494                 } 
    495  
    496                 private void executeUpdateCountVal(Connection conn, String docId) throws NdgSQLException { 
    497                         int monitorIndex = 0; 
    498                         while(true) { 
    499                                 try { 
    500                                         doCountVal(conn, docId); 
    501                                         break; 
    502                                 } catch (SQLException e) { 
    503                                         monitorIndex++; 
    504                                         if (monitorIndex > 15) 
    505                                                 break; 
    506                                                 //throw new NdgSQLException(e); 
    507                                 }                        
    508                         } 
    509                 } 
    510                  
    511                 private void doCountVal(Connection conn, String docId) throws SQLException { 
     454                                if (logger.isInfoEnabled()) 
     455                                        logger.info("Updated " + ret + " resultset_counter"); 
     456                        } 
     457                } 
     458 
     459                private int doUpdateVal(Connection conn) throws SQLException {                   
     460                        StringBuffer sb = new StringBuffer(); 
     461                        sb.append("UPDATE original_document SET resultset_count = resultset_count + 1 WHERE original_document_filename ");                                       
     462                        sb.append(" IN ("); 
     463 
     464                        Iterator<String> iter = documentIDs.iterator(); 
     465                        while (iter.hasNext()) { 
     466                                sb.append("'"); 
     467                                sb.append(iter.next()); 
     468                                sb.append("'"); 
     469                                if (iter.hasNext()) 
     470                                        sb.append(", "); 
     471                        } 
     472                        sb.append(") "); 
     473                         
    512474                        Statement statement = conn.createStatement(); 
    513                         ResultSet rs = statement.executeQuery(getValue); 
    514                         if (!rs.next()) 
    515                                 return; 
    516                         Integer counter = rs.getInt("counter"); 
    517                         PreparedStatement updateCounter = conn.prepareStatement(updateCounterSQL); 
    518                         updateCounter.setInt(1, counter + 1); 
    519                         updateCounter.setString(2, docId); 
    520                         updateCounter.executeUpdate();           
    521                 } 
     475                        return statement.executeUpdate(sb.toString()); 
     476                }                
    522477        } 
    523478} 
Note: See TracChangeset for help on using the changeset viewer.