遇到讲师提供的这段示例代码,并注意到一些奇怪的事情:在执行新的插入查询之前必须清空数据库中的数据(我假设避免数据库中的冗余数据)。
有没有办法避免这种通过散列图将数据插入数据库的迂回方式?
public void saveCustomers() throws ClassNotFoundException, SQLException {
Statement statement = connection.createStatement();
String query = "delete from customer";
statement.executeUpdate(query);
Iterator customers = HRMS.Customers.entrySet().iterator();
while (customers.hasNext()) {
Customer customer;
Map.Entry customerMap = (Map.Entry) customers.next();
customer = (Customer) customerMap.getValue();
query = "insert into customer (memberId, name, nicn, gender, contact) "
+ "values ('" + customer.getMemberId() + "', '" + customer.getName() + "',"
+ " '" + customer.getId() + "', '" + customer.getGender().toString() + "', '" + customer.getContact() + "');";
statement.executeUpdate(query);
}
}
编辑:清除HashMap
并同时将数据插入数据库(可能是使用不同的线程)会有所改进吗?
答案 0 :(得分:1)
您可以让另一个线程永远运行,定期检查缓存,并根据您可以配置的间隔参数(例如,每10秒一次)将数据库与缓存同步。 但要注意并发! 这是你在找什么?
答案 1 :(得分:1)
很容易对我说,但我必须说:“尽快离开课程。”
为自己缓存一些数据没什么不好,但总的来说,你不会比SQL数据库更好。
在某些情况下,您需要在填充数据之前截断表格,但在需要时您将确定这些情况。
在这种情况下,当您拥有一组Customers时,需要将它们全部插入到数据库中。您可以查询数据库以获取需要更新的客户,更新这些客户并插入其他客户。
例如,在mysql数据库中,你可以这样做:
INSERT .. ON DUPLICATE KEY UPDATE ..
因此,如果您在数据库中有一些唯一索引,则可以在一个语句中“插入或更新”它们,即使是一次插入多行也是如此。
在一个驱动我的代码之后插入一行,当所有(我希望如此)sql数据库允许你一次插入它们(通过事务或“多行插入”)。
编辑:在多个线程中使用HashMaps之前,先阅读有关线程安全操作的内容like here。