[
https://issues.apache.org/jira/browse/DERBY-5872?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13419909#comment-13419909
]
Knut Anders Hatlen commented on DERBY-5872:
-------------------------------------------
Hi Bryan,
You're right that java.sql.Wrapper was new in JDBC 4.0/JDK 6. I think you're
also right that they are not heavily used, at least not in Derby. My
understanding is that the purpose of these methods is to provide a standard way
to expose vendor-specific extension to the JDBC classes. But we don't publish
any extensions, so a Derby application would not benefit much from them.
One might imagine, though, that someone would write code like this because
Derby doesn't implement Statement.cancel():
if (conn.isWrapperFor(EmbedConnection.class)) {
conn.unwrap(EmbedConnection.class).cancelRunningStatement();
}
However, they're as likely to write
if (conn instanceof EmbedConnection) {
((EmbedConnection) conn).cancelRunningStatement();
}
which also works when running on JDBC 3.0 (or JSR-169).
> Inconsistency between isWrapperFor() and unwrap() in logical statements
> -----------------------------------------------------------------------
>
> Key: DERBY-5872
> URL: https://issues.apache.org/jira/browse/DERBY-5872
> Project: Derby
> Issue Type: Bug
> Components: JDBC
> Affects Versions: 10.4.1.3, 10.5.1.1, 10.6.1.0, 10.7.1.1, 10.8.1.2,
> 10.9.1.0
> Reporter: Knut Anders Hatlen
> Assignee: Knut Anders Hatlen
> Attachments: derby-5872-1a.diff
>
>
> I noticed this when I refactored the logical statement classes in DERBY-5868.
> The isWrapperFor() method forwards calls to the underlying physical
> statement, but the unwrap() method works purely at the logical level.
> For example, if you produce a LogicalPreparedStatement40 instance with this
> code
> ClientConnectionPoolDataSource ds = new
> ClientConnectionPoolDataSource();
> ds.setDatabaseName("testdb");
> ds.setCreateDatabase("create");
> ds.setMaxStatements(10);
> PooledConnection pc = ds.getPooledConnection();
> Connection c = pc.getConnection();
> PreparedStatement ps = c.prepareStatement("values 1");
> you'll see that
> System.out.println(ps.isWrapperFor(LogicalPreparedStatement40.class));
> prints false, telling that ps is not a wrapper for
> LogicalPreparedStatement40. However, trying to unwrap ps as a
> LogicalPreparedStatement succeeds:
> LogicalPreparedStatement40 lps =
> ps.unwrap(LogicalPreparedStatement40.class);
> On the other hand
> System.out.println(ps.isWrapperFor(PreparedStatement40.class));
> prints true, indicating that ps is a wrapper for PreparedStatement40, but
> trying to unwrap it as one, fails:
> PreparedStatement40 ps4 = ps.unwrap(PreparedStatement40.class);
> Exception in thread "main" java.sql.SQLException: Unable to unwrap for 'class
> org.apache.derby.client.am.PreparedStatement40'
> at
> org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:108)
> at
> org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:364)
> at
> org.apache.derby.client.am.LogicalStatementEntity.unwrap(LogicalStatementEntity.java:258)
> at
> org.apache.derby.client.am.LogicalPreparedStatement.unwrap(LogicalPreparedStatement.java:57)
> at Test.main(Test.java:37)
> Caused by: org.apache.derby.client.am.SqlException: Unable to unwrap for
> 'class org.apache.derby.client.am.PreparedStatement40'
> ... 3 more
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira