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 .. should I? NullPointerException. It look like a bug ... (More info on the bug) Please confirm:-)
Date Fri, 18 Aug 2006 21:08:00 GMT
Hi all,

  There a ton of existing code already written and it not use the DAO 
framework at all.  Hi have 60+ DAOs and the need to interract within a 
transaction.  So I have no choice but to provide the connection to the 
SQL map. 

If I need to rewrite the entire persistence layer to fit the new version 
.. it's doesn`t really make sense!  its huge.  And even if it's not the 
easiest way to work you don't think iBatis should provide this 
fonctionnality?

Best Regards
/David





  Jeff Butler wrote:
> <quote>
> I personally doubt you need to manage database connections at all 
> since iBatis will create one for you.
> </quote>
>  
> +1
>  
> Is there some reason you're not letting iBATIS manage the connections 
> and transactions?  Seems like you are going through a lot of extra and 
> unneccessary work, and I'm not sure what the benefit could be.
>  
> Jeff Butler
>
>  
> On 8/18/06, *Poitras Christian* <Christian.Poitras@ircm.qc.ca 
> <mailto:Christian.Poitras@ircm.qc.ca>> wrote:
>
>     Sorry, but I am trying to guess your problem... I never used iBatis
>     version 1.X.
>
>     I personally doubt you need to manage database connections at all
>     since
>     iBatis will create one for you if you use the Dao package (or Spring
>     will do it).
>
>     If you open your database connection manually, then this is going
>     to be
>     a problem. Maybe 2.2 has a fix. Or maybe you should use Dao (if
>     you not
>     doing so).
>
>     Christian
>
>     -----Original Message-----
>     From: David Gagnon [mailto:dgagnon@siunik.com
>     <mailto:dgagnon@siunik.com>]
>     Sent: Friday, 18 August 2006 15:47
>     To: user-java@ibatis.apache.org <mailto:user-java@ibatis.apache.org>
>     Subject: Re: Updating from ibatis 1.3.1 to 2.1.7 .. should I?
>     NullPointerException. It look like a bug ... (More info on the bug)
>     Please confirm:-)
>
>     Hi Christian,
>
>     In fact I don`t want to close them.  Here is the generic code used to
>     get the info of a User:
>
>     public Object getObject(DbConnection dbCon, String mapKey, Object
>     param, boolean mustFind) throws DatabaseException, SQLException {
>
>            Object result = null;
>            boolean handleTransactionLocally = false;
>            try {
>                if (dbCon == null) {
>                    handleTransactionLocally = true;
>                    dbCon = connectionFactory.getConnection();
>                }
>
>                sqlMap.setUserConnection (dbCon.getConnection());
>                result = sqlMap.queryForObject(mapKey, param);
>
>                if ((result == null) && (mustFind)) {
>                    throw new DataNotFoundException("Object not found for
>     param: (" + param.toString() + ")");
>                }
>            } catch (SQLException e) {
>                if (handleTransactionLocally) {
>
>     ExceptionAdaptor.instance(exceptionAdaptorKey).getMappedException(e,
>     "Unable to get: " + e.getMessage(), true,
>     ExceptionAdaptor.ACTION_SEARCH, param);
>                } else {
>                    throw e;
>                }
>            } finally {
>                sqlMap.setUserConnection (null);
>                if (dbCon != null)
>                dbCon.closeAll(handleTransactionLocally);
>            }
>            return result;
>
>        }
>
>     The only thing I do is supply the connection to use to ibatis.  This
>     way I can enclose the call in a transaction or not.  From what I got
>     from Clinton it`s the way to do it.  But if you trace with the
>     debugger
>     into the sqlMap.setUserConnection(null) method you will see that the
>     state of the object is not OK at the end.
>
>     In fact since a single http request can imply the use of lot of
>     different DAOs I will have this method called more than once...
>
>     I read what you post but it seems to refer to a ping to test that the
>     connection to the db is up.  I'm not sure I understand how it`s
>     related
>     to my problem.  If I'm wrong please tell me.  I just want to find an
>     answer to my current problem!
>
>     Best regars
>     /David
>
>     Poitras Christian wrote:
>     > I don't think you should try setting and ressetting connection
>     manually.
>     >
>     > If you want to reset connections (close/open), use these settings in
>     > sql-map-config file (under <transactionManager><dataSource>).
>     >             <property value="${pingquery}" name="Pool.PingQuery"/>
>     >             <property value="${pingenable}"
>     name="Pool.PingEnabled"/>
>     >             <property value="${pingoldertime}"
>     > name="Pool.PingConnectionsOlderThan"/>
>     > Then set these properties in the properties file referenced by this
>     > tag in sql-map-config file.
>     > <properties resource="database.properties "/>
>     >
>     > Unless iBatis does something really nasty (probably due to JDBC
>     driver
>
>     > and not iBatis) or against what your database expects, you
>     should not
>     > use these objects.
>     > I run iBatis from version 2.1 and I have never seen the use of these
>     > objects.
>     >
>     > Christian
>     >
>     > -----Original Message-----
>     > From: David Gagnon [mailto:dgagnon@siunik.com
>     <mailto:dgagnon@siunik.com> ]
>     > Sent: Friday, 18 August 2006 15:06
>     > To: user-java@ibatis.apache.org <mailto:user-java@ibatis.apache.org>
>     > Subject: Re: Updating from ibatis 1.3.1 to 2.1.7 .. should I?
>     > NullPointerException. It look like a bug ... (More info on the bug)
>     > Please confirm:-)
>     >
>     > Hi all
>     >
>     > Since I haven't hear from you .. I dig more trying to find what
>     wrong
>     > or what I did wrong and I just get more evidence that is a bug
>     and it
>     > seems to be a major one?  Since it`s the first time I use this
>     version
>
>     > of ibatis and since it`s really basic I do think it`s because I'm
>     > missing something obvious but I have no idea.  Please look at what I
>     have found:
>     >
>     > on the 1 call the following constructor is called: public
>     > SqlMapSessionImpl(ExtendedSqlMapClient client).  This initialize the
>     > SessionScope object i.e: setting the sqlMapExecutor, etc..
>     >
>     > When my code calls: sqlMap.setUserConnection(null); this method
>     should
>
>     > reset the connection.  But in fact the state of the
>     SqlMapSessionImpl
>     > associated with the current thread is compromised because this
>     > setUserConnection has reseted the sessionScope object (See
>     > SqlMapExecutorDelegate.setUserProvidedTransaction()) associated with
>     > this SqlMapSessionImpl and put It back into the pool.  BUT the
>     > sessionScope is still into the SqlMapSessionImpl (and the
>     > SqlMapSessionImpl is still Not closed).
>     >
>     > When I another call the SqlMapSessionImpl will be reused with the
>     > sessionScope object that have been reseted: I can see the
>     > sqlMapExecutor set to null witch is not the case with the first
>     call.
>     >
>     >  From there the bug will occurs only if the sqlMapExecutor is
>     involved.
>     >
>     > In fact this is still unclear to me but I tried calling 2 times the
>     > same line of code that calls sqlMap.queryForObject (mapKey,
>     param); But
>
>     > without error.  Is the sqlMapExecutor is involved?  Does another
>     > sqlMapExecutor is used?  I have no Idea.
>     >
>     > To reproduce the bug you must use the sqlMap.queryForPaginatedList
>     > method the second time.  You will get the NullPointerException
>     because
>
>     > theSessionScope.sqlMapExecutor is NULL.
>     >
>     > In fact if you use the debugger an trace the SqlMapClientImpl object
>     >
>     >  private SqlMapSessionImpl getLocalSqlMapSession() {
>     >     SqlMapSessionImpl sqlMapSession = (SqlMapSessionImpl)
>     > localSqlMapSession.get();
>     >     if (sqlMapSession == null || sqlMapSession.isClosed ()) {
>     >       sqlMapSession = new SqlMapSessionImpl(this);
>     >       localSqlMapSession.set(sqlMapSession);
>     >     }
>     >     return sqlMapSession;
>     >   }
>     >
>     >  between the 1 and second call you will that the SessionScope
>     object
>     > is not consistent.
>     >
>     > Hope that help.  Like I said since I'm upgrading and don`t know well
>     > this version of ibatis I don`t really know what is the best
>     approch to
>
>     > fix my problem.  Any help is welcome.
>     >
>     > Best Regards
>     > /David
>     >
>     > David Gagnon wrote:
>     >
>     >> Hi all,
>     >>
>     >>  I'm pretty sure this is a session problem.  But there is an obscur
>     >> point that look to me like a bug.  It's surely not one though.
>     >>
>     >> Trying to make the problem simple:
>     >>
>     >> On the same http request (so same thread) the following function #1
>     >> is
>     >>
>     >
>     >
>     >> called followed by another.  When the fynally is excuted from
>     >> Function
>     >>
>     >
>     >
>     >> #1.  The sessionScope get reseted and put back into the pool!  But
>     >> it's not removed from SqlMapSessionImpl!!
>     >> When function #2 is called it grab the same SqlMapSessionImpl with
>     >> the
>     >>
>     >
>     >
>     >> reseted SessionScope and that lead me to a NullPointerException.
>     >>
>     >> I suppose my problem is simple to fix .. tanks for your help!  That
>     >> will bring me one step far in my upgrade process!
>     >> Best Regards
>     >>
>     >>
>     >> /David
>     >>
>     >>
>     >>
>     >>
>     >>
>     >> Function #1
>     >> ------------
>     >> public Object getObject(DbConnection dbCon, String mapKey, Object
>     >> param, boolean mustFind) throws DatabaseException, SQLException {
>     >>
>     >>        Object result = null;
>     >>        boolean handleTransactionLocally = false;
>     >>        try {
>     >>            if (dbCon == null) {
>     >>                handleTransactionLocally = true;
>     >>                dbCon = connectionFactory.getConnection();
>     >>                // TODO: check if that really usefull
>     >>                dbCon.setReadOnlyConnection(true);
>     >>            }
>     >>
>     >> //            MappedStatement statement =
>     >> sqlMap.getMappedStatement(mapKey);
>     >> //            result =
>     >> statement.executeQueryForObject(dbCon.getConnection(), param);
>     >>
>     >>            sqlMap.setUserConnection(dbCon.getConnection());
>     >>            result = sqlMap.queryForObject(mapKey, param);
>     >>
>     >>            if ((result == null) && (mustFind)) {
>     >>                throw new DataNotFoundException("Object not
>     found for
>     >> param: (" + param.toString() + ")");
>     >>            }
>     >>        } catch (SQLException e) {
>     >>            if (handleTransactionLocally) {
>     >>
>     >>
>     ExceptionAdaptor.instance(exceptionAdaptorKey).getMappedException(e,
>     >> "Unable to get: " + e.getMessage(), true,
>     >> ExceptionAdaptor.ACTION_SEARCH, param);
>     >>            } else {
>     >>                throw e;
>     >>            }
>     >>        } finally {
>     >>            sqlMap.setUserConnection(null);
>     >>            if (dbCon != null)
>     >>            dbCon.closeAll(handleTransactionLocally);
>     >>        }
>     >>        return result;
>     >>
>     >>    }
>     >> #Function 2
>     >> -------
>     >> public final SearchResult getListDynamicWithRowCount(String mapKey,
>     >> String rowCountMapKey, Map param) throws DatabaseException {
>     >>        PaginatedList paginatedList = null;
>     >>        Integer nbRows = new Integer(-1);
>     >>        Integer pageSize = null;
>     >>        try {
>     >>            paginatedList = sqlMap.queryForPaginatedList (mapKey,
>     >> param,
>     >>
>     >
>     >
>     >> pageSize.intValue());
>     >>
>     >>
>     >>        } catch (SQLException e) {
>     >> //            log.error("Error during sql: " + e.getMessage(), e);
>     >>
>     >>
>     ExceptionAdaptor.instance(exceptionAdaptorKey).getMappedException(e,
>     >> "getList: " + e.getMessage(), true, ExceptionAdaptor.ACTION_SEARCH,
>     >> param);
>     >>        }
>     >>
>     >>        return new SearchResult(paginatedList, nbRows.intValue());
>     >>    }
>     >>
>     >>
>     >> Exception:
>     >> java.lang.NullPointerException
>     >>    at
>     >>
>     com.ibatis.sqlmap.engine.mapping.statement.PaginatedDataList.getList(
>     >> P
>     >> aginatedDataList.java:138)
>     >>
>     >>    at
>     >>
>     com.ibatis.sqlmap.engine.mapping.statement.PaginatedDataList.pageTo (P
>     >> a
>     >> ginatedDataList.java:98)
>     >>
>     >>    at
>     >>
>     com.ibatis.sqlmap.engine.mapping.statement.PaginatedDataList.<init>(P
>     >> a
>     >> ginatedDataList.java:46)
>     >>
>     >>    at
>     >>
>     com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForPaginate
>     >> d
>     >> List(SqlMapExecutorDelegate.java:667)
>     >>
>     >>    at
>     >>
>     com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForPaginatedList
>     >> (
>     >> SqlMapSessionImpl.java:109)
>     >>
>     >>    at
>     >>
>     com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForPaginatedList(
>     >> S
>     >> qlMapClientImpl.java:86)
>     >>
>     >>    at
>     >>
>     com.davecorp.webos.dao.DaoSupport.getListDynamicWithRowCount(DaoSuppo
>     >> r
>     >> t.java:205)
>     >>
>     >>    at
>     >> com.davecorp.webos.dao.DaoSupport.getListDynamicWithRowCount
>     (DaoSuppo
>     >> r
>     >> t.java:189)
>     >>
>     >>    at
>     >>
>     com.unik.unikommerce.dao.resource.UkResourceDaoImpl.getResourceListDy
>     >> n
>     >> amic(UkResourceDaoImpl.java:585)
>     >>
>     >>    at
>     >>
>     com.unik.unikommerce.dao.resource.UkResourceDaoCachedImpl.getResource
>     >> L
>     >> istDynamic(UkResourceDaoCachedImpl.java:315)
>     >>
>     >>    at
>     >>
>     com.unik.unikommerce.managers.InitUnikommerceApplicationManagerImpl.c
>     >> o
>     >> nfigureUserSession(InitUnikommerceApplicationManagerImpl.java:50)
>     >>
>     >>    at
>     >>
>     com.davecorp.webos.struts.WindowEnabledRequestProcessor.processReques
>     >> t
>     >> Setup(WindowEnabledRequestProcessor.java:265)
>     >>
>     >>    at
>     >>
>     com.davecorp.webos.struts.WindowEnabledRequestProcessor.process(Windo
>     >> w
>     >> EnabledRequestProcessor.java :113)
>     >>
>     >>    at
>     >>
>     >>
>     >
>     org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482
>     > )
>     >
>     >>    at
>     >> org.apache.struts.action.ActionServlet.doPost
>     (ActionServlet.java:525)
>     >>    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
>     >>    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
>     >>    at
>     >>
>     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (Appl
>     >> i
>     >> cationFilterChain.java:252)
>     >>
>     >>    at
>     >>
>     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
>     >> i
>     >> lterChain.java:173)
>     >>
>     >>    at
>     >>
>     com.davecorp.webos.servlet.SetCharacterEncodingFilter.doFilter(SetCha
>     >> r
>     >> acterEncodingFilter.java:141)
>     >>
>     >>    at
>     >>
>     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (Appl
>     >> i
>     >> cationFilterChain.java:202)
>     >>
>     >>    at
>     >>
>     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
>     >> i
>     >> lterChain.java:173)
>     >>
>     >>    at
>     >>
>     org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
>     >> a
>     >> lve.java:213)
>     >>
>     >>    at
>     >> org.apache.catalina.core.StandardContextValve.invoke
>     (StandardContextV
>     >> a
>     >> lve.java:178)
>     >>
>     >>    at
>     >>
>     org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authentica
>     >> t
>     >> orBase.java:524)
>     >>
>     >>    at
>     >>
>     org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
>     >> a
>     >> va:126)
>     >>
>     >>    at
>     >> org.apache.catalina.valves.ErrorReportValve.invoke
>     (ErrorReportValve.j
>     >> a
>     >> va:105)
>     >>
>     >>    at
>     >>
>     org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
>     >> v
>     >> e.java:107)
>     >>
>     >>    at
>     >>
>     org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
>     >> a
>     >> :148)
>     >>
>     >>    at
>     >>
>     org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
>     :
>     >> 869)
>     >>
>     >>    at
>     >>
>     org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.p
>     >> r
>     >> ocessConnection(Http11BaseProtocol.java:664)
>     >>
>     >>    at
>     >>
>     org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpo
>     >> i
>     >> nt.java:527)
>     >>
>     >>    at
>     >> org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt
>     (LeaderFol
>     >> l
>     >> owerWorkerThread.java:80)
>     >>
>     >>    at
>     >>
>     org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP
>     >> o
>     >> ol.java:684)
>     >>
>     >>    at java.lang.Thread.run(Unknown Source)
>     >>
>     >>
>     >>
>     >> #Function from SqlMapSessionImpl
>     >>
>     >> private SqlMapSessionImpl getLocalSqlMapSession() {
>     >>    SqlMapSessionImpl sqlMapSession = (SqlMapSessionImpl)
>     >> localSqlMapSession.get();
>     >>    if (sqlMapSession == null || sqlMapSession.isClosed()) {
>     >>      sqlMapSession = new SqlMapSessionImpl(this);
>     >>      localSqlMapSession.set(sqlMapSession);
>     >>    }
>     >>    return sqlMapSession;
>     >>  }
>     >>
>     >>
>     >>
>     >>
>     >>
>     >>
>     >>
>     >>
>     >>
>     >
>     >
>     >
>     >
>     >
>     >
>     >
>
>
>
>



Mime
View raw message