I do love Ibatis ... and all my DAOs using it the way it should .. of course you only hear of thing that doesn't work :-) Like piece of code that use StoredProcedure, or function that create report which are CPU intensive. When I start using stored procedure with Ibatis you were taking about How to implement parameterMap (If I remember well :-)). So its been a while ago and I need to standardize a bunch of stuff.

And even if I use JDBC directly, I like to store the statement in the map anyway. I have no SQL hardcoded in the code and all the SQL are at the same place (i.e.: in the SqlMap).

For now I found the ExtendedSqlMapClient interface and I will see if I cannot use it as an intermediate step (To avoid refactor too much stuff at the same time)

Thanks for the help! It's really appreciated!

Best Regard
/David


Clinton Begin wrote:

Wow, I wonder why you're using iBATIS at all.  ;-)

In this case you have three options:

1) Stop accessing the ResultSet and let iBATIS do its job. Performance at that level should not be an issue for you.

2) Use a RowHandler, it's a bit closer to the ResultSet, so you can do whatever you like with it -- mostly to process row-by-row, so you don't have to load them all up into memory.

3) Bypass iBATIS entirely and just use JDBC for this piece.
Cheers,
Clinton


On 8/17/06, *David Gagnon* <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:

    Hi all,

      Thanks for your help.  Upgrading is a huge job but it goes well so
    far.  How can I have access to the ResultSet.  Here I need performance
    so I need to access the resultSet directly.  More I have 60+ reports
    that all access the resultSet directly.

    Thanks for you help!

    Regards
    /David


        public synchronized void processDataChangeNotification() {
            String sql =
    dbNotificationDao.getSqlMap
    ().getMappedStatement(DbNotificationDaoX.NOTIFICATION_PREFIX
    + "." + WebOsConstants.DB_GET).getSql(null);
            DbConnection dbConDetail = null;
            // allow only one at a time
            try {

                ConnectionFactory connectionFactory = (ConnectionFactory)
    ManagersFactory.getManager(ConnectionFactory.MANAGER_KEY);

                dbConDetail = connectionFactory.getConnection();
                dbConDetail.startTransaction ();
                ResultSet detailRs2 = dbConDetail.executeQuery(sql);
                while (detailRs2.next()) {
                    String entity = detailRs2.getString(1);
                    cacheUpdateInfo.id1 = detailRs2.getString (2);
                    cacheUpdateInfo.id2 = detailRs2.getString(3);
                    cacheUpdateInfo.id3 = detailRs2.getString(4);
                    cacheUpdateInfo.id4 = detailRs2.getString(5);
                    cacheUpdateInfo.timestamp = detailRs2.getString(6);
                    CachedDao handler = (CachedDao)
    dataChangeHandler.get(entity);
                    if (handler != null) {
                        handler.handleDataChange(entity,
    cacheUpdateInfo);
                    } else {
                        log.error("No data change handler register for
    entity : " + entity);
                    }
                }

                // delete processed notification
                sql =
    
dbNotificationDao.getSqlMap().getMappedStatement(DbNotificationDaoX.NOTIFICATION_PREFIX
    + "." + WebOsConstants.DB_DELETE).getSql(null);
                dbConDetail.execute(sql);

                dbConDetail.commitTransaction();

            } catch (SQLException e) {
                log.error("Unable to write the db (EntitySerialiser): " +
    e.getMessage(), e);
            } finally {
                if (dbConDetail != null)
                    dbConDetail.closeAll();
            }


        }





    Clinton Begin wrote:
    > Using setUserConnection will work.   It's thread safe, so don't
    worry
    > about concurrent access.  Just make sure to "unset" it by calling
    > setUserConnection (null) -- which reminds me, we should add a
    > clearUserConnection() to make this code nicer.
    >
    > The other way to do it is with openSession (Connection conn).  But I
    > don't see a reason for you to do that here.
    >
    > As for accessing the SQL statements themselves -- be warned, it will
    > not be easy.  iBATIS 2.0 does a lot more to keep you away from the
    > guts of the framework to avoid upgrade issues...as you're
    experiencing
    > now.  ;-)
    >
    > Let us know when you get to that point, we'll see what we can do.
    >
    > public final List getList(DbConnection dbCon, String mapKey, Object
    > param)
    >     throws DatabaseException {
    >   boolean handleTransactionLocally = false;
    >   try {
    >     if (dbCon == null) {
    >       handleTransactionLocally = true;
    >       dbCon = connectionFactory.getConnectio n();
    >       dbCon.setReadOnlyConnection(true);
    >     }
    >     sqlMap.setUserConnection (dbCon.getConnection());
    >     return sqlMap.queryForList(mapKey, param);
    >   } catch (SQLException e) {
    >     // log.error ("Error during sql: " + e.getMessage(), e);
    >
    >     ExceptionAdaptor.instance(exceptionAdaptorKey).getMappe
    dException(e,
    >       "getList: " + e.getMessage(), true,
    > ExceptionAdaptor.ACTION_SEARCH , param);
    >   } finally {
    >     sqlMap.setUserConnection(null);
    >     if (dbCon != null) {
    >       dbCon.closeAll(handleTransactionLocally);
    >     }
    >   }
    > }
    >
    > Clinton
    >
    >
    >
    >
    > On 8/16/06, *David Gagnon* <[EMAIL PROTECTED]
    <mailto:[EMAIL PROTECTED]>
    > <mailto:[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>> wrote:
    >
    >     Hi all,
    >
    >     I'm having a lot of fun trying to convert my code to
    2.1.7.  There is
    >     still a lot of things I didn`t figured out yet.
    >
    >     Can you please tell me how to convert the following function.?
    >
    >
    >         public final List getList(DbConnection dbCon, String mapKey,
    >     Object
    >     param) throws DatabaseException {
    >
    >             List list = null;
    >             boolean handleTransactionLocally = false;
    >             try {
    >                 if (dbCon == null) {
    >                     handleTransactionLocally = true;
    >                     dbCon = connectionFactory.getConnection();
    >                     dbCon.setReadOnlyConnection(true);
    >                 }
    >
    >                 MappedStatement statement =
    >     sqlMap.getMappedStatement(mapKey);
    >                 list =
    >     statement.executeQueryForList (dbCon.getConnection(),
    >     param);
    >             } catch (SQLException e) {
    >     //            log.error("Error during sql: " +
    e.getMessage(), e);
    >
    >     ExceptionAdaptor.instance
    (exceptionAdaptorKey).getMappedException(e,
    >     "getList: " + e.getMessage(), true,
    >     ExceptionAdaptor.ACTION_SEARCH, param);
    >             } finally {
    >                 if (dbCon != null) {
    >                     dbCon.closeAll(handleTransactionLocally);
    >                 }
    >             }
    >             return list;
    >         }
    >
    >
    >
    >     I saw a sqlMap.setUserConnection () but this method can be
    called by
    >     simultaneously so setting the connection in the sqlMap
    doesn`t make
    >     sense to me.  There is probably something that I don`t
    understand!
    >
    >     Please help :-)
    >
    >     Best Regards.
    >     /David
    >     P.S.: Also I do need to get the SQL string from a map to
    play with it
    >     myself.  I'm not there yet but I hope there a way to get
    it!  Thanks
    >
    >
    >
    >
    >





Reply via email to