java - जेडीबीसी और ओरेकल conn.commit और conn.setAutocommit ठीक से काम नहीं कर रहा है




jdbc oracle11g (3)

मैंने नीचे दिखाए अनुसार एक डीबीएमएनेजर वर्ग बनाया है I

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;
}

और मेरे पास तालिका में पंक्तियों को कम करना विधि है I

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();
            }
        }
    }

अब मैंने अपने ट्रंकेट () विधि के अंदर सम्मिलित नहीं किया है। इसके अलावा मैंने झूठे के लिए ऑटोकॉम्मित सेट किया है। फिर भी परिवर्तन डेटाबेस में परिलक्षित होते हैं

उपरोक्त विधि को निष्पादित करने पर मुझे आउटपुट मिलता है I

false
Query Executed

जिसका अर्थ है कि मेरा कनेक्शन स्वत: मोड मोड झूठा है। अभी भी truncate विधि द्वारा किए गए परिवर्तन डेटाबेस में परिलक्षित होता है। संभव कारण क्या हो सकता है ?? मैं ओरेकल डाटाबेस का उपयोग कर रहा हूँ

अग्रिम में धन्यवाद !


आटोक्वामिट व्यवहार आप उपयोग किए जाने वाले अंतर्निहित डेटाबेस पर निर्भर करता है। दुर्भाग्य से आपके मामले में ओरेकल के जेडीबीसी चालक डिफ़ॉल्ट रूप से करीब () बनाते हैं



TRUNCATE एक डेटा परिभाषा भाषा (डीडीएल) कमांड है जो निहित रूप से करता है यह कुछ भी नहीं किया होता, क्या आपने DELETE बयान का इस्तेमाल इसके बजाय किया था।

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

कारण TRUNCATE एक डीडीएल कथन है कि यह तालिका को सीधे रोलबैक टेबल्स स्पेस में कॉपी किए बिना निकाल देता है यही कारण है कि TRUNCATE तेज है, लेकिन वापस रोल नहीं किया जा सकता है।

संपादित करें : (क्यों मेरी INSERTs अच्छी तरह से कर रहे हैं?)

ऐसा इसलिए है क्योंकि आपने कनेक्शन # रोलबैक () को कॉल किए बिना अपना कनेक्शन बंद कर दिया है।

यदि एक स्पष्ट बंद या रोलबैक के बिना एक कनेक्शन बंद है; जेडीबीसी विशेष रूप से यहाँ कुछ भी जनादेश नहीं करता है और इसलिए व्यवहार डेटाबेस विक्रेता पर निर्भर है। ओरेकल के मामले में, एक आरोपित प्रतिबद्ध जारी किया जाता है।

यह दृढ़ता से अनुशंसा की जाती है कि एक आवेदन स्पष्ट रूप से बंद करने की विधि को कॉल करने से पहले एक सक्रिय लेनदेन को वापस करता है या रोल करता है। अगर करीबी तरीके से कहा जाता है और एक सक्रिय लेनदेन है, तो परिणाम कार्यान्वयन-परिभाषित हैं।

अतः, अंत में ब्लॉक में अपना कनेक्शन बंद करने से पहले केवल आपके 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");






connection