ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "M. Goodell" <mggl...@comcast.net>
Subject RE: What am I doing wrong: Ibatis vs JDBC insert
Date Sun, 26 Apr 2009 05:34:15 GMT
  Try adding:

      <property name="Pool.poolPreparedStatements" value="true"/>

  or equivalent to your config file.

  I ran into this very thing a while ago and found this to be an issue if is
not specified.

  Please advise of results.


  M. Goodell

   -----Original Message-----
  From: Vagisha Sharma [mailto:vsharma@u.washington.edu]
  Sent: Saturday, April 25, 2009 11:16 PM
  To: user-java@ibatis.apache.org
  Subject: What am I doing wrong: Ibatis vs JDBC insert


  I am trying to insert several thousand records into a table, and using
JDBC with DBCP connection pooling appears to be faster than using iBATIS.
  iBATIS  2.3.4
  mySQL 5.1  (MyISAM storage engine)

  In my tests I am inserting these records in a loop but in the actual
application these records  will have to be inserted individually and not in
a loop.  I cannot use bulk inserts or iBATIS' batch inserts.
  Even though I have a test using the start and endTransactions outside of
the for loop this is not really an option for me.   Curiously, though,  even
this was not as fast as JDBC in my test.  I've read some of the "iBATIS is
slow..."  messages on this list and it appears that there should be no
reason for iBATIS to be slower than JDBC.   I am attaching my code in a zip
file and would really appreciate any help.

  Inserting 10,000 records in a for loop
  1. with JDBC takes ~3.5 seconds
  2. with iBATIS (start, commit and endTransaction at the beginning and end
of for loop) takes ~5 seconds
  3. with iBATIS (no start, commit, endTransaction) takes ~9 seconds.

  I would really like to know if I can speed up method 3.

  Thanks a lot!

  Here is my SqlMapConfig.xml

    <transactionManager type="JDBC">
      <dataSource type="DBCP">
        <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
        <property name="JDBC.ConnectionURL"
        <property name="JDBC.Username" value="root"/>
        <property name="JDBC.Password" value=""/>

        <property name="JDBC.DefaultAutoCommit" value="true"/>
        <property name="Pool.MaximumActiveConnections" value="100"/>
        <property name="Pool.MaximumIdleConnections" value="30"/>
        <property name="Pool.MaximumCheckoutTime" value="20000"/>
        <property name="Pool.TimeToWait" value="20000"/>

    <sqlMap resource="TestSqlMap.xml"/>


  <sqlMap namespace="Test">

      <typeAlias alias="TestBean" type="TestBean" />

      <parameterMap class="TestBean" id="testParam">
  <parameter property="intValue" jdbcType="INTEGER" />
  <parameter property="doubleValue" jdbcType="DOUBLE" />
  <parameter property="stringValue" jdbcType="VARCHAR" />

    <insert id="insert" parameterMap="testParam">
      INSERT INTO testTable (
      VALUES (?,?,?)
      <selectKey resultClass="int" >
        select last_insert_id() as id


  iBATIS  insert
  public void ibatisInsert(SqlMapClient sqlMap, int count) throws
SQLException {
     for(int i = 0; i < count; i++) {

              TestBean bean = createTestBean();
              Integer autogenkey = (Integer)sqlMap.insert("Test.insert",

  JDBC  insert
  public void jdbcInsert(DataSource ds, int count) throws SQLException {

          String sql = "INSERT INTO testTable (intValue, doubleValue,
stringValue) VALUES(?,?,?)";

          for(int i = 0; i < count; i++) {
              Connection conn = null;
              PreparedStatement stmt = null;
              ResultSet rs = null;
              TestBean bean = createTestBean();

              try {
                  conn = ds.getConnection();
                  stmt = conn.prepareStatement(sql);
                  stmt.setInt(1, bean.getIntValue());
                  stmt.setDouble(2, bean.getDoubleValue());
                  stmt.setString(3, bean.getStringValue());

                  rs = stmt.getGeneratedKeys();

                  if (rs.next()) {
                     int autogenkey = rs.getInt(1);
                  } else {
                      // throw an exception from here

              finally {
                  try {if(conn != null) conn.close();} catch(SQLException
                  try {if(stmt != null) stmt.close();} catch(SQLException
                  try {if(rs != null) rs.close();} catch(SQLException e){}

No virus found in this outgoing message.
Checked by AVG - www.avg.com
Version: 8.5.287 / Virus Database: 270.12.4/2080 - Release Date: 04/25/09

View raw message