插入不会立即影响SQL Server

时间:2017-05-09 04:55:49

标签: java sql-server

SQL Server 2012出现了一个非常奇怪的问题:插入后无法立即找到我的数据。

我编写了一个java测试程序,用于从我的表中插入和获取数据,函数在这里:

public void insert(Int ID, String data, Timestamp date) {

    Connection con = null;
    PreparedStatement pstmt = null;
    try {
        con = ds.getConnection(); // using Datasource to get connection
        con.setAutoCommit(false);
        pstmt = con.prepareStatement("INSERT INTO PrivData(ID, MyData, Create_date) VALUES(?,?,?)");

        pstmt.setInt(1, ID);
        pstmt.setString(2, data);
        pstmt.setTimestamp(3, date);

        int result = pstmt.executeUpdate();

        con.commit();

        Log4j.info("Insert result: " + result);

    } catch (SQLException se) {
        se.printStackTrace(System.err);
    } finally {
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException se) {
                se.printStackTrace(System.err);
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (Exception e) {
                e.printStackTrace(System.err);
            }
        }
    }
}

public MyData findData(int ID) {

    Mydata result = null;
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    try {

        con = ds.getConnection(); // using Datasource to get connection
        pstmt = con.prepareStatement("SELECT * FROM PrivData WHERE ID=?");

        pstmt.setInt(1, ID);

        rs = pstmt.executeQuery();

        if (rs.next()) {
            result = new Mydata();
            result.setID(rs.getInt("ID"));
            result.setData(rs.getString("MyData"));
            result.setDate(rs.getTimestamp("Create_date"));
        }

    } catch (SQLException se) {
        throw new RuntimeException("A database error occured. "
                + se.getMessage());
    } finally {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException se) {
                se.printStackTrace(System.err);
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException se) {
                se.printStackTrace(System.err);
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (Exception e) {
                e.printStackTrace(System.err);
            }
        }
    }
    return result;
}

然后我试一试:

insert(1, "xxxxxxxxxxxxx", new Timestamp(System.currentTimeMillis()));
Mydata myData = findData(1);

if(myData == null) {
    Log4j.info("Failed to get data from DB");
    System.out.println("Failed to get data from DB");
    return;
}
else {
    System.out.println(myData.getData());
}

当我运行这些代码时,Insert部分在日志中给了我[INFO ] Insert result: 1。所以我想把我的数据恢复到Mydata myData = findData(1);但不是:它被if(myData == null)抓住了。这意味着数据库中不存在数据。

但是如果我在完成此代码后搜索我的数据库,那么该数据会插入到表中,我将能够使用相同的代码和ID来获取它们(注释了insert())。所以我觉得有些东西在第一次运行时让我INSERT停滞不前,但我不确定哪一部分引起了......

谁能告诉我如何解决这个奇怪的问题?

----- -----更新

@Ben Thul 那么,Mydata并不复杂。

Class Mydata {
    private int ID;
    private String Data;
    private Timestamp Date;

    public void setID(int id) {
        ID = id;
    }

    public void setData(String data) {
        Data = data;
    }

    public void setTimestamp(Timestamp ts) {
        Date = ts;
    }

    public int getID() {
        return ID;
    }

    public String getData() {
        return Data;
    }

    public Timestamp getTimestamp() {
        return Date;
    }
}

关于dsDatasource,一种简单的解释方法是:对Java进行数据库身份验证和连接是一种更简单,更安全的方法。在上面的代码中添加了一些关于此的评论。

你所说的[DS可能是相关的] ......嗯,听起来像黑点。我会看看这是否可能是一个原因。

0 个答案:

没有答案