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]> 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]>> 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
>
>
>
>
>
