mardi 6 septembre 2011

Oracle Advanced Queuing (AQ) est un provider de message implémenté en base. Il offre une interface d’accès JMS (en 11G) permettant à des applications externes d’envoyer et recevoir des messages. Cette intégration dans Weblogic peut se faire via un Bridge (ancien mode) ou plus nativement avec un Foreign Server (11G).

Avant la 11G, Oracle fournissait un accès AQ via des interfaces non standardisées tel qu’Oracle Internet Directory (OID) ou l’ancien Provider JNDI d’OC4J.

L’accès se fait par un DataSource XA ou non, et les ressources JMS sont déclarées dans la DataBase et non plus dans le serveur d’applications. Tous les aspects d’administration et de monitoring sont donc décalés côté DataBase.

Le principal avantage, mais qui fait sa faiblesse et la centralisation du point d’accès (la base). Lorsqu’une instance Weblogic tombe, les autres peuvent continuer de travailler sans impacte pour le flux des messages et sans procédure administrative. Par contre, si la base n’est plus accessible, des erreurs sont produites et il faut rejouer les messages.

 CINEMATIQUE




1 – Le client récupère l’objet Factory d’accès à la base distante via le nom JNDI local. Cette factory permet de récupérer une référence sur le Foreign Server ou l’on a déclaré la DataSource.     
2 – Le client récupère la Destination via la référence locale donnée dans le Foreign Server et la DataSource associé d’accès à la base ou se trouve la destination.
3 – Le producteur pousse le message dans la destination distante (en base).

PARAMETRAGE DATABASE



Chaque queue ou topique JMS AQ est attaché à une table. Ce sont des références logiques associées à la table AQ. Les tables AQ sont créées sur des schémas utilisateur spécifiques qu’il faut déclarer et sur lequel il faut attribuer des droits spécifiques.

User : jmsuser
Password : jmsuser

sqlplus SYS/manager1@ORCL AS SYSDBA @AQ_GRANT.sql

AQ_GRANT.sql
sqlplus SYS/manager1@ORCL AS SYSDBA
grant connect,resource,aq_administrator_role to jmsuser identified by jmsuser;
grant select on sys.DBA_PENDING_TRANSACTIONS to jmsuser;
grant execute on sys.dbms_aqadm to jmsuser;
grant execute on sys.dbms_aq to jmsuser;      
grant execute on sys.dbms_aqin to jmsuser;    
grant execute on sys.dbms_aqjms to jmsuser; 
exec dbms_aqadm.grant_system_privilege(’ENQUEUE_ANY’,’jmsuser’);
exec dbms_aqadm.grant_system_privilege(’DEQUEUE_ANY’,’jmsuser’);    

Pour créer une table AQ, il faut préciser les paramètres suivant :

ü  queue_table                           Le nom de la table AQ (24 caractères).
ü  queue_payload_type         Le type de payload utilisé (utilisé sys.aq$_jms_message pour accepter tout type d’interface de message).
ü  multiple_consumers         Un flag indiquant si la table AQ et de type topic ou non (permet d’accepter plusieurs consommateurs).

Queue Table : myQueueTable
                                                                                                                   
sqlplus jmsuser/jmsuser AS SYSDBA @AQ_CREATE_TABLE_QUEUE.sql
                           
AQ_CREATE_TABLE_QUEUE.sql
execute dbms_aqadm.create_queue_table(queue_table=>'myQueueTable',queue_payload_type=>'sys.aq$_jms_message',multiple_consumers=>false);

Une fois la table AQ crée, on peut créer une ressource AQ JMS queue associée.           Cette ressource est utilisée à la fois pour les queues et topic. Les paramètres à préciser pour créer une queue AQ sont :

ü  queu_name            Le nom de la queue.
ü  queue_table          Le nom de la table AQ créé précédemment

Queue : userQueue

sqlplus jmsuser/jmsuser AS SYSDBA @AQ_CREATE_QUEUE.sql

AQ_CREATE_QUEUE.sql
execute dbms_aqadm.create_queue(queue_name=>'userQueue',queue_table=>'myQueueTable');

PARAMETRAGE WEBLOGIC



DATASOURCE

Il faut ensuite déclarer une DATASOURCE côté Weblogic (utiliser l’utilisateur DATASOURCE déclaré lors de la création de la table AQ) pour accéder à la queue AQ (Les driver JDBC OCI ne sont pas acceptés). Sélectionner le type de driver XA ou non selon le que l’on souhaite utiliser queue XA ou non.

ü Non-XA driver         Transaction locale (via la factory) (ne pas déclarer le paramètre Supports Global Transaction car pas de support d’option LLR, JTS et Emulate Tow-Phase Commit. Dans le cas où l’option est coché, un warning appartait dans les logs de l’instance : Global transactions are supported with XA-based JDBC drivers).
ü XA driver                  Transaction globale ou local

L’option Identity-based connection pools n’est pas supportée.

Data Source : AQ_DataSource

Consoleà${domaine}àServicesàDataSourcesàNewà’AQ_DataSource’

FOREIGN SERVER

Créer un module JMS pour y déclarer un foreign JMS Server (accès à la queue AQ JDBC distante).

Consoleà${domaine}àServicesàJMS ModulesàNewàSystemModule_AQ’

Déclarer dans se module un Foreign Server :

Consoleà${domaine}àServicesàJMS ModulesàNewà SystemModule_AQàNewàForeign ServeràForeignServer-AQ’

Préciser la factory de connexion de type AQ (oracle.jms.AQjmsInitialContextFactory), ainsi que la datasource associé créé précédemment.

Consoleà${domaine}àServicesàJMS ModulesàNewà SystemModule_AQà ForeignServer-AQàConfigurationàGeneral

Ø  JNDI Initial Context Factory=’ oracle.jms.AQjmsInitialContextFactory’
Ø  JNDI Properties=’datasource=AQ_DataSource’

Créer une connexion factory pour  y spécifier le nom JNDI d’accès à la queue AQ dans Weblogic (Local JNDI Name), ainsi que le type de queue créer côté DATABASE (Remote JNDI Name) :

Consoleà${domaine}àServicesàJMS ModulesàNewà SystemModule_AQà ForeignServer-AQàConfigurationàConnection FactoriesàNew

Ø  Name=’ XA_AQ_ForeignConnectionFactory’
Ø  Local JNDI Name=XA_AQ_ForeignConnectionFactory’
Ø  Remote JNDI Name=XAQueueConnectionFactory’

Remote JNDI Name
Remote JNDI Name
JMS Interface
QueueConnectionFactory
javax.jms.QueueConnectionFactory
TopicConnectionFactory
javax.jms.TopicConnectionFactory
ConnectionFactory
javax.jms.ConnectionFactory
XAQueueConnectionFactory
javax.jms.XAQueueConnectionFactory
XATopicConnectionFactory
javax.jms.XATopicConnectionFactory
XAConnectionFactory
javax.jms.XAConnectionFactory

Déclarer l’accès à la queue distante AQ en créant une Destination :

Consoleà${domaine}àServicesàJMS ModulesàNewà SystemModule_AQà ForeignServer-AQàConfigurationàDestinationsàNew

Ø  Name=’ForeignDestination_AQ’
Ø  Local JNDI Name=’ForeignDestination_AQ’
Ø  Remote JNDI Name=’ 'Queues/userQueue'

La partie remote JNDI name spécifie la queue AQ déclaré côté database avec la convention suivante :

Remote JNDI Name
AQ JMS Prefix Value
JMS Interface
Queues/
Javax.jms.Queue
Topics/
javax.jms.Topic

TRANSACTION



CLUSTER



MONITORING



ROBUSTESSE



DEBUGING



Placer le properties JAVA dans la ligne de commande de l’instance qui va supporter le lien à la file AQ. Avec un range de valeur croissant en sévérité de 1 à 6 (6 étant le mode le plus verbeux).

-Doracle.jms.traceLevel=
                                                                                                         
Vous devriez avoir en sortie standard les infos suivantes.

[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection:createQueueSession:  Created session
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.createQueue IN:  queuename: userQueue
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.getQueue IN:   owner: JMSUSER, name: userQueue
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.getQueue:  created AQOracleSession
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.getQueue:  finish AQOracleSession.getQueue()
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.getQueue EXIT:
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.createQueue EXIT :
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) :  ENTRY:waiting for sync
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.preClose:  ENTRY
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.inGlobalTransRechecked:  entry
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.inGlobalTransRechecked:  oracle.jms.useEmulatedXA is on
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] EmulatedXAHandler.inGlobalTrans:  entry, reCheck=true
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] EmulatedXAHandler.checkForGlobalTxn:  entry
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] EmulatedXAHandler.checkForGlobalTxn:  container TM answers NOT IN global txn
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] EmulatedXAHandler.inGlobalTrans:  exit
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.inGlobalTransRechecked:  exit
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.preClose:  abort txn
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.preClose:  EXIT
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) :  b4 closeWait
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) :  after closeWait
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.closeSessionResources:  entry ...
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsSession.closeSessionResources:  Closing general Connection
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsGeneralDBConnection.close:  close DB connection
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) :  EXIT
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) :  ENTRY:waiting for sync
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) :  b4 markClosed of OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) :  after markClosed of OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection.preClose:  ENTRY
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection.preClose:  EXIT
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) :  b4 closeWait
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] closeWait (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) :  b4 close of OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) :  ENTRY:waiting for sync
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6) :  ALREADY CLOSED
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] closeWait (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) :  after close of OJMS.Session.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.6
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) :  after closeWait
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection.localClose:  ENTRY
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsConnection.closeConnectionResources:  Connection closed
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] [[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default(self-tuning)'] close (OJMS.Connection.JFRANCOI-FR.-5b079042:130d13b6e18:-7fff.5) :  EXIT
[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)' [Mon Jun 27 15:14:55 CEST 2011] AQjmsContext.lookup:  lookup return:JMSUSER.userQueue


ADMINISTRATION



ORDERED MESSAGE

CREATE TYPE orders_message_type AS OBJECT (
order_id NUMBER(15),
Product_code VARCHAR2(10),
Customer_id VARCHAR2(10),
order_details VARCHAR2(4000),
price NUMBER(4,2),
region_code VARCHAR2(100));

DBMS_AQADM.CREATE_QUEUE_TABLE (
queue_table => 'aq_admin.orders_qt',
queue_payload_type =>
'aq_admin.orders_message_type'); DBMS_AQADM.CREATE_QUEUE (
queue_name => 'orders_msg_queue',
queue_table => 'aq_admin.orders_msg_qt',
queue_type => DBMS_AQADM.NORMAL_QUEUE,
max_retries => 0,
retry_delay => 0,
retention_time => 1209600,
dependency_tracking => FALSE,
comment => 'Test Object Type Queue',
auto_commit => FALSE);

DBMS_AQADM.START_QUEUE('orders_msg_queue');

SUBSCRIBER

-- need administrator privileges to add
-- subscriber
DBMS_AQADM.ADD_SUBSCRIBER(
Queue_name => ‘aq_admin.orders_msg_queue’,
Subscriber => ‘US_ORDERS’,
Rule => ‘tab.user_data.region_code = ‘`USA’’’);
DBMS_AQADM.ADD_SUBSCRIBER(
Queue_name => ‘aq_admin.orders_msg_queue’,
Subscriber => ‘EUROPE_ORDERS’,
Rule => ‘tab.user_data.region_code =
‘`EUROPE’’’, Transformation =>
‘aq_admin.Dollar_to_Euro’);

MESSAGE TRANSFORMATION 

CREATE FUNCTION
Fn_Dollars_to_Euro(src aq_admin.orders_msg_type
)Returns aq_admin.orders_msg_type AS
Target aq_admin.orders_msg_type;
BEGIN
Target :=
aqadmin.orders_msg_type(src.order_id,
src.product_code, src.customer_id,
src.order_details, src.price*.5,
src.region_code);
END;

DBMS_TRANSFORM.CREATE_TRANSFORMATION(
schema => 'AQ_ADMIN',
name => 'DOLLAR_TO_EURO’,
from_schema => 'AQ_ADMIN',
from_type => 'ORDERS_MSG_TYPE',
to_schema => 'AQ_ADMIN',
to_type => 'ORDERS_MSG_TYPE',
transformation =>
'AQ_ADMIN.Fn_Dollars_to_Euro(source.user_data)');

EXPORT

IMPORT

MOVE

PRODUCE

declare
  -- Local variables here
  queue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
  message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
  message_id RAW(16);
  agent SYS.AQ$_AGENT := SYS.AQ$_AGENT(' ', null, 0);
  my_message SYS.AQ$_JMS_TEXT_MESSAGE;
begin
  my_message := SYS.AQ$_JMS_TEXT_MESSAGE.construct;
  my_message.set_text('my test message');

  -- Test statements here
  DBMS_AQ.ENQUEUE(
    queue_name => 'my_queue',
    enqueue_options => queue_options,
    message_properties => message_properties,
    payload => my_message,
    msgid => message_id);
  commit;
end; 

CONSUME

declare
  queue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
  message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
  message_id RAW(2000);
  my_message SYS.AQ$_JMS_TEXT_MESSAGE;
  msg_text varchar2(32767);
begin
  DBMS_AQ.DEQUEUE(
    queue_name => 'my_queue',
    dequeue_options => queue_options,
    message_properties => message_properties,
    payload => my_message,
    msgid => message_id);
    commit;
    my_message.get_text(msg_text);
    DBMS_OUTPUT.put_line('JMS message: '||msg_text);
end;


START

 connect jmsuser / jmsuserpwd;
execute dbms_aqadm.start_queue(queue_name=>'userQueue');

STOP

connect jmsuser / jmsuserpwd
execute dbms_aqadm.stop_queue(queue_name=>'userQueue');

SUSPEND

PURGE

WLST





 startEdit()  
 cd('/')  
 cmo.createJMSSystemResource('SystemModule-0')  
 cd('/SystemResources/SystemModule-0')  
 set('Targets',jarray.array(, ObjectName))  
 cd('/JMSSystemResources/SystemModule-0/JMSResource/SystemModule-0')  
 cmo.createForeignServer('ForeignServer-0')  
 cd('/JMSSystemResources/SystemModule-0/JMSResource/SystemModule-0/ForeignServers/ForeignServer-0')  
 cmo.setDefaultTargetingEnabled(true)  
 cmo.setConnectionURL('some.url')  
 cmo.setInitialContextFactory('SomeInitialContextFactory')  
 cmo.createForeignDestination('ForeignDestination-0')  
 cd('/JMSSystemResources/SystemModule-0/JMSResource/SystemModule-0/ForeignServers/ForeignServer-0/ForeignDestinations/ForeignDestination-0')  
 cmo.setLocalJNDIName('localQ')  
 cmo.setRemoteJNDIName('remoteQ')  
 activate()  

STANDALONE CLIENT



Ajouter l’option dans le scripte de démarrage de l’instance Weblogic afin de pouvoir se connecter sur l’arbre JNDI de Weblogic sans mot de passé à partir de l’extérieure.

-Dweblogic.jdbc.remoteEnabled=true

Lorsqu’un client requête la ressource du Foreign server, il faut lui préciser toutes les informations d’accès à la Database en plus de la DataSource (peut être un problème). Si on précise également la DataSource, c’est celle-ci qui sera utilisée.



0 commentaires:

AUTEUR

Ma photo
Carrières Sur Sein, Yvelines, France
Consultant Oracle (Ancien consultant BEA depuis 2001), je m’occupe des expertises sur les produits Oracle : SOCLE (Weblogic, Coherence, JRockit) SOA (Service Bus, SOA Suite, BPM)
MON CV

LABEL 3D

Blogumulus by Roy Tanck and Amanda Fazani

LABEL CLOUD

MAP

Locations of visitors to this page

AUTRES BLOG

LIVRES

MEMBRES