OpenJPA
  1. OpenJPA
  2. OPENJPA-538

In the case when user id and password are provided, openjpa should use them in the call to getConnection to avoid "Null userid is not supported" thrown from the backend.

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Invalid
    • Affects Version/s: 1.1.0
    • Fix Version/s: 1.1.0
    • Component/s: jdbc
    • Labels:
      None

      Description

      [jcc][t4][10205][11234][3.51.74] Null userid is not supported. ERRORCODE=-4461, SQLSTATE=42815
      org.apache.openjpa.jdbc.sql.SQLExceptions.narrow(SQLExceptions.java:146)
      org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4054)
      org.apache.openjpa.jdbc.sql.DB2Dictionary.newStoreException(DB2Dictionary.java:501)
      org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102)
      org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:80)
      org.apache.openjpa.jdbc.kernel.TableJDBCSeq.allocateSequence(TableJDBCSeq.java:402)
      org.apache.openjpa.jdbc.kernel.TableJDBCSeq.nextInternal(TableJDBCSeq.java:266)
      org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:60)
      org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:160)
      org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:144)
      org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:592)
      org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:464)
      org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:440)
      org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:576)
      org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:134)
      org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:517)
      org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2814)
      org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:39)

        Activity

        Hide
        Fay Wang added a comment -

        This is a test case error.

        Show
        Fay Wang added a comment - This is a test case error.
        Hide
        Fay Wang added a comment -

        HI Kevin,
        Thanks for your comments. I debugged through and found that JBDCConfigurationImpl.getDataSource2 will call getDataSource if getConnectionFactory2 is null. In my test case, I use type 4 url and the ConnectionDriverName is com.ibm.db2.jcc.DB2Driver (instead of org.apache.commons.dbcp.BasicDataSource). Also, the ConnectionFactory2 is null in my testcase.

        The datasource that is returned from getDataSource2 is DecoratingDataSource. The call to DecoratingDataSource.getConnection( ) eventually leads to SimpleDriverDataSource.getConnection(null). An SQL error therefore occurrs when type 4 url is used without user name and password.

        Another information is if I use org.apache.commons.dbcp.BasicDataSource as ConnectionDriverName, then the test case works fine, because it is in the BasicDataSource.getConnection( ) that is invoked, instead of SimpleDriverDataSource.

        We probably need to modify java doc to take into account the case when SimpleDriverDataSource is used.

        Show
        Fay Wang added a comment - HI Kevin, Thanks for your comments. I debugged through and found that JBDCConfigurationImpl.getDataSource2 will call getDataSource if getConnectionFactory2 is null. In my test case, I use type 4 url and the ConnectionDriverName is com.ibm.db2.jcc.DB2Driver (instead of org.apache.commons.dbcp.BasicDataSource). Also, the ConnectionFactory2 is null in my testcase. The datasource that is returned from getDataSource2 is DecoratingDataSource. The call to DecoratingDataSource.getConnection( ) eventually leads to SimpleDriverDataSource.getConnection(null). An SQL error therefore occurrs when type 4 url is used without user name and password. Another information is if I use org.apache.commons.dbcp.BasicDataSource as ConnectionDriverName, then the test case works fine, because it is in the BasicDataSource.getConnection( ) that is invoked, instead of SimpleDriverDataSource. We probably need to modify java doc to take into account the case when SimpleDriverDataSource is used.
        Hide
        Kevin Sutter added a comment -

        Fay,
        Although the attached patch probably resolves the problem, the code is not consistent with the javadoc. According to the javadoc, the call to getDataSource2 should resolve to the right username and password. If that's not working as expected, then we should fix that problem. Here's the javadoc for getDataSource2:

        DataSource org.apache.openjpa.jdbc.conf.JDBCConfiguration.getDataSource2(StoreContext ctx)
        Return the non-enlisted data source to use. If there is a valid non-xa connection factory configured, then it will be returned. Its default user name and password on calls to DataSource.getConnection will be the specificed connection 2 user name and password. If those are null and the given context is non-null, its user name password will be used instead. If the context is null too, then the user name and password used to retrieve the first context will be used. If there is no second connection factory the primary connection factory is used.

        Thanks,
        Kevin

        Show
        Kevin Sutter added a comment - Fay, Although the attached patch probably resolves the problem, the code is not consistent with the javadoc. According to the javadoc, the call to getDataSource2 should resolve to the right username and password. If that's not working as expected, then we should fix that problem. Here's the javadoc for getDataSource2: DataSource org.apache.openjpa.jdbc.conf.JDBCConfiguration.getDataSource2(StoreContext ctx) Return the non-enlisted data source to use. If there is a valid non-xa connection factory configured, then it will be returned. Its default user name and password on calls to DataSource.getConnection will be the specificed connection 2 user name and password. If those are null and the given context is non-null, its user name password will be used instead. If the context is null too, then the user name and password used to retrieve the first context will be used. If there is no second connection factory the primary connection factory is used. Thanks, Kevin
        Hide
        Fay Wang added a comment -

        The attached patch should resolve this problem.

        Show
        Fay Wang added a comment - The attached patch should resolve this problem.

          People

          • Assignee:
            Unassigned
            Reporter:
            Fay Wang
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development