Change Derby internal stored procedures to avoid 
DriverManager.getConnection("jdbc:default:connection") as it may be recognized 
by other Drivers
------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: DERBY-4664
                 URL: https://issues.apache.org/jira/browse/DERBY-4664
             Project: Derby
          Issue Type: Bug
    Affects Versions: 10.6.1.0, 10.5.3.0, 10.4.2.0, 10.3.3.0, 10.2.2.0, 10.1.3.1
            Reporter: Kathey Marsden
             Fix For: 10.3.3.1, 10.4.2.1, 10.5.3.1, 10.6.1.1


Some Derby internal Stored procedures and functions call 
DriverManager.getConnection("jdbc:default:connection"); and this url can be 
recognized by another Driver in the same classpath that is used for server side 
JDBC for another product. For example the below occurred in NetworkServer when 
JCC was also loaded because the JCC Type 2 driver is used for server side JDBC:

java.lang.UnsatisfiedLinkError:        
db2jcct2 (Not found in java.library.path):  ERRORCODE=-4472, SQLSTATE=null
com.ibm.db2.jcc.b.SqlException
        at com.ibm.db2.jcc.b.bd.a(bd.java:660)
        at com.ibm.db2.jcc.b.bd.a(bd.java:60)
        at com.ibm.db2.jcc.b.bd.a(bd.java:94)
        at com.ibm.db2.jcc.t2.a.a(a.java:37)
        at com.ibm.db2.jcc.t2.T2Configuration.<clinit>(T2Configuration.java:94)
        at java.lang.J9VMInternals.initializeImpl(Native Method)
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:196)
        at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:211)
        at java.sql.DriverManager.getConnection(DriverManager.java:572)
        at java.sql.DriverManager.getConnection(DriverManager.java:218)
        at 
org.apache.derby.impl.jdbc.LOBStoredProcedure.getEmbedConnection(Unknown Source)
        at 
org.apache.derby.impl.jdbc.LOBStoredProcedure.getClobObjectCorrespondingtoLOCATOR(Unknown
 Source)
        at org.apache.derby.impl.jdbc.LOBStoredProcedure.CLOBGETLENGTH(Unknown 
Source)
        at 
org.apache.derby.exe.acf81e0010x0128x864dxbe82x00004c9b380d12.e0(Unknown Source)
        at org.apache.derby.impl.services.reflect.DirectCall.invoke(Unknown 
Source)
        at 
org.apache.derby.impl.sql.execute.RowResultSet.getNextRowCore(Unknown Source)
        at 
org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(Unknown 
Source)
        at org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(Unknown 
Source)
        at org.apache.derby.impl.jdbc.EmbedResultSet.next(Unknown Source)
        at 
org.apache.derby.impl.jdbc.EmbedCallableStatement.executeStatement(Unknown 
Source)
        at org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(Unknown 
Source)
        at org.apache.derby.impl.drda.DRDAStatement.execute(Unknown Source)
        at 
org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTTobjects(Unknown Source)
        at org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLSTT(Unknown 
Source)
        at org.apache.derby.impl.drda.DRDAConnThread.processCommands(Unknown 
Source)
        at org.apache.derby.impl.drda.DRDAConnThread.run(Unknown Source)

I think we can avoid this specific error by changing LobStoredProcedure (and 
perhaps other internal procedures)  to  use the code in  
SystemProcedures.getDefaultConn() which always connects to Derby by using = 
InternalDriver.activeDriver()

This of course will not solve the general problem for any user created 
procedure or function that performs SQL.  I am not sure if there is a good 
solution for that.  I asked the JCC Driver team to see if there is a way they 
can determine if they are running inside the DB2 process or not. but regardless 
of these product workarounds I think the basic problem is design flaw in the 
specification.  DriverManager cannot differentiate the URL if all database 
products use the same one for server side JDBC.









-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to