使用Java HashMap作为数据库的缓存

时间:2016-01-07 18:33:38

标签: java jdbc

遇到讲师提供的这段示例代码,并注意到一些奇怪的事情:在执行新的插入查询之前必须清空数据库中的数据(我假设避免数据库中的冗余数据)。

有没有办法避免这种通过散列图将数据插入数据库的迂回方式?

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并同时将数据插入数据库(可能是使用不同的线程)会有所改进吗?

2 个答案:

答案 0 :(得分:1)

您可以让另一个线程永远运行,定期检查缓存,并根据您可以配置的间隔参数(例如,每10秒一次)将数据库与缓存同步。 但要注意并发! 这是你在找什么?

答案 1 :(得分:1)

很容易对我说,但我必须说:“尽快离开课程。”

为自己缓存一些数据没什么不好,但总的来说,你不会比SQL数据库更好。

在某些情况下,您需要在填充数据之前截断表格,但在需要时您将确定这些情况。

在这种情况下,当您拥有一组Customers时,需要将它们全部插入到数据库中。您可以查询数据库以获取需要更新的客户,更新这些客户并插入其他客户。

例如,在mysql数据库中,你可以这样做:

INSERT .. ON DUPLICATE KEY UPDATE ..

因此,如果您在数据库中有一些唯一索引,则可以在一个语句中“插入或更新”它们,即使是一次插入多行也是如此。

在一个驱动我的代码之后插入一行,当所有(我希望如此)sql数据库允许你一次插入它们(通过事务或“多行插入”)。

编辑:在多个线程中使用HashMaps之前,先阅读有关线程安全操作的内容like here