Java 插入不';不会立即影响SQL Server
SQL Server 2012遇到了一个非常奇怪的问题:在插入数据后,无法立即找到数据 我编写了一个java测试程序,可以从我的表中插入和获取数据,函数如下:Java 插入不';不会立即影响SQL Server,java,sql-server,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(); // u
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());
}
当我运行这些代码时,插入部分给出了日志中的[INFO]插入结果:1
。因此,我假设在Mydata Mydata=findData(1)处获取我的数据代码>但不是:如果(myData==null)
它被捕获。这意味着数据库中不存在数据
但是,如果我在这个代码完成后搜索我的数据库,那个么数据就不会被插入到表中,我将能够使用相同的代码和ID(使用insert()
注释)获得它们。所以我认为在第一次运行时,有什么东西使我的INSERT
停止了运行,但我不确定是哪个部分导致了这种情况
有人能告诉我如何解决这个奇怪的问题吗
-----更新-----
@本图尔
嗯,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进行DB身份验证和连接更简单、更安全。在上面的代码中添加了一些关于此的注释
而你所说的[DS可能是相关的]…嗯,听起来像个黑点。我看看这是否可能是一个原因 您应该告诉我们您需要什么JDBC驱动程序use@RC. 这些jdbc是从另一个项目复制的,因此我只能告诉您它们的文件名:sqljdbc4.jar
和sqljdbc41.jar
@RajeevSreedharan我在上面发布了findData()
。你还想知道什么?我只是一个DBA(无论如何都不是java专家),但如果是我,我会在findData()
方法的fetching部分做一些日志记录(特别是在executeQuery()之后的条件中)
call。我还想知道你的MyData
类是什么样子的。第一个告诉你该调用是否实际获取了数据。第二个可能会告诉你数据是否在这些类属性中得到持久化。另外,在ds.getConnection()中ds
是什么
?这可能是相关的。我怀疑不是,但我们目前不排除任何可能性。