2016-05-04 6 views
0

Ich habe ein Spider-Programm erstellt.Warum fügt java.util.list vorherige Daten hinzu, die beim Hinzufügen neuer Daten gelöscht wurden

Es gibt ein Problem, dass einige Daten beim Einfügen von Daten in die MySQL-Datenbank wiederholt werden.

Wenn beispielsweise das Programm die Daten von A eingefügt hat, fügt sie zunächst einige Werte von A Feld in der Datenbank, bevor die Daten von B Einsetzen dann B.

Einsetzen in Datenbank >>>>>

please click to check the exmple

B nicht über die rot-Daten aber noch eingefügt. Ich löschte Liste vor dem Einfügen von B, aber es funktioniert nicht.

Wenn I debuging:

Einfügen A_list [a.size 45, list.size = 45]

list.clear() [list = null]

list = getB()

Einfügen B_list [list.size = 45 + 49 = 94] [B.Size 49]

warum ist die Größe der Liste zu diesem Zeitpunkt 94? Es sollte wieder 49.list Daten von A hinzugefügt werden.

Hier sind meine Codes:

private static void Insert(List<User> rootusers) throws Exception{ 
    String sql="insert into t_userlist(userid,username,rootuserid,rootusername,visited) values(?,?,?,?,?)"; 
    String sqlupdate="update t_userlist set visited=1 where userid=?"; 
    String sqlvisited="SELECT * from t_userlist where visited=1 and userid="; 
    Connection conn=null; 
    PreparedStatement psmt = null; 
    PreparedStatement ps; 
    for(int i=0;i<rootusers.size();i++){ 
     User user=rootusers.get(i); 

     List<User> userlist=htmlParser.parseUserlist(user); 

     if(userlist!=null){ 
      conn=DbUtil.getConn(); 
      conn.setAutoCommit(false); 
      try { 
       for(int j=0;j<userlist.size();j++){ 


         int visitedUser=selectUserID(sqlvisited+"'"+userlist.get(j).getUserid()+"'").size(); 

         psmt=conn.prepareStatement(sql); 
         psmt.setString(1, userlist.get(j).getUserid()); 
         psmt.setString(2, userlist.get(j).getUsername()); 
         psmt.setString(3, user.getUserid()); 
         psmt.setString(4, user.getUsername()); 
         if(visitedUser!=0){ 
          psmt.setInt(5, 1); 
         } 
         else { 
          psmt.setInt(5, 0); 
         } 
         psmt.executeUpdate(); 
         psmt.close(); 
       } 


       ps=conn.prepareStatement(sqlupdate); 
       ps.setString(1,user.getUserid()); 
       ps.executeUpdate(); 
       conn.commit(); 
       ps.close(); 
       DbUtil.closeConn(conn); 
      } catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      }catch (Exception e) { 
       try { 
        if(conn!=null) 
        { 
          conn.rollback(); 
         // conn.setAutoCommit(true); 
        } 
       } catch (Exception e1) { 

        e1.printStackTrace(); 
       } 
      } 

      **userlist.clear();** 
      System.out.println("insert"+user.getUsername()+"successfully"); 
     }else { 
      continue; 
     } 

    } 

} 

die htmlParser.parseUserlist (Benutzer) Codes:

public static ArrayList<User> parseUserlist(User user) throws Exception{ 
    String userlist=GetUserlist.getUserList(user.getUserid());//just return html 
    ArrayList<User> list=new ArrayList<User>(); 
    if(userlist!=null){ 
     Document doc=Jsoup.parse(userlist); 
     Elements users=doc.select("a[usercard]"); 

     for(Element nodeuser:users){ 
      //System.out.println(nodeuser.toString()); 
      User u=new User(); 
      u.setUserid(nodeuser.attr("usercard").substring(3,13)); 
      u.setUsername(nodeuser.text()); 
      u.setRootuserid(user.getUserid()); 
      list.add(u); 
      //System.out.println(u.getUserid()+" "+u.getUsername()); 
     } 
    }else { 
     System.out.println(user.getUsername()+"没有关注任何人"); 
    } 

    //System.out.println(users.toString()); 
    //System.out.println(list.get(1).getUsername()); 
    return list; 
} 

mir bitte helfen!

+0

Sieht aus wie 'htmlParser.parseUserlist (Benutzer)' verwandt ist Dieses Problem ... können Sie hinzufügen, es ist der Code oder sagen Sie uns, welche Bibliothek das ist? – Tom

+0

Ich habe die code.please eine Überprüfung. Es gibt nur eine Liste. – JiaoPaner

+0

BTW: 'sqlvisited +" '"+ userlist.get (j) .getUserid() + "'" 'ist eine Sicherheitslücke ** if ** und nur wenn' getUserid() 'in der Lage ist eine gültige SQL-Zeichenkette zurückzugeben. Verketten Sie nie Datenparameter, auch wenn Ihre Daten direkt von dort kommen die Datenbank selbst ... das heißt "best practice". Verwenden Sie vorbereitete Anweisungen absolut ** immer und überall **, auch wenn es unnötigen Code bedeutet. Noch besser: Verwenden Sie JPA-Kriterien, diese werden automatisch ausgeblendet und sind von Grund auf sicher – specializt

Antwort

0

Ich sehe nichts falsch, das wäre eine Ursache für Ihr Problem in dem Code, den Sie bereitgestellt haben. Eine Sache zu wissen ist, dass list.Clear() nicht dasselbe ist wie list = null; weil eine leere Liste eine Liste ist, die keine Elemente enthält und clear() die Liste leert. In Ihrer Einfügemethode würden Sie besser mit! UserList.isEmpty() tun (sehen, wie Sie immer eine Liste erstellen und im schlimmsten Fall eine leere Liste von ParseUserList.

+0

Das Problem ist gelöst. Dankeschön. Ich werde meinen Code besser Basis auf Ihren Ratschlag ändern – JiaoPaner

Verwandte Themen