gpt4 book ai didi

java - JDBC 和 Oracle conn.commit 和 conn.setAutocommit 无法正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:42:43 26 4
gpt4 key购买 nike

我创建了一个 DBManager 类,如下所示

public class DBManager {


public static String DRIVER = "oracle.jdbc.driver.OracleDriver";
public static String URL = "jdbc:oracle:thin:@//localhost:1521/DB";
public static String USERNAME = "afsweb";
public static String PASSWORD = "afsweb";
public static String DOCDBUSERNAME = "docdb";
public static String DOCDBPASSWORD = "docdb";
public static int PORT = 1521;

//static Logger log = Logger.getLogger(ExcelDBManager.class.getName());
public static Connection getConnection(String url ,String username, String password){
try {
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection con = null;
try {
con = DriverManager.getConnection(url,username,password);
con.setAutoCommit(false);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}
return con;
}

我有截断表中行的方法

public static void truncate() throws SQLException{
conn = DBManager.getConnection(DBManager.URL, DBManager.USERNAME, DBManager.PASSWORD);
System.out.println(conn.getAutoCommit() +"");
Statement pstmnt = null;
ResultSet rs = null;
try{
pstmnt = conn.createStatement();
pstmnt.executeQuery("truncate table bd_vehicles_temp_1");
System.out.println("Query Executed");
}
catch(SQLException e){
e.printStackTrace();
}
finally{
try{
if(rs !=null){
rs.close();
}
if(pstmnt != null){
pstmnt.close();
}
if(conn != null){
conn.close();
}
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}

现在我还没有在我的 truncate() 方法中写入 conn.commit。我也将 setAutocommit 设置为 false。即使这样,更改也会反射(reflect)在数据库中。

在执行上述方法时,我得到的输出为

false
Query Executed

这意味着我的连接自动提交模式是错误的。截断方法所做的更改仍然反射(reflect)在数据库中。可能是什么原因?我正在使用 Oracle 数据库。

提前致谢!

最佳答案

TRUNCATE 是隐式提交的数据定义语言 (DDL) 命令。如果您改为使用 DELETE 语句,它不会提交任何内容。

// Deletes ALL Rows; No WHERE Clause
pstmnt.executeQuery("DELETE FROM bd_vehicles_temp_");

TRUNCATE 是 DDL 语句的原因是它直接删除表数据而不将其复制到回滚表空间。这就是 TRUNCATE 速度更快但无法回滚的原因。

编辑:(为什么我的 INSERT 也在提交?)

那是因为你没有调用 Connection#rollback() 就关闭了你的连接 .

如果连接在没有显式提交回滚的情况下关闭; JDBC 在这里没有特别规定任何内容,因此行为取决于数据库供应商。对于 Oracle,发出隐式提交

It is strongly recommended that an application explicitly commits or rolls back an active transaction prior to calling the close method. If the close method is called and there is an active transaction, the results are implementation-defined.

所以,在 finally block 中关闭您的Connection 之前只需rollback() 您的更改

pstmnt = conn.createStatement();

pstmnt.executeQuery("DELETE FROM bd_vehicles_temp_1");
System.out.println("Query Executed");

conn.rollback();
System.out.println("Changes rolled back");

关于java - JDBC 和 Oracle conn.commit 和 conn.setAutocommit 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18233720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com