ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David Gagnon <dgag...@siunik.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:55:54 GMT
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* <dgagnon@siunik.com 
> <mailto: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>
>     > <mailto: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