The Java test case at the end of the post count the log file sync waits and user commits for inserting 10,000 rows into a single column table (create table x (a number)). The table below shows summary for running test with auto commit on and off. The database used was a standard edition 11.2.0.4.
Measurement | Auto Commit On | Auto Commit Off |
Log File Sync Waits | 10000 | 1 |
User commits | 10000 | 1 |
Elapsed Time (sec) | 50 | 23 |
Below java code could be used for testing for other DML events.
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import oracle.ucp.jdbc.PoolDataSource; import oracle.ucp.jdbc.PoolDataSourceFactory; public class CMTest { private final HashMapRelated PostsvalueMap = new HashMap<>(); private final PoolDataSource ds; public CMTest() throws SQLException { ds = PoolDataSourceFactory.getPoolDataSource(); ds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource"); ds.setUser("asanga"); ds.setPassword("xxx"); ds.setURL("jdbc:oracle:thin:@192.168.0.66:1521:std11g4"); } public Connection getConnection() throws SQLException { return ds.getConnection(); } public static void main(String[] args) throws SQLException { CMTest test = new CMTest(); Connection con = test.getConnection(); con.setAutoCommit(false); // comment to make auto auto commit true test.printStat(con, 1); test.runTest(con); test.printStat(con, 2); } public void printStat(Connection con, int i) throws SQLException { String SQL = "select st.name,s.value from v$statname st, v$sesstat s where st.STATISTIC#=s.STATISTIC# and s.sid=SYS_CONTEXT ('USERENV', 'SID') and st.name='user commits' " + "union " + "select e.event,TOTAL_WAITS from v$session_event e where e.event='log file sync' and e.sid=SYS_CONTEXT ('USERENV', 'SID')"; // + "union " // + "select e.event,TIME_WAITED_MICRO from v$session_event e where e.event='log file sync' and e.sid=SYS_CONTEXT ('USERENV', 'SID')"; PreparedStatement pr = con.prepareStatement(SQL); ResultSet rs = pr.executeQuery(); while (rs.next()) { if (i == 1) { valueMap.put(rs.getString(1), rs.getInt(2)); } else { Integer x = valueMap.get(rs.getString(1)); x = (x == null) ? 0 : x; System.out.println(rs.getString(1) + " " + (rs.getInt(2) - x)); } } rs.close(); pr.close(); } public void runTest(Connection con) throws SQLException { String sql = "insert into x values (?)"; // String sql = "delete from x where a = ?"; PreparedStatement pr = con.prepareStatement(sql); for (int i = 0; i < 10000; i++) { pr.setInt(1, i); pr.execute(); } con.commit(); pr.close(); } }
java.sql.SQLException: Could not commit with auto-commit set on When Using 12c JDBC Driver