Java 检查MySQL数据库中的更改?

Java 检查MySQL数据库中的更改?,java,mysql,eclipse,Java,Mysql,Eclipse,所以我有一个动态Web项目,它查询MySQL数据库并根据用户需求返回员工信息 例:htp://localhost:8080/Employees/123 //将返回员工123的信息 htp://localhost:8080/Employees //将返回所有员工的信息 问题是,如果数据库得到更新,并且有人请求新插入的员工,那么程序将抛出一个空指针。是否只有在数据库发生更改后才通知或检查更新 这是关于mySQL的唯一相关代码,其余代码是通过我使用的两个哈希映射来实现的 package resourc

所以我有一个动态Web项目,它查询MySQL数据库并根据用户需求返回员工信息

例:htp://localhost:8080/Employees/123 //将返回员工123的信息 htp://localhost:8080/Employees //将返回所有员工的信息

问题是,如果数据库得到更新,并且有人请求新插入的员工,那么程序将抛出一个空指针。是否只有在数据库发生更改后才通知或检查更新

这是关于mySQL的唯一相关代码,其余代码是通过我使用的两个哈希映射来实现的

package resources;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Connection;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.HashMap;

import pojo.Party;

public class DBConnection {

    private Connection con;
    private static Statement statement;
    private static ResultSet resultSet;
    public  static DBConnection connection;
    private static ResultSetMetaData meta;
    private static HashMap<String,Party> map;

    public Party party;

    private DBConnection()
    {
        try 
        {
            map = new HashMap<String,Party>();
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(//not relevant, assume this works);
            statement = con.createStatement();
            readData();
        }
        catch (Exception e)
        {
            System.out.print("Error: "+e);
        }
    }
    public void readData()
    {
        try
        {
            String query = "(SELECT * FROM PureServlet)";
            resultSet = statement.executeQuery(query);
            meta = resultSet.getMetaData();
            String columnName, value, partyName;
            while(resultSet.next())
            {
                partyName = resultSet.getString("PARTY_NAME");
                map.put(partyName, new Party()); //this is the map that keeps track of all parties
                party = map.get(partyName);
              //getColumn...() irritatingly starts at 1 and not 0 thus j=1
                for(int j=1;j<=meta.getColumnCount();j++)
                {
                    columnName = meta.getColumnLabel(j);
                    value = resultSet.getString(columnName);
                    party.getPartyInfo().put(columnName, value); //this is the hashmap within the party that keeps 
                    //track of the individual values. The column Name = label, value is the value
                }
            }
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }
    public static HashMap<String,Party> getPartyCollection()
    {
        if(connection == null)
        {
            connection = new DBConnection();
        }
        return map;
    }
}

听起来目标似乎是缓存数据库的结果。一个简单的读缓存作为一个通读:如果不在缓存中,它将与底层数据对话,并查看它是否存在,根据需要更新缓存。由于它是只读的,缓存必须定期更新。这种缓存在许多DAL/ORM框架中都是自动处理的!使用get updates可以轻松实现基本的拉同步,因为在update或ROWVERSION SQL Server上设置的DATETIME lastUpdatedAt等单调递增的列上,dunno is MySQL有一个等价的列。我最终确实希望缓存,是的,但这不是这个问题的重点。ReadData仅在初始化时发生,不会重复,因此,如果有人试图查询初始化后插入的员工,它将不会出现在数据结构中。我正在寻求一种方法,最好是在发生更改后才进行检查,而不是在一个定时间隔内进行检查,这样我就可以避免这种情况。所以,这是一个缓存。根据需要通读获取单个项目和/或定期更新所有内容,可能是由于阅读失败造成的,最后使用这些想法。如果我错了,请纠正我,因为我在Web应用程序方面相对缺乏经验,但是缓存的目的不是为了存储最近的查询,以便在一段时间内更有效地访问它们吗?那不是我要找的。我想我可以捕获空结果,读取数据,然后再次运行它,但我希望用另一种方式。如果你能用缓存来做的话,请详细说明,啊,我现在看到更新的帖子了,如果你想变得更高级,比如推还是拉,可以使用类似于a的东西。YMMV。我将使用最简单的解决方案,并保持关注点和代码库的清晰分离。