You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ibatis.apache.org by Peter Andrews <pe...@Dartmouth.EDU> on 2006/11/16 16:07:07 UTC

Caught exception: 'Duplicate prepared statement found. This is likely a bug.'

I posted a more complicated instance of this bug to the java user's
group but since I think it is an iBATIS bug here is again with
simplified description and test case.

I am running the current subversion code.

The basic issue is that if I have a complex resultMap that calls another
statement, the processing of the second object that is created gets a
duplicate prepared statement exception.

The iBATIS code that is throwing the exception is in SessionScope.java:
public void putPreparedStatement(String sql, PreparedStatement ps) {
   if (!isInBatch()) {
     if (hasPreparedStatementFor(sql))
       throw new SqlMapException("Duplicate prepared statement found.
This is likely a bug.");
     preparedStatements.put(sql, ps);
   }
}

Changing the iBATIS code to:
     if (!hasPreparedStatementFor(sql))
       preparedStatements.put(sql, ps);

appears to fix the problem. I am an iBATIS novice user so is likely not
a correct fix (if the problem is even iBATIS').

Here is the relevant section of my sqlMap xml file:

   <resultMap id="resultMapGeneExperimentResult"
class="GeneExperimentResult" >
     <result property="id" column="id"/>
     <result property="geneKeyId" column="geneKeyId"/>
     <result property="geneKey" column="geneKeyId" select="getGeneKeyById"/>
  </resultMap>

<statement id="getGeneExperimentResultsByDatasetExperimentId"
parameterClass="Integer" resultMap="resultMapGeneExperimentResult">
    CALL
getGeneExperimentResultsByDatasetExperimentId(#pDatasetExperimentId:NUMERIC#)
  </statement>

  <statement id="getGeneKeyById"  parameterClass="Integer"
resultClass="GeneKey">
    CALL getGeneKeyById(#pGeneKeyId:NUMERIC#)
  </statement>

Here is the console output showing the objects being created and the
exception:

DEBUG: queryForList 'getGeneExperimentResultsByDatasetExperimentId'
passing: 1
DEBUG: org.epistasis.db.geneDataset.GeneKey created.
DEBUG: org.epistasis.db.geneDataset.GeneKey id set to: 1
DEBUG: org.epistasis.db.geneDataset.GeneExperimentResult created.
DEBUG: org.epistasis.db.geneDataset.GeneExperimentResult id set to: 1
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in org/epistasis/db/geneDataset/GeneDataset.xml.
--- The error occurred while applying a result map.
--- Check the GeneDataset.resultMapGeneExperimentResult.
--- Check the result mapping for the 'geneKey' property.
--- Cause: com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in org/epistasis/db/geneDataset/GeneDataset.xml.
--- The error occurred while executing query.
--- Check the      CALL getGeneKeyById(?)   .
--- Check the SQL Statement (preparation failed).
--- Cause: com.ibatis.sqlmap.client.SqlMapException: Duplicate prepared
statement found.  This is likely a bug.


My SqlMapConfig is very unexceptional:
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

  <!--NOTE: commitRequired must be true because iBATIS does not
recognize that a change has occurred and needs to be
          committed when I use stored procedures that do change the
database -->
  <transactionManager type="JDBC" commitRequired="true">
    <dataSource type="DBCP">
      <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
      <property name="JDBC.ConnectionURL"
value="jdbc:mysql://${geneDatasetDb.host}:3306/geneDataset"/>
      <property name="JDBC.Username" value="${geneDatasetDb.username}"/>
      <property name="JDBC.Password" value="${geneDatasetDb.password}"/>
    </dataSource>
  </transactionManager>

  <!-- List the SQL Map XML files. They can be loaded from the
       classpath, as they are here (com.domain.data...) -->
  <sqlMap resource="org/epistasis/db/geneDataset/GeneDataset.xml"/>

</sqlMapConfig>

-- 
Peter Andrews
Software Engineer
Dartmouth Medical School
Computational Genetics
Rubin 707
(603) 653-3598
Peter.Andrews@dartmouth.edu