You can save the next person some time by adding the documentation. Each
source document sits right beside the PDF in Subversion.
http://svn.apache.org/repos/asf/ibatis/trunk/java/docs/en/
If you're tight for time (like the rest of us), there's also a wiki
workspace for required documentation:
http://opensource.atlassian.com/confluence/oss/display/IBATIS/Not+Yet+Documented
Referenced from the downloads page...
http://ibatis.apache.org/javadownloads.cgi
Clinton
On Wed, Jun 18, 2008 at 1:49 PM, Devine, James <[EMAIL PROTECTED]> wrote:
> I found that you can specify statementCachingEnabled="false" in your
> sqlMapConfig.xml.
>
> Unfortunately, it took me 2 days to figure this out because this is not
> explained in the documentation: ***
> http://svn.apache.org/repos/asf/ibatis/trunk/java/docs/en/iBATIS-SqlMaps-2_en.pdf
> *<http://svn.apache.org/repos/asf/ibatis/trunk/java/docs/en/iBATIS-SqlMaps-2_en.pdf>
>
> _____________________________________________
> *From: * Devine, James
> *Sent: * Wednesday, June 18, 2008 3:02 PM
> *To: * '[email protected]'
> *Subject: * com.ibm.websphere.ce.cm.ObjectClosedException:
> DSRA9110E: Statement is closed.
>
> Hello,
> I am running into some issues with executing multiple iBatis calls.
> This only happens when I use a JNDI datasource (connection pooling) as
> simple JDBC datasources create a new connection each time.
>
> The cs.execute() call is failing on the second call with exception:
> com.ibm.websphere.ce.cm.ObjectClosedException: DSRA9110E: Statement is
> closed
>
> Here is what I see…
>
> The first time prepareCall is called, it executes this code to create
> the CallableStatement :
> CallableStatement cs = conn.prepareCall(sql);
> session.putPreparedStatement(delegate, sql, cs);
> return cs;
>
> The second time, the session has the prepared statement, so it just
> returns it from the session:
> return (CallableStatement) session.getPreparedStatement((sql));
>
> However, when this cached callable statement is used, I get the
> DSRA9110E (statement is closed) exception.
>
> I am not using iBatis transaction management. Instead, I have a spring
> configured interceptor that performs very basic transaction management
> (this
> is required due to Sybase unchained mode).
>
> The interceptor closes the connection, which returns the connection to
> the pool. It seems logical that the statement may be closed as well, but I
> must be missing something.
> - Is there a way to force the call to be prepared each time?
> - Is that the right solution?
>
> Thanks in advance,
> JD
>
> SqlExecutor.executeQueryProcedure()…
>
> public void executeQueryProcedure(RequestScope request, Connection
> conn, String sql, Object[] parameters, int skipResults, int maxResults,
> RowHandlerCallback callback) throws SQLException {
>
> ErrorContext errorContext = request.getErrorContext();
> errorContext.setActivity("executing query procedure");
> errorContext.setObjectId(sql);
> CallableStatement cs = null;
> ResultSet rs = null;
> setupResultObjectFactory(request);
> try {
> errorContext.setMoreInfo("Check the SQL Statement (preparation
> failed).");
> Integer rsType = request.getStatement().getResultSetType();
> if (rsType != null) {
> cs = prepareCall(request.getSession(), conn, sql, rsType);
> } else {
> cs =* prepareCall*(request.getSession(), conn, sql);
> }
> setStatementTimeout(request.getStatement(), cs);
> Integer fetchSize = request.getStatement().getFetchSize();
> if (fetchSize != null) {
> cs.setFetchSize(fetchSize.intValue());
> }
> ParameterMap parameterMap = request.getParameterMap();
> ParameterMapping[] mappings =
> parameterMap.getParameterMappings();
> errorContext.setMoreInfo("Check the output parameters (register
> output parameters failed).");
> registerOutputParameters(cs, mappings);
> errorContext.setMoreInfo("Check the parameters (set parameters
> failed).");
> parameterMap.setParameters(request, cs, parameters);
> errorContext.setMoreInfo("Check the statement (update procedure
> failed).");
> * cs.execute(); // fails 2nd time (once cs is 'cached')*
> errorContext.setMoreInfo("Check the results (failed to retrieve
> results).");
>
> // Begin ResultSet Handling
> rs = handleMultipleResults(cs, request, skipResults, maxResults,
> callback);
> // End ResultSet Handling
> errorContext.setMoreInfo("Check the output parameters (retrieval
> of output parameters failed).");
> retrieveOutputParameters(request, cs, mappings, parameters,
> callback);
>
> } finally {
> try {
> closeResultSet(rs);
> } finally {
> closeStatement(request.getSession(), cs);
> }
> }
> }
>
>