db-derby-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From d..@apache.org
Subject svn commit: r383579 - in /db/derby/code/branches/10.1/java: client/org/apache/derby/client/am/ client/org/apache/derby/client/net/ drda/org/apache/derby/impl/drda/
Date Mon, 06 Mar 2006 16:47:57 GMT
Author: djd
Date: Mon Mar  6 08:47:53 2006
New Revision: 383579

URL: http://svn.apache.org/viewcvs?rev=383579&view=rev
Log:
DERBY-966 DERBY-1005 1) Change DRDAStatement to use the EngineConnection.prepareStatement()
method that has a holdability
 parameter. This ensures prepares on a connection that was obtained from a XADataSource
(or a ConnectionPoolDataSource) do not lose the holdability requested by the application.

2) Change the client's state of holdability to match the embedded in that a Connection's holdability
 is set to close cursors on commit when it has an active global XA transaction.
Merge of 380278, partially manually due to conflicts, from trunk.

Modified:
    db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java
    db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/DatabaseMetaData.java
    db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/SectionManager.java
    db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Statement.java
    db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetConnection.java
    db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetDatabaseMetaData.java
    db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java

Modified: db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java?rev=383579&r1=383578&r2=383579&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java (original)
+++ db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java Mon
Mar  6 08:47:53 2006
@@ -52,7 +52,13 @@
     public transient String user_;
     public boolean retrieveMessageText_;
     protected boolean jdbcReadOnly_;
-    public int resultSetHoldability_;
+    /**
+     * Holdabilty for created statements.
+     * Only access through the holdability method
+     * to ensure the correct value is returned for an
+     * XA connection.
+     */
+    private int holdability = ClientDataSource.HOLD_CURSORS_OVER_COMMIT;
     public String databaseName_;
 
     // Holds the Product-Specific Identifier which specifies
@@ -107,7 +113,7 @@
     //public static final int XA_RECOVER = 14;
 
 
-    protected int xaState_ = XA_T0_NOT_ASSOCIATED;
+    private int xaState_ = XA_T0_NOT_ASSOCIATED;
 
     // XA Host Type
     public int xaHostVersion_ = 0;
@@ -338,7 +344,7 @@
         if (agent_.loggingEnabled()) {
             agent_.logWriter_.traceEntry(this, "createStatement");
         }
-        Statement s = createStatementX(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY,
resultSetHoldability_);
+        Statement s = createStatementX(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY,
holdability());
         if (agent_.loggingEnabled()) {
             agent_.logWriter_.traceExit(this, "createStatement", s);
         }
@@ -352,7 +358,7 @@
         PreparedStatement ps = prepareStatementX(sql,
                 java.sql.ResultSet.TYPE_FORWARD_ONLY,
                 java.sql.ResultSet.CONCUR_READ_ONLY,
-                resultSetHoldability_,
+                holdability(),
                 java.sql.Statement.NO_GENERATED_KEYS,
                 null);
         if (agent_.loggingEnabled()) {
@@ -383,7 +389,7 @@
         if (agent_.loggingEnabled()) {
             agent_.logWriter_.traceEntry(this, "prepareCall", sql);
         }
-        CallableStatement cs = prepareCallX(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY,
resultSetHoldability_);
+        CallableStatement cs = prepareCallX(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY,
holdability());
         if (agent_.loggingEnabled()) {
             agent_.logWriter_.traceExit(this, "prepareCall", cs);
         }
@@ -391,7 +397,7 @@
     }
 
     synchronized PreparedStatement prepareDynamicCatalogQuery(String sql) throws SqlException
{
-        PreparedStatement ps = newPreparedStatement_(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY, resultSetHoldability_, java.sql.Statement.NO_GENERATED_KEYS,
null);
+        PreparedStatement ps = newPreparedStatement_(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY, holdability(), java.sql.Statement.NO_GENERATED_KEYS,
null);
         ps.isCatalogQuery_ = true;
         ps.prepare();
         openStatements_.add(ps);
@@ -837,7 +843,7 @@
             setTransactionIsolationStmt =
                     createStatementX(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                             java.sql.ResultSet.CONCUR_READ_ONLY,
-                            resultSetHoldability_);
+                            holdability());
         }
         setTransactionIsolationStmt.executeUpdate("SET CURRENT ISOLATION = " + levelString);
 
@@ -926,7 +932,7 @@
         if (agent_.loggingEnabled()) {
             agent_.logWriter_.traceEntry(this, "createStatement", resultSetType, resultSetConcurrency);
         }
-        Statement s = createStatementX(resultSetType, resultSetConcurrency, resultSetHoldability_);
+        Statement s = createStatementX(resultSetType, resultSetConcurrency, holdability());
         if (agent_.loggingEnabled()) {
             agent_.logWriter_.traceExit(this, "createStatement", s);
         }
@@ -942,7 +948,7 @@
         PreparedStatement ps = prepareStatementX(sql,
                 resultSetType,
                 resultSetConcurrency,
-                resultSetHoldability_,
+                holdability(),
                 java.sql.Statement.NO_GENERATED_KEYS,
                 null);
         if (agent_.loggingEnabled()) {
@@ -957,7 +963,7 @@
         if (agent_.loggingEnabled()) {
             agent_.logWriter_.traceEntry(this, "prepareCall", sql, resultSetType, resultSetConcurrency);
         }
-        CallableStatement cs = prepareCallX(sql, resultSetType, resultSetConcurrency, resultSetHoldability_);
+        CallableStatement cs = prepareCallX(sql, resultSetType, resultSetConcurrency, holdability());
         if (agent_.loggingEnabled()) {
             agent_.logWriter_.traceExit(this, "prepareCall", cs);
         }
@@ -967,7 +973,7 @@
     synchronized public CallableStatement prepareMessageProc(String sql) throws SqlException
{
         checkForClosedConnection();
 
-        CallableStatement cs = prepareCallX(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY,
resultSetHoldability_);
+        CallableStatement cs = prepareCallX(sql, java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY,
holdability());
         return cs;
     }
 
@@ -1019,15 +1025,15 @@
             agent_.logWriter_.traceEntry(this, "setHoldability", holdability);
         }
         checkForClosedConnection();
-        resultSetHoldability_ = holdability;
+        this.holdability = holdability;
     }
 
     public int getHoldability() throws SqlException {
         checkForClosedConnection();
         if (agent_.loggingEnabled()) {
-            agent_.logWriter_.traceExit(this, "getHoldability", resultSetHoldability_);
+            agent_.logWriter_.traceExit(this, "getHoldability", holdability());
         }
-        return resultSetHoldability_;
+        return holdability();
     }
 
     public int dncGeneratedSavepointId_;
@@ -1074,7 +1080,7 @@
         try {
             stmt = (Statement) createStatementX(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                     java.sql.ResultSet.CONCUR_READ_ONLY,
-                    resultSetHoldability_);
+                    holdability());
             String savepointName;
             try {
                 savepointName = savepoint.getSavepointName();
@@ -1126,7 +1132,7 @@
         try {
             stmt = createStatementX(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                     java.sql.ResultSet.CONCUR_READ_ONLY,
-                    resultSetHoldability_);
+                    holdability());
             String savepointName;
             try {
                 savepointName = ((Savepoint) savepoint).getSavepointName();
@@ -1177,7 +1183,7 @@
         try {
             stmt = (Statement) createStatementX(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                     java.sql.ResultSet.CONCUR_READ_ONLY,
-                    resultSetHoldability_);
+                    holdability());
             String savepointName;
             try {
                 savepointName = ((Savepoint) savepoint).getSavepointName();
@@ -1322,7 +1328,7 @@
         PreparedStatement ps = prepareStatementX(sql,
                 java.sql.ResultSet.TYPE_FORWARD_ONLY,
                 java.sql.ResultSet.CONCUR_READ_ONLY,
-                resultSetHoldability_,
+                holdability(),
                 autoGeneratedKeys,
                 null);
         if (agent_.loggingEnabled()) {
@@ -1346,7 +1352,7 @@
         PreparedStatement ps = prepareStatementX(sql,
                 java.sql.ResultSet.TYPE_FORWARD_ONLY,
                 java.sql.ResultSet.CONCUR_READ_ONLY,
-                resultSetHoldability_,
+                holdability(),
                 java.sql.Statement.RETURN_GENERATED_KEYS,
                 columnNames);
         if (agent_.loggingEnabled()) {
@@ -1644,5 +1650,16 @@
     public void setInUnitOfWork(boolean inUnitOfWork) {
         inUnitOfWork_ = inUnitOfWork;
     }
-
+    /**
+     * Return the holdabilty for the Connection. Matches the
+     * embedded driver in the restriction that while in a
+     * global (XA) transaction the holdability is CLOSE_CURSORS_AT_COMMIT.
+     * Otherwise return the holdability set by the user.
+     */
+    final int holdability()
+    {
+        if (this.isXAConnection_ && this.xaState_ == XA_T1_ASSOCIATED)
+            return ClientDataSource.CLOSE_CURSORS_AT_COMMIT;
+        return holdability;
+    }
 }

Modified: db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/DatabaseMetaData.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/DatabaseMetaData.java?rev=383579&r1=383578&r2=383579&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/DatabaseMetaData.java
(original)
+++ db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/DatabaseMetaData.java
Mon Mar  6 08:47:53 2006
@@ -1220,7 +1220,8 @@
         cs.setStringX(3, "");
         cs.setStringX(4, "%");
         int cursorHold;
-        if (connection_.resultSetHoldability_ == ClientDataSource.HOLD_CURSORS_OVER_COMMIT)
{
+
+        if (connection_.holdability() == ClientDataSource.HOLD_CURSORS_OVER_COMMIT) {
             cursorHold = 1;
         } else {
             cursorHold = 0;
@@ -1510,7 +1511,8 @@
         cs.setStringX(6, table);
         // We're passing the keyword EXPORTEDKEY, but this support may not be in the GA version
of SPs.
         // As a workaround in getCrossReference(), we'll just "select * where 0=1" when primaryTable==""
-        if (connection_.resultSetHoldability_ == ClientDataSource.HOLD_CURSORS_OVER_COMMIT)
{
+
+        if (connection_.holdability() == ClientDataSource.HOLD_CURSORS_OVER_COMMIT) {
             cs.setStringX(7, "DATATYPE='JDBC';IMPORTEDKEY=1; CURSORHOLD=1");
         } else {
             cs.setStringX(7, "DATATYPE='JDBC';IMPORTEDKEY=1; CURSORHOLD=0");
@@ -1556,7 +1558,8 @@
         cs.setStringX(6, "");
         // We're passing the keyword EXPORTEDKEY, but this support may not be in the GA version
of SPs.
         // As a workaround in getCrossReference(), we'll just "select * where 0=1" when foreignTable==""
-        if (connection_.resultSetHoldability_ == ClientDataSource.HOLD_CURSORS_OVER_COMMIT)
{
+
+        if (connection_.holdability() == ClientDataSource.HOLD_CURSORS_OVER_COMMIT) {
             cs.setStringX(7, "DATATYPE='JDBC';EXPORTEDKEY=1; CURSORHOLD=1");
         } else {
             cs.setStringX(7, "DATATYPE='JDBC';EXPORTEDKEY=1; CURSORHOLD=0");
@@ -1752,7 +1755,8 @@
     // helper method for the catalog queries only
     private String getOptions() {
         int cursorHold;
-        if (connection_.resultSetHoldability_ == ClientDataSource.HOLD_CURSORS_OVER_COMMIT)
{
+
+        if (connection_.holdability() == ClientDataSource.HOLD_CURSORS_OVER_COMMIT) {
             cursorHold = 1;
         } else {
             cursorHold = 0;
@@ -2084,7 +2088,7 @@
                 connection_.prepareStatementX("CALL " + cmd,
                         java.sql.ResultSet.TYPE_FORWARD_ONLY,
                         java.sql.ResultSet.CONCUR_READ_ONLY,
-                        connection_.resultSetHoldability_,
+                        connection_.holdability(),
                         java.sql.Statement.NO_GENERATED_KEYS,
                         null);
         return ps;

Modified: db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/SectionManager.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/SectionManager.java?rev=383579&r1=383578&r2=383579&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/SectionManager.java
(original)
+++ db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/SectionManager.java
Mon Mar  6 08:47:53 2006
@@ -145,7 +145,7 @@
     // A positioned update section must come from the same package as its query section.
     Section getPositionedUpdateSection(Section querySection) throws SqlException {
         Connection connection = agent_.connection_;
-        return getDynamicSection(connection.resultSetHoldability_);
+        return getDynamicSection(connection.holdability());
     }
 
     // Get a section for a jdbc 1 positioned update/delete for the corresponding query.

Modified: db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Statement.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Statement.java?rev=383579&r1=383578&r2=383579&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Statement.java (original)
+++ db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Statement.java Mon
Mar  6 08:47:53 2006
@@ -1189,7 +1189,7 @@
         }
         if (connection_.autoCommit_ && requiresAutocommit) { // for the auto-commit;
             if (connection_.isXAConnection_) {
-                return (connection_.xaState_ == Connection.XA_T0_NOT_ASSOCIATED) ;
+                return (connection_.getXAState() == Connection.XA_T0_NOT_ASSOCIATED) ;
             } else {
                 return true;
             }
@@ -1268,7 +1268,7 @@
         if (connection_.autoCommit_ && requiresAutocommit && isAutoCommittableStatement_)
{
             connection_.writeAutoCommit();
             if (connection_.isXAConnection_) {
-                return (connection_.xaState_ == Connection.XA_T0_NOT_ASSOCIATED) ;
+                return (connection_.getXAState() == Connection.XA_T0_NOT_ASSOCIATED) ;
             } else {
                 return true;
             }

Modified: db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetConnection.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetConnection.java?rev=383579&r1=383578&r2=383579&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetConnection.java
(original)
+++ db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetConnection.java
Mon Mar  6 08:47:53 2006
@@ -267,9 +267,7 @@
                 securityMechanism_ = ds.getSecurityMechanism();
             }
             resetConnectionAtFirstSql_ = false;
-            if (resultSetHoldability_ == 0) {
-                ((org.apache.derby.client.net.NetDatabaseMetaData) databaseMetaData_).setDefaultResultSetHoldability();
-            }
+
         }
         if (password != null) {
             deferredResetPassword_ = null;
@@ -319,10 +317,6 @@
                 securityMechanism_ = ds.getSecurityMechanism();
             }
             resetConnectionAtFirstSql_ = false;
-
-            if (resultSetHoldability_ == 0) {
-                ((org.apache.derby.client.net.NetDatabaseMetaData) databaseMetaData_).setDefaultResultSetHoldability();
-            }
         }
         // properties prddta_ and crrtkn_ will be initialized by
         // calls to constructPrddta() and constructCrrtkn()
@@ -1375,7 +1369,7 @@
     // Allow local COMMIT/ROLLBACK only if we are not in an XA transaction
     protected boolean allowLocalCommitRollback_() throws org.apache.derby.client.am.SqlException
{
        
-    	if (xaState_ == XA_T0_NOT_ASSOCIATED) {
+    	if (getXAState() == XA_T0_NOT_ASSOCIATED) {
             return true;
         }
         return false;

Modified: db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetDatabaseMetaData.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetDatabaseMetaData.java?rev=383579&r1=383578&r2=383579&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetDatabaseMetaData.java
(original)
+++ db/derby/code/branches/10.1/java/client/org/apache/derby/client/net/NetDatabaseMetaData.java
Mon Mar  6 08:47:53 2006
@@ -62,16 +62,6 @@
     // if (productLevel_.greaterThanOrEqualTo(11,1,0))
     //  supportsTheBestThingEver = true
     protected void computeFeatureSet_() {
-        if (connection_.resultSetHoldability_ == 0)  // property not set
-        {
-            setDefaultResultSetHoldability();
-        }
 
     }
-
-
-    public void setDefaultResultSetHoldability() {
-        connection_.resultSetHoldability_ = org.apache.derby.jdbc.ClientDataSource.HOLD_CURSORS_OVER_COMMIT;
-    }
-
 }

Modified: db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java?rev=383579&r1=383578&r2=383579&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java (original)
+++ db/derby/code/branches/10.1/java/drda/org/apache/derby/impl/drda/DRDAStatement.java Mon
Mar  6 08:47:53 2006
@@ -37,6 +37,7 @@
 
 import org.apache.derby.iapi.jdbc.BrokeredConnection;
 import org.apache.derby.iapi.jdbc.BrokeredPreparedStatement;
+import org.apache.derby.iapi.jdbc.EngineConnection;
 import org.apache.derby.iapi.reference.JDBC30Translation;
 import org.apache.derby.iapi.sql.execute.ExecutionContext;
 import org.apache.derby.iapi.util.StringUtil;
@@ -65,7 +66,7 @@
 	protected String pkgcnstknStr;       // Consistency token for the first result set
  	protected String pkgid;              // package id
  	protected String sectionNumber;      // section number
-	protected int withHoldCursor = -1;	 // hold cursor after commit attribute.
+	int withHoldCursor = -1;	 // hold cursor after commit attribute.
 	protected int isolationLevel;         //JCC isolation level for Statement
 	protected String cursorName;
 	protected int scrollType = ResultSet.TYPE_FORWARD_ONLY;			// Sensitive or Insensitive scroll
attribute
@@ -511,11 +512,7 @@
 			return ps;
 		}
 		parsePkgidToFindHoldability();
-		Connection conn = database.getConnection();
-		if (conn instanceof BrokeredConnection)
-			ps = conn.prepareStatement(sqlStmt, scrollType, concurType);
-		else
-			ps = prepareStatementJDBC3(sqlStmt, scrollType, concurType, 
+		ps = prepareStatementJDBC3(sqlStmt, scrollType, concurType, 
 									   withHoldCursor);
 		// beetle 3849  -  Need to change the cursor name to what
 		// JCC thinks it will be, since there is no way in the 
@@ -1493,17 +1490,18 @@
 	{
 		if (withHoldCursor != -1)
 			return;
+        
 		//First, check if holdability was passed as a SQL attribute "WITH HOLD" for this prepare.
If yes, then withHoldCursor
 		//should not get overwritten by holdability from package name and that is why the check
for -1
 		if (isDynamicPkgid(pkgid))
-		{
+		{       
 			if(pkgid.charAt(4) == 'N')
 				withHoldCursor = JDBC30Translation.CLOSE_CURSORS_AT_COMMIT;
 			else  
 				withHoldCursor = JDBC30Translation.HOLD_CURSORS_OVER_COMMIT;
 		}
 		else 
-		{
+		{            
 			withHoldCursor = JDBC30Translation.HOLD_CURSORS_OVER_COMMIT;
 		
 		}
@@ -1511,10 +1509,8 @@
 
 
 	/**
-	 *  prepare a statement using reflection so that server can run on jdk131
-	 *  and still pass holdability.  
-	 *  parameters are passed on to either the EmbedConnection or 
-	 *  BrokeredConnection prepareStatement() method.
+	 *  prepare a statement using EngineConnection.prepareStatement
+     *  so that server can run on jdk131 and still pass holdability.  
 	 *  @param sqlStmt - SQL statement text
 	 *  @param scrollType - scroll type
 	 *  @param concurType - concurrency type
@@ -1528,26 +1524,17 @@
 													scrollType, int concurType,
 													int withHoldCursor) throws SQLException
 	{
-		PreparedStatement lps = null;
-
-		// If holdability is still uninitialized, default is HOLD_CURSORS_OVER_COMMIT
-		int resultSetHoldability = (withHoldCursor == -1) ? 
-			resultSetHoldability = JDBC30Translation.HOLD_CURSORS_OVER_COMMIT :
-			withHoldCursor;
-
-		//prepareStatement takes 4 parameters
-		Class[] PREP_STMT_PARAM = { String.class, Integer.TYPE, Integer.TYPE, Integer.TYPE };
-		Object[] PREP_STMT_ARG = { sqlStmt, new Integer(scrollType),
-								   new Integer(concurType), new Integer(resultSetHoldability)};
-		try {
-			//create a prepared statement with hold cursor over commit using reflection.
-			Method sh = database.getConnection().getClass().getMethod("prepareStatement", PREP_STMT_PARAM);
-			lps = (PreparedStatement) (sh.invoke(database.getConnection(), PREP_STMT_ARG));
-		} catch (Exception e) {
-			handleReflectionException(e);
-		} 
-
-		return lps;
+        EngineConnection conn = database.getConnection();
+        if (withHoldCursor == -1) {
+            // Holdability not explictly set, let the
+            // connection provide the default.
+            return conn.prepareStatement(sqlStmt,
+                    scrollType, concurType);
+        }
+        
+        // Holdability explictly set. 
+        return conn.prepareStatement(sqlStmt,
+                scrollType, concurType, withHoldCursor);
 	}
 
 	



Mime
View raw message