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;
}
}
关于ds
或Datasource
,一种简单的解释方法是:对Java进行数据库身份验证和连接是一种更简单,更安全的方法。在上面的代码中添加了一些关于此的评论。
你所说的[DS可能是相关的] ......嗯,听起来像黑点。我会看看这是否可能是一个原因。