[jboss-jira] [JBoss JIRA] (JBJCA-1014) DataSource class is never picked for establishing connection, driverClass is always picked.

RH Bugzilla Integration (JIRA) jira-events at lists.jboss.org
Thu May 2 03:41:54 EDT 2013


    [ https://issues.jboss.org/browse/JBJCA-1014?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12771505#comment-12771505 ] 

RH Bugzilla Integration commented on JBJCA-1014:
------------------------------------------------

Tom Fonteyne <tfonteyn at redhat.com> made a comment on [bug 957175|https://bugzilla.redhat.com/show_bug.cgi?id=957175]

@John Doyle: "if a datasource class is defined first, then fallback to java.sql.Driver - the opposite of today."

This bit is incorrect:  "the opposite of today."

The situation "today" is that the datasource class can *never* be used in EAP for the simple fact that all major vendors driver have the driver class preset.


@Jesper Pedersen: "
The "datasource-class" element is there in order to support JDBC like drivers which doesn't implement the java.sql.Driver class."

Could you please provide an example ? I mean do you have such a non-driver that can be deployed to EAP so we can see the functionality working as you state ?
                
> DataSource class is never picked for establishing connection, driverClass is always picked.
> -------------------------------------------------------------------------------------------
>
>                 Key: JBJCA-1014
>                 URL: https://issues.jboss.org/browse/JBJCA-1014
>             Project: IronJacamar
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 1.0.13.Final
>         Environment: Windows-7, JBoss AS-7.1, SQL Server, JDK-1.7.0
>            Reporter: Himanshu Bhardwaj
>            Assignee: Jesper Pedersen
>              Labels: JDBC
>
> Use Case: Implemented a custom datasource for some extension purposes over sqljdbc4.jar (JDBC-4 compliant).
> Now when configuring the datasource, the module was loaded successfully, the configuration used in standalone.xml:
>     <datasource jta="true" jndi-name="java:jboss/datasources/ejb/testdbjndi" pool-name="test-cluster-Pool" enabled="true" use-java-context="true" use-ccm="false">
>                     <connection-url>jdbc:sqlserver://localhost:1433;databaseName=cm-6.5;</connection-url>
>                     <datasource-class>com.himanshu.jdbcdriver.datasource.DataSource</datasource-class>
>                     <connection-property name="serverName">
>                         <!-- IP of the database server -->
>                     </connection-property>
>                     <driver>test-jdbc</driver>
>                     <new-connection-sql>SET DATEFIRST 1</new-connection-sql>
>                     <pool>
>                         <min-pool-size>10</min-pool-size>
>                         <max-pool-size>100</max-pool-size>
>                         <prefill>false</prefill>
>                     </pool>
>                     <security>
>                         <user-name>sa</user-name>
>                         <password>sa</password>
>                     </security>
>                     <statement>
>                         <prepared-statement-cache-size>32</prepared-statement-cache-size>
>                         <share-prepared-statements>true</share-prepared-statements>
>                     </statement>
>                 </datasource>
>     <driver name="test-jdbc" module="com.himanshu.jdbc"/>
> Now on doing testing the connections were successfully established and queries were getting executed.
> But it turns out the my custom datasource class is not used, rather the connection is made via driverClass, DriverManager.getConnection() kind of method.
> On debugging code for ironjacamar:
>     
> org.jboss.ironjacamar
> ironjacamar-jdbc
> 1.0.13.Final-redhat-1
> On looking code for "org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory", it turns out that both the driverClass property (META-INF/services/java.sql.driver file) and dataSourceClass property (from standalone.xml) is read.
> Now the way connection is made is bit confusing here.
> Looking into method:  private LocalManagedConnection getLocalManagedConnection(Properties props, Properties copy); in class
> "LocalManagedConnectionFactory"
> private LocalManagedConnection getLocalManagedConnection(Properties props, Properties copy)
>       throws ResourceException
>    {
>       Connection con = null;
>       try
>       {
>          if (driverClass != null)
>          {
>             String url = getConnectionURL();
>             Driver d = getDriver(url);
>             con = d.connect(url, copy);
>             if (con == null)
>                throw new ResourceException("Wrong driver class [" + d.getClass() + "] for this connection URL [" +
>                                            url + "]");
>          }
>          else
>          {
>             DataSource d = getDataSource();
>             con = d.getConnection(copy.getProperty("user"), copy.getProperty("password"));
>             if (con == null)
>                throw new ResourceException("Unable to create connection from datasource");
>          }
>          return new LocalManagedConnection(this, con, props, transactionIsolation, preparedStatementCacheSize);
>       }
>       catch (Throwable e)
>       {
>          if (con != null)
>          {
>             try
>             {
>                con.close();
>             }
>             catch (Throwable ignored)
>             {
>                // Ignore
>             }
>          }
>          throw new ResourceException("Could not create connection", e);
>       }
>    }
> Now the if-else block condition here is difficult to understand:
> If I have driverClass available then all the connections are made via driverClass property, even if I mention datasourceClass or not.
> This is because the first if condition always checks for driverClass the dataSourceClass check never executes.
> So the question is how this can be avoided, becuase the DriverClass is picked automatically from the java.sql.driver file (being JDBC-4 compliant).
> If there is no configuration for the same for giving priority to datasource class or explicitly setting the driver class to null, then definitely something's amiss.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the jboss-jira mailing list