Java集合:通过定期作业更新本地数据库的最佳方式

时间:2013-11-27 21:02:56

标签: java collections spring-data-jpa

我有一个基于java的应用程序,它定期从Web服务获取数据并将数据保存到本地数据库。永远不会删除本地数据库中的数据。如果在一段时间内,未从Web服务返回特定记录,则更改本地数据库表中该记录的其中一个标志,以指示它未从Web服务返回。因此,要求是使用从Web服务收到的更改来更新本地数据库,并更新未返回记录的标志。

我编写了以下代码来更新对象级别的状态(在持久化到数据库之前),但我不认为这是最佳的。请告知如何优化此过程?

import java.util.ArrayList;
import java.util.List;

public class ListUpdateTest
{
public static void main(String[] args)
{
    List<Person> local = new ArrayList<Person>(); // records in the local database

    local.add(new Person("firstName1", "lastName1", "email1", true));
    local.add(new Person("firstName2", "lastName2", "email2", true));
    local.add(new Person("firstName3", "lastName3", "email3", true));

    List<Person> remote = new ArrayList<Person>();// returned from the webservice

    remote.add(new Person("firstName1", "lastName1", "email1", true));

    update(local, remote);

}

private static void update(List<Person> local, List<Person> remote)
{
    for (Person localPerson : local)
    {
        if (!remote.contains(localPerson))
        {
            localPerson.setActiveFlag(false);
            // save the updated record to the database
        }
    }

    for (Person remotePerson : remote)
    {
        if (!local.contains(remotePerson))
        {
            // persist to database
        }
        else
        {
            // update local record
        }
    }
}
}


class Person
{
int     id;
String  firstName;
String  lastName;
String  email;
boolean activeFlag;

public Person(String firstName, String lastName, String email, boolean activeFlag)
{
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    this.activeFlag = activeFlag;
}

public int getId()
{
    return id;
}

public void setId(int id)
{
    this.id = id;
}

public String getFirstName()
{
    return firstName;
}

public void setFirstName(String firstName)
{
    this.firstName = firstName;
}

public String getLastName()
{
    return lastName;
}

public void setLastName(String lastName)
{
    this.lastName = lastName;
}

public String getEmail()
{
    return email;
}

public void setEmail(String email)
{
    this.email = email;
}

public boolean isActiveFlag()
{
    return activeFlag;
}

public void setActiveFlag(boolean activeFlag)
{
    this.activeFlag = activeFlag;
}

@Override
public boolean equals(Object obj)
{
    if (obj == this)
    {
        return true;
    }
    if (obj == null
        || obj.getClass() != this.getClass())
    {
        return false;
    }

    Person guest = (Person) obj;
    return id == guest.id
        && (firstName == guest.firstName || (firstName != null && firstName.equals(guest
            .getFirstName())))
        && (lastName == guest.lastName || (lastName != null && lastName.equals(guest
            .getLastName())));
}

@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime
        * result + ((firstName == null)
            ? 0 : firstName.hashCode());
    result = prime
        * result + id;
    result = prime
        * result + ((lastName == null)
            ? 0 : lastName.hashCode());
    return result;
}

@Override
public String toString()
{
    return "Person [id="
        + id + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email
        + ", activeFlag=" + activeFlag + "]";
}
}

要完成这些数据库操作,我使用的是Spring数据jpa。

2 个答案:

答案 0 :(得分:1)

在执行更新之前,您可以在数据库中的每个Person记录上将boolean设置为false。然后,所有更新的Person记录将被设置回true。

答案 1 :(得分:0)

我不确定你的案例的布尔标志有多大用处。我个人会选择一个计数器,每当一个人被提取时,该计数器会再次增加。这将允许获得一些有用的(统计)信息而不是布尔值true / false(也很容易搞乱)。
关于优化,请勿使用for循环 使用类似:UPDATE table set flag=false WHERE id NOT IN(...)传递数据库提取的人ID。不确定您是否使用某种ORM,这就是您在OP中显示包含对象的代码的原因