[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