]
RH Bugzilla Integration commented on JBJCA-1014:
------------------------------------------------
Martin Simka <msimka(a)redhat.com> changed the Status of [bug
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
Security Level: Public(Everyone can see)
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.