The NPE is clearly coming from the MySQL driver - not an iBATIS problem I
think. It would be interesting to try calling the SP from JDBC to verify.
I'll have to think about the hanging issue.
Jeff Butler
On 11/22/06, Peter Andrews <[EMAIL PROTECTED]> wrote:
Thanks for pointing that out.
However, I retried with the curly braces and both errors (procedure: null
pointer exception; statement: hanging without commit) still occur.
To be thorough, I updated my subversion copy of iBATIS to current
(revision 478164) but still get errors...
Jeff Butler wrote:
Part of the problem is improper syntax for the procedure call. It should
look like this:
<procedure id="deleteDatasetByResearcherIdAndIdProcedure"
resultClass="Integer" parameterClass="Map">
{CALL deleteDatasetByResearcherIdAndId(
#pResearcherId:NUMERIC#,
#pDatasetId:NUMERIC#)}
</procedure>
Note the curly braces - this is the JDBC standard excape sequence for
procdure calls. That's probably why the MySql driver is choking - although
it would be better if they had a more intelligent error message!
Jeff Butler
On 11/21/06, Peter Andrews <[EMAIL PROTECTED]> wrote:
>
> I know it is poor form to report two things at once but the replication
> instructions are very similar and bugs may be similar.
>
> I am using iBATIS from subversion updated Friday am.
>
> I am interacting with my db solely through stored procedures.
>
> Earlier, I had problems with iBATIS not realizing that my calls had
> altered the database and therefore not committing. To work around this,
> I set my transactionManager to commitRequired="true"
> <transactionManager type="JDBC" commitRequired="true">
>
> Here is the signature of the Stored Proc. I am using MySql 5.1.12-beta.
> CREATE PROCEDURE deleteDatasetByResearcherIdAndId(
> pResearcherId INT(11),
> pDatasetId INT(11)
> )
> DETERMINISTIC
> MODIFIES SQL DATA
> BEGIN
> blah blah .....
> END
>
>
> However, I have found a case where iBATIS is not sending the commit and
> the call to the db is basically hanging waiting for the commit. To test
> this I have tested my call with three different iBATIS xml elements. I
> had trouble with two of the cases and have full details below.
> 1) using statement, I get an indefinite hang because no commit is
> ever sent by iBATIS
> 2) using procedure I get a NullPointerException
> 3) using a delete element, I got it to work
>
>
> #1 using statement
>
> <statement id="deleteDatasetByResearcherIdAndIdStatement"
> resultClass="Integer" parameterClass="Map">
> CALL deleteDatasetByResearcherIdAndId(
> #pResearcherId:NUMERIC#,
> #pDatasetId:NUMERIC#
> )
> </statement>
>
> public static Integer deleteDatasetByResearcherIdAndIdStatement(int
> pResearcherId, int pDatasetId) {
> Map<String, Object> map = new HashMap<String, Object>();
> map.put("pResearcherId", pResearcherId);
> map.put("pDatasetId", pDatasetId);
> return
> cast(sqlMapper.queryForObject
> ("deleteDatasetByResearcherIdAndIdStatement",
> map));
> }
>
> The MySQL log shows this:
> 240 Query SET autocommit=1
> 240 Query SET autocommit=0
> 240 Query CALL
> deleteDatasetByResearcherIdAndId( 1, 1 )
> NOTE: NO COMMIT
>
> #2 using Procedure
>
> <procedure id="deleteDatasetByResearcherIdAndIdProcedure"
> resultClass="Integer" parameterClass="Map">
> CALL deleteDatasetByResearcherIdAndId(
> #pResearcherId:NUMERIC#,
> #pDatasetId:NUMERIC#
> )
> </procedure>
>
> public static Integer deleteDatasetByResearcherIdAndIdProcedure(int
> pResearcherId, int pDatasetId) {
> Map<String, Object> map = new HashMap<String, Object>();
> map.put("pResearcherId", pResearcherId);
> map.put("pDatasetId", pDatasetId);
> return
> cast(sqlMapper.queryForObject
> ("deleteDatasetByResearcherIdAndIdProcedure",
> map));
> }
>
> 2006-11-21 18:33:48,381 DEBUG: queryForObject
> deleteDatasetByResearcherIdAndIdProcedure passing: {pDatasetId=1,
> pResearcherId=1}
> 2006-11-21 18:33:48,384 DEBUG: {conn-100003} Connection
> 2006-11-21 18:33:48,392 DEBUG: {conn-100003} Preparing Call: CALL
> deleteDatasetByResearcherIdAndId( ?, ? )
> 2006-11-21 18:33:48,428 ERROR: Error calling Connection.prepareCall:
> java.lang.NullPointerException
> at
> com.mysql.jdbc.StringUtils.indexOfIgnoreCaseRespectQuotes(
> StringUtils.java:959)
> com.ibatis.common.jdbc.exception.NestedSQLException:
> at
> com.mysql.jdbc.DatabaseMetaData.getCallStmtParameterTypes(
> DatabaseMetaData.java:1296)
> --- The error occurred in org/epistasis/db/geneDataset/GeneDataset.xml.
> at
> com.mysql.jdbc.DatabaseMetaData.getProcedureColumns (
> DatabaseMetaData.java:3670)
> --- The error occurred while executing query procedure.
> at
> com.mysql.jdbc.CallableStatement.determineParameterTypes(
> CallableStatement.java:702)
> --- Check the CALL deleteDatasetByResearcherIdAndId( ?,
> ? ).
> --- Check the SQL Statement (preparation failed).
> at
> com.mysql.jdbc.CallableStatement.<init>(CallableStatement.java:513)
> --- Cause: java.lang.NullPointerException
> at
> com.mysql.jdbc.Connection.parseCallableStatement (Connection.java:4422)
> Caused by: java.lang.NullPointerException
> at com.mysql.jdbc.Connection.prepareCall(Connection.java:4496)
> at com.mysql.jdbc.Connection.prepareCall(Connection.java:4470)
> at
>
>
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback
> (GeneralStatement.java:188)
> at
> org.apache.commons.dbcp.DelegatingConnection.prepareCall(
> DelegatingConnection.java:212)
> at
>
>
org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareCall
> (PoolingDataSource.java:268)
> at
>
>
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject
> (GeneralStatement.java :104)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(
> SqlMapExecutorDelegate.java:566)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke (
> NativeMethodAccessorImpl.java:39)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(
> SqlMapExecutorDelegate.java:541)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(
> DelegatingMethodAccessorImpl.java :25)
> at java.lang.reflect.Method.invoke(Method.java:585)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(
> SqlMapSessionImpl.java:106)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject (
> SqlMapClientImpl.java:83)
> at
> com.ibatis.common.jdbc.logging.ConnectionLogProxy.invoke(
> ConnectionLogProxy.java:60)
> at $Proxy0.prepareCall(Unknown Source)
> at
> com.ibatis.sqlmap.engine.execution.SqlExecutor.prepareCall (
> SqlExecutor.java:500)
> at
> com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(
> SqlExecutor.java:260)
> at
>
> com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(
> ProcedureStatement.java:34)
> at
> org.epistasis.db.SqlMapClientWrapper.queryForObject(
> SqlMapClientWrapper.java:46)
> at
>
>
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(
> GeneralStatement.java:173)
> at
>
>
org.epistasis.db.geneDataset.GeneDatasetDbAccess.deleteDatasetByResearcherIdAndIdProcedure
> (GeneDatasetDbAccess.java:84)
> at
>
>
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(
> GeneralStatement.java:104)
> at
> org.epistasis.db.geneDataset.GeneDatasetDbAccess.main(
> GeneDatasetDbAccess.java:99)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(
> SqlMapExecutorDelegate.java :566)
>
> #3 using Delete worked!
> <delete id="deleteDatasetByResearcherIdAndId" parameterClass="Map">
> CALL deleteDatasetByResearcherIdAndId(
> #pResearcherId:NUMERIC#,
> #pDatasetId:NUMERIC#
> )
> </delete>
>
> public static int deleteDatasetByResearcherIdAndId(int pResearcherId,
> int pDatasetId) {
> Map<String, Object> map = new HashMap<String, Object>();
> map.put("pResearcherId", pResearcherId);
> map.put("pDatasetId", pDatasetId);
> return sqlMapper.delete("deleteDatasetByResearcherIdAndId", map);
> }
>
> --
> Peter Andrews
> Software Engineer
> Dartmouth Medical School
> Computational Genetics
> Rubin 707
> (603) 653-3598
> [EMAIL PROTECTED]
>
>
--
Peter Andrews
Software Engineer
Dartmouth Medical School
Computational Genetics
Rubin 707
(603) [EMAIL PROTECTED]