Bug 901221 (JBPAPP6-1669) - url-delimiter setting does not work for xa-datasource
Summary: url-delimiter setting does not work for xa-datasource
Keywords:
Status: CLOSED WONTFIX
Alias: JBPAPP6-1669
Product: JBoss Enterprise Application Platform 6
Classification: JBoss
Component: JCA
Version: 6.0.0
Hardware: Unspecified
OS: Unspecified
urgent
urgent
Target Milestone: ---
: TBD EAP 6
Assignee: Jesper Pedersen
QA Contact:
URL: http://jira.jboss.org/jira/browse/JBP...
Whiteboard:
Depends On:
Blocks:
TreeView+ depends on / blocked
 
Reported: 2012-11-30 00:19 UTC by Masafumi Miura
Modified: 2018-12-05 15:46 UTC (History)
6 users (show)

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
Clone Of:
Environment:
Last Closed: 2014-09-02 20:00:07 UTC
Type: Bug
Embargoed:


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
Red Hat Issue Tracker JBPAPP6-1669 0 Major Closed url-delimiter setting does not work for xa-datasource 2019-10-16 04:56:00 UTC

Description Masafumi Miura 2012-11-30 00:19:13 UTC
Affects: Release Notes
Help Desk Ticket Reference: https://c.na7.visual.force.com/apex/Case_View?sbstr=00744512
project_key: JBPAPP6

When I use "url-delimiter" to specify multiple database server to <xa-datasource-property name="URL"> in "xa-datasource" like the following:

{code:xml}
   <xa-datasource jndi-name="java:/testxa" pool-name="testxa" enabled="true" use-java-context="true">
       <driver>ojdbc6.jar</driver>
       <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
       <xa-datasource-property name="URL">jdbc:oracle:thin:@hostname1:1521:dbname|jdbc:oracle:thin:@hostname2:1521:dbname</xa-datasource-property>
       <url-delimiter>|</url-delimiter>
       ...(snip)...
       <xa-pool>
         <min-pool-size>1</min-pool-size>
         <prefill>true</prefill>
       </xa-pool>
   </xa-datasource>
{code}

Then I got the following Exception:

{code}
WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (JCA PoolFiller) IJ000610: Unable to fill pool: javax.resource.ResourceException: Could not create connection
	at org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory.getXAManagedConnection(XAManagedConnectionFactory.java:447)
	at org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory.createManagedConnection(XAManagedConnectionFactory.java:385)
	at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.createConnectionEventListener(SemaphoreArrayListManagedConnectionPool.java:761) [ironjacamar-core-impl-1.0.11.Final-redhat-1.jar:1.0.11.Final-redhat-1]
	at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.fillToMin(SemaphoreArrayListManagedConnectionPool.java:706) [ironjacamar-core-impl-1.0.11.Final-redhat-1.jar:1.0.11.Final-redhat-1]
	at org.jboss.jca.core.connectionmanager.pool.mcp.PoolFiller.run(PoolFiller.java:97) [ironjacamar-core-impl-1.0.11.Final-redhat-1.jar:1.0.11.Final-redhat-1]
	at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_09-icedtea]
Caused by: java.sql.SQLRecoverableException: IO Error: Invalid connection string format, a valid format is: "host:port:sid" 
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:419)
	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:536)
	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:228)
	at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
	at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:280)
	at oracle.jdbc.xa.client.OracleXADataSource.getPooledConnection(OracleXADataSource.java:482)
	at oracle.jdbc.xa.client.OracleXADataSource.getXAConnection(OracleXADataSource.java:156)
	at oracle.jdbc.xa.client.OracleXADataSource.getXAConnection(OracleXADataSource.java:130)
	at org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory.getXAManagedConnection(XAManagedConnectionFactory.java:430)
	... 5 more
Caused by: oracle.net.ns.NetException: Invalid connection string format, a valid format is: "host:port:sid" 
	at oracle.net.resolver.AddrResolution.resolveSimple(AddrResolution.java:472)
	at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:397)
	at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:678)
	at oracle.net.ns.NSProtocol.connect(NSProtocol.java:238)
	at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1054)
	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:308)
	... 14 more
{code}


I also tried with MySQL instead of Oracle like the following setting: 

{code:xml}
 <xa-datasource jndi-name="java:/testxa" pool-name="testxa" enabled="true" use-java-context="true">
    <driver>mysql-connector-java.jar</driver>
    <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
    <xa-datasource-property name="URL">jdbc:mysql://hostname1:3306/jboss|jdbc:mysql://hostname2:3306/jboss</xa-datasource-property>
    <url-delimiter>|</url-delimiter>
    ...(snip)...
    <xa-pool>
      <min-pool-size>1</min-pool-size>
      <prefill>true</prefill>
    </xa-pool>
  </xa-datasource>
{code}

It also did not work. I got the following Exception:

{code}
WARN  [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (JCA PoolFiller) IJ000610: Unable to fill pool: javax.resource.ResourceException: Could not create connection
	at org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory.getXAManagedConnection(XAManagedConnectionFactory.java:447)
	at org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory.createManagedConnection(XAManagedConnectionFactory.java:385)
	at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.createConnectionEventListener(SemaphoreArrayListManagedConnectionPool.java:761) [ironjacamar-core-impl-1.0.11.Final-redhat-1.jar:1.0.11.Final-redhat-1]
	at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.fillToMin(SemaphoreArrayListManagedConnectionPool.java:706) [ironjacamar-core-impl-1.0.11.Final-redhat-1.jar:1.0.11.Final-redhat-1]
	at org.jboss.jca.core.connectionmanager.pool.mcp.PoolFiller.run(PoolFiller.java:97) [ironjacamar-core-impl-1.0.11.Final-redhat-1.jar:1.0.11.Final-redhat-1]
	at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_09-icedtea]
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect database name 'jboss|jdbc:mysql://hostname2:3306/jboss'
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.7.0_09-icedtea]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) [rt.jar:1.7.0_09-icedtea]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [rt.jar:1.7.0_09-icedtea]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525) [rt.jar:1.7.0_09-icedtea]
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:919)
	at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1694)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1244)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2397)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2430)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2215)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:813)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.7.0_09-icedtea]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) [rt.jar:1.7.0_09-icedtea]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [rt.jar:1.7.0_09-icedtea]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525) [rt.jar:1.7.0_09-icedtea]
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
	at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:443)
	at com.mysql.jdbc.jdbc2.optional.MysqlDataSource.getConnection(MysqlDataSource.java:141)
	at com.mysql.jdbc.jdbc2.optional.MysqlXADataSource.getXAConnection(MysqlXADataSource.java:61)
	at org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory.getXAManagedConnection(XAManagedConnectionFactory.java:430)
	... 5 more
{code}

It looks "url-delimiter" setting is not processed correctly in xa-datasource.

Comment 2 Jesper Pedersen 2013-01-15 16:00:20 UTC
Link: Added: This issue depends JBJCA-963


Comment 3 Jesper Pedersen 2013-03-21 12:19:07 UTC
For EAP 7

Comment 4 Homi Waldorf 2013-05-15 19:09:13 UTC
(In reply to comment #3)
> For EAP 7

EAP 7 is not coming out anytime soon so obviously there are lots of folks that are hitting this bug. What is the work-around for this. "Just wait till EAP 7" is not an answer.

Comment 5 Homi Waldorf 2013-05-16 20:55:41 UTC
Here is a workaround for this.....
Install Byteman 
       https://community.jboss.org/wiki/ABytemanTutorial

Then you will need this to get it all working. 

RULE Set URLProperty
CLASS org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory
METHOD createManagedConnection
AT ENTRY
IF true
DO
$0.urlProperty = "URL"
ENDRULE

RULE Set URLDelimiter
CLASS org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory
METHOD initSelector
AT ENTRY
IF true
DO
$0.urlDelimiter = "|"
ENDRULE

Comment 8 Jesper Pedersen 2014-09-02 20:00:07 UTC
Will be in EAP 7


Note You need to log in before you can comment on or make changes to this bug.