Multiple result sets support broken
-----------------------------------
Key: IBATIS-441
URL: https://issues.apache.org/jira/browse/IBATIS-441
Project: iBatis for Java
Issue Type: Bug
Components: SQL Maps
Affects Versions: 2.3.0
Environment: Mysql Server version: 5.0.32-Debian_7etch1-log
mysql-connector-java-5.0.6-bin.jar
ibatis-2.3.0.677.jar
Reporter: Arnaud Lemaitre
Priority: Blocker
the following iBATIS code can not retrieve the 2 expected result sets. plain
JDBC equivalent is provided and is working properly.
platform specific note :
multiple queries (allowMultiQueries=true on JDBC url) is not working for Mysql
server 4.0.24 (tested). apparently requires higher version > 4.1
(following tests have been done using Mysql 5.0.32)
Here is my Code (for test purpose) :
...
List results = null;
SqlMapClient sqlMap = IbatisUtil.getSqlMapInstance();
try{
results = sqlMap.queryForList( "test" );
}
catch( SQLException sqle ) {
throw CoreException.wrap( sqle );
}
final Logger logger = Logger.getLogger( MyCLass.class );
logger.info ( "results.size() = " + results.size() );
...
mySqlMap.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace = "myNamespace">
<select id = "test" resultClass = "int, int">
<![CDATA[
select 1+1; select 2+2
]]>
</select>
</sqlMap>
My iBATIS Config :
( i've set allowMultiQueries to true, when set to false (default) i've Got sql
syntax errors...
<sqlMapConfig>
<settings
cacheModelsEnabled = "true"
enhancementEnabled = "true"
lazyLoadingEnabled = "true"
maxRequests = "32"
maxSessions = "10"
maxTransactions = "5"
useStatementNamespaces = "false"/>
<transactionManager type = "JDBC">
<dataSource type = "SIMPLE">
<property name = "JDBC.Driver" value = "com.mysql.jdbc.Driver"/>
<property name = "JDBC.ConnectionURL" value =
"jdbc:mysql://dev:3306/myDatabase?autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&characterSetResults=UTF-8"/>
<property name = "JDBC.Username" value = "myUsername"/>
<property name = "JDBC.Password" value = " myPassword"/>
</dataSource>
</transactionManager>
<sqlMap resource = "com/x/y/z/mySqlMap.xml"/> </sqlMapConfig>
Log4j output :
DEBUG TP-Processor3 java.sql.Connection - {conn-100000} Connection
DEBUG TP-Processor3 java.sql.Connection - {conn-100000} Preparing Statement:
select 1+1; select 2+2
DEBUG TP-Processor3 java.sql.PreparedStatement - {pstm-100001} Executing
Statement: select 1+1; select 2+2
DEBUG TP-Processor3 java.sql.PreparedStatement - {pstm-100001} Parameters: []
DEBUG TP-Processor3 java.sql.PreparedStatement - {pstm-100001} Types: [] DEBUG
TP-Processor3 java.sql.ResultSet - {rset-100002} ResultSet DEBUG TP-Processor3
java.sql.ResultSet - {rset-100002} Header: [1+1] DEBUG TP-Processor3
java.sql.ResultSet - {rset-100002} Result: [2] DEBUG TP-Processor3
com.ibatis.common.jdbc.SimpleDataSource - Returned connection 1511627065 to
pool.
INFO TP-Processor3 com.x.y.MyCLass - results.size() = 1
Here is the test :
package com.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class test {
public static void main( String[] args ) {
new test( args );
}
public void testJDBCConnection() throws Exception
{
Class.forName( "com.mysql.jdbc.Driver" );
String url =
"jdbc:mysql://myHost:3306/myDatabase?autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8&characterSetResults=UTF-8";
Connection conn = DriverManager.getConnection( url,
"myDatabase", "myPassword" );
try
{
String sqlString = "SELECT 1+1; SELECT 2+2; SELECT 3+3";
System.out.println("Before executing");
Statement stmt = conn.createStatement();
stmt.execute( sqlString );
for (;;) {
int updateCount = stmt.getUpdateCount();
if (updateCount >= 0) {
// report rows affected...
}
else {
ResultSet rs = stmt.getResultSet();
if (rs == null)
break;
if ( rs.next() )
System.out.println( "result :"
+ rs.getInt(1) ); // process resultset ....
}
stmt.getMoreResults();
}
System.out.println("After executing");
}
catch (Exception e)
{
System.out.println("Exception: " + e);
}
}
public test( String[] args ) {
try
{
testJDBCConnection();
}
catch (Exception e)
{
System.out.println("Exception: " + e);
}
}
}
And the output :
Before executing
result :2
result :4
result :6
After executing
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.