首次从数据库中获取所有数据,如果更改了任何条目,则仅打印更改

时间:2013-08-18 07:31:44

标签: java database multithreading

我正在开发一个项目,我需要从数据库中打印出数据。让我们举一个例子,假设在我的数据库中,我只有以下条目 -

Hello 1.0.0
World 1.0.0

然后,我将调用数据库的Java方法将返回上面数据的地图。

我的地图将包含以下数据 -

Key as Hello, Value as 1.0.0
Key as World, Value as 1.0.0

假设,我是第一次启动程序,然后使用下面的代码将它打印出来,这非常好。

{Hello=1.0.0, World=1.0.0}

然后我每2秒运行一次后台线程,它将调用数据库并从数据库中再次获取所有数据。并且每两秒钟,它会打印出相同的东西 - (并且我的代码根据它正常工作)

{Hello=1.0.0, World=1.0.0}

现在有趣的是,假设我的应用程序正在运行,并且有人像这样更改了数据库条目 -

Hello 1.0.1
World 1.0.0

意思是,版本因Hello而改变,现在它是1.0.1并且我的应用程序正在运行,所以现在它将打印出来的代码基于我的代码?像这样的东西 -

{Hello=1.0.1, World=1.0.0}

但这不是我要找的东西。它应该打印出如下所示,仅表示已更改的条目

{Hello=1.0.1}

我希望问题很清楚。下面是我到目前为止的代码。它每次只打印出数据库中的所有条目,这不是我想要的。

我想在程序第一次启动时打印出所有内容,但是如果程序启动后,它应该只打印出已更改的内容或任何新条目。

以下是我的代码: -

public class Graph {

    public static Map<String, String> bundleList = new LinkedHashMap<String, String>();

    public static void main(String[] args) {

        getAttributesFromDatabase();

        printOutBundleInformation();

        loggingAfterEveryXMilliseconds();

    }

    private static void printOutBundleInformation() {
        System.out.println(bundleList);     
    }

    private static void getAttributesFromDatabase() {

        Map<String, String> bundleInformation = new LinkedHashMap<String, String>();

        bundleInformation = getFromDatabase();

        if(!bundleInformation.isEmpty()) {
            bundleList = bundleInformation;
        }
    }

    private static Map<String, String> getFromDatabase() {

        Map<String, String> hello = new LinkedHashMap<String, String>();

        // In actual scenario, I will have a database call here

        hello.put("Hello", "1.0.0");
        hello.put("World", "1.0.0");

        return hello;
    }


    private static void loggingAfterEveryXMilliseconds() {
        new Thread() {
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException ex) {

                    }
                    getAttributesFromDatabase();
                    printOutBundleInformation();
                }
            }
        }.start();
    }
}

任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

您需要在名为last modified(日期与时间)的表中添加额外的列。每次查询数据库时都会传递上次访问时间(例如getFromDatabase(上次访问时间))。您需要在程序中保留上次访问时间。在查询中,您需要根据上次修改的字段验证上次访问时间。

答案 1 :(得分:0)

MapDifference.html#entriesDiffering()可能就是您所需要的。

又快又脏:

public class Graph {

    public static Map<String, String> bundleList = new LinkedHashMap<String, String>();

    private static Map<String, String> oldBundleList = new LinkedHashMap<String, String>();

    // ...

    private static void getAttributesFromDatabase() {
        Map<String, String> bundleInformation = new LinkedHashMap<String, String>();
        bundleInformation = getFromDatabase();
        if(!bundleInformation.isEmpty()) {
            oldBundleList = bundleList;
            bundleList = bundleInformation;
        }
    }

    // ...

    private static void loggingAfterEveryXMilliseconds() {
        new Thread() {
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException ex) {

                    }
                    getAttributesFromDatabase();
                    final Map<String, ValueDifference<String>> entriesDiffering = Maps.difference(oldBundleList, bundleList).entriesDiffering();
                    if (!entriesDiffering.isEmpty()) {
                       for (String key : entriesDiffering.keySet()) {
                           System.out.println("{" + key + "=" + bundleList.get(key) + "}");
                       } 
                    }
                    // printOutBundleInformation();
                }
            }
        }.start();
    }
}