我有一个基于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。
答案 0 :(得分:1)
在执行更新之前,您可以在数据库中的每个Person记录上将boolean设置为false。然后,所有更新的Person记录将被设置回true。
答案 1 :(得分:0)
我不确定你的案例的布尔标志有多大用处。我个人会选择一个计数器,每当一个人被提取时,该计数器会再次增加。这将允许获得一些有用的(统计)信息而不是布尔值true / false(也很容易搞乱)。
关于优化,请勿使用for循环
使用类似:UPDATE table set flag=false WHERE id NOT IN(...)
传递数据库提取的人ID。不确定您是否使用某种ORM,这就是您在OP中显示包含对象的代码的原因