Hi,

We are using iBATIS 3.0 with Spring and iBatisWorkShop.
We inherits our DAO classes from SqlSessionDaoSupport from iBatisWorkShop.

I tried to use iBATIS SQL session like in the following code

    SqlSession session = null;

    try {
        session = getSqlSessionFactory().openSession(ExecutorType.REUSE, 
false); // NOT auto-commit
        MapperInterface mapper = session.getMapper(MapperInterface.class);
        // do several interface method calls
        ...
        session.commit();
    } catch (Exception e) {
        if (session != null) session.rollback();
    } finally {
        if (session != null) session.close();
    }

Here getSqlSessionFactory() is the method of SqlSessionDaoSupport, which 
returns DefaultSqlSessionFactory object.

There are two issues with this code:
1) The JDBC connection associated with the SQL session has auto-commit equal 
true, even the openSession() method called with autoCommit equal false. So all 
statements are committed automatically.
2) The SqlSession.close() method does not close the database connection or 
return the connection to the connection pool. It happens because the 
openSession() method returns DefaultSqlSession object, which does not support 
this functionality.

iBatisWorkShop uses the SqlSessionUtils.closeSqlSession(SqlSession, 
SqlSessionFactory) method to close SQL session and correctly return the 
database connection to the connection pool.
An example below using this method works fine.

    SqlSession session = null;
    boolean autoCommit = false;
    Connection conn = null;

    try {
        session = getSqlSessionFactory().openSession(ExecutorType.REUSE, false);
        conn = session.getConnection();
        autoCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
        ...
        session.commit();
    } catch (Exception e) {
        if (session != null) session.rollback();
    } finally {
        if (conn != null) {
            try {
                conn.setAutoCommit(autoCommit);
            } catch (SQLException e) {
            }
        }
        if (session != null) {
            SqlSessionUtils.closeSqlSession(session, getSqlSessionFactory());
        }
    }


So, are these two issues bugs in iBATIS or incomplete implementation of 
SqlSessionFactory in iBatisWorkShop?


Thanks,
Dmitry

Reply via email to