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.