当前位置: 首页 > 面试题库 >

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

史昱
2023-03-14
问题内容

我制作了一个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。即使这样,更改也会反映在数据库中。

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

false
Query Executed

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

提前致谢 !


问题答案:

TRUNCATE是隐式提交的数据定义语言(DDL)命令。如果您使用该DELETE语句,它将什么都不会提交。

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

原因TRUNCATE是DDL语句是因为它直接删除了表数据,而没有将其复制到 Rollback Tablespace中
。这就是为什么TRUNCATE速度更快但无法回滚的原因。

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

那是因为您要关闭 连接
而没有调用Connection#rollback()。

如果 Connection 是在没有明确 提交回滚的 情况下关闭的;
JDBC在这里没有特别要求任何内容,因此其行为取决于数据库供应商。如果是Oracle,则发出隐式 提交

强烈推荐 该应用程序显式提交或回滚调用Close方法之前备份活动事务。如果调用close方法并且有活动事务,则结果是实现定义的。

所以,在rollback()您的 finally 块中关闭 Connection 之前,只需进行更改即可 __

pstmnt = conn.createStatement();

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

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


 类似资料:
  • 问题内容: 我在HashSet上调用Iterator.remove()遇到问题。 我有一组带有时间戳的对象。在将新项目添加到Set之前,我将遍历Set,确定该数据对象的旧版本并将其删除(在添加新对象之前)。时间戳包含在hashCode和equals()中,但不包含equalsData()。 奇怪的是,对于集合中的某些项目,i.remove()默默失败(也不例外)。我已经核实了 实际上会调用i.re

  • 问题内容: 我正在尝试使用和约束来定位我的按钮。但是它们不起作用!如果更改和变量,则什么也不会发生。如果我将填充更改为,它仍然不起作用。 我在这里想念什么吗? 如果很难理解,这里就是问题所在: 问题答案: 自从我完成了挥杆布局以来已经有一段时间了,但是如果您的JPanel中有多个JComponent,则gridX和gridY不会仅具有效果吗?看来您只有一个JButton,所以GridBagLayo

  • 问题内容: 我正在尝试将Jenkins设置为从Bitbucket存储库中提取(在Windows Server 2008上)。我已经生成了一个密钥,并将其上传到bitbucket,将Mercurial配置为使用Plink,正在运行Pageant,并且可以从命令行进行克隆。 当我设置Jenkins作业时,它尝试克隆存储库,但在控制台输出中仅挂有“正在工作”图标 如果我从命令行克隆仓库,我得到 而且也挂

  • 问题内容: 我正在尝试运行selenium测试。但是,每次尝试运行应该运行IE的测试时,我都会在htmlutils.js的863行收到错误消息,它表示我应该禁用弹出窗口阻止程序。事情是我去了IE工具->弹出窗口块。 所以它被禁用,我得到这个错误。 还有什么我需要禁用的吗?实际上,我什至不知道它正在运行哪个版本的Internet Explorer,因为我使用的是Windows 7 Pro 64位版本

  • 问题内容: 因此,我的设置无法按我想要的方式工作。因此,每当我运行该程序时,它就会立即从0变为100。我尝试使用,任务,并尝试了,但没有任何尝试。 这是我的程序: @MadProgrammer这是我尝试做一名摆动工作人员并将每个名称写入文档并更新进度栏的尝试。该程序将达到86%左右并停止运行,永远不会创建完成的文档。该程序将创建一个空白文档。这是我首先创建的SwingWorker对象,这是两种方法

  • 问题内容: 我在JLayeredpane上有两个JPanels。其中一个显示pdf,重叠的一个具有透明背景(我使用过setOpaque(false))。现在,我可以将图形添加到透明面板中,这样看来我实际上是在注释pdf。我想要一个橡皮擦工具来删除这些注释。我尝试使用以下代码 其中path是由多条线构成的形状。现在,不是在先前的图形上绘制 透明线 ,而是绘制 黑线 。我要去哪里错了? 问题答案: 请