]
RH Bugzilla Integration commented on JBJCA-1014:
------------------------------------------------
Tom Fonteyne <tfonteyn(a)redhat.com> made a comment on [bug
]
@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: