ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Clinton Begin" <clinton.be...@gmail.com>
Subject Re: Updating from ibatis 1.3.1 to 2.1.7 .. what about this one .. how to access the resultSet because performance matters
Date Thu, 17 Aug 2006 16:14:50 GMT
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 <dgagnon@siunik.com> 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* <dgagnon@siunik.com
> > <mailto:dgagnon@siunik.com>> 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
> >
> >
> >
> >
> >
>
>
>

Mime
View raw message