четверг, 1 ноября 2012 г.

Проблема с сохранением изменений в Oracle SQL Developer

Проблема:
При сохранить изменения в таблице через Oracle SQL Developer получается ошибка:
 One error saving changes to table "SCHEMA"."TABLENAME":
 Row 1: Data got commited in another/same session, cannot update row.
Вариант решения:
  1. В SQL Developer перейти в меню "Tools"->"Preferences":
  2. В настройках "Database"->"Object Viewer" убрать галку "Use ORA_ROWSCN for DataEditor":

понедельник, 22 октября 2012 г.

Ошибка "java.lang.UnsupportedOperationException: Remote JDBC disabled" и варианты её решения

Ошибка:
При попытке удалённого доступа к DataSource-у Weblogic-сервера генерируется следующая ошибка:
 java.lang.UnsupportedOperationException: Remote JDBC disabled  
      at weblogic.rjvm.ResponseImpl.unmarshalReturn(ResponseImpl.java:234)  
      at weblogic.rmi.cluster.ClusterableRemoteRef.invoke(ClusterableRemoteRef.java:348)  
      at weblogic.rmi.cluster.ClusterableRemoteRef.invoke(ClusterableRemoteRef.java:259)  
      at weblogic.jdbc.common.internal.RmiDataSource_1036_WLStub.getConnection(Unknown Source)  
      at oracle.integration.platform.blocks.event.saq.SAQRemoteBusinessEventConnection.createConnection(SAQRemoteBusinessEventConnection.java:122)  
      at oracle.integration.platform.blocks.event.saq.SAQRemoteBusinessEventConnection.enqueueEvent(SAQRemoteBusinessEventConnection.java:67)  
      at oracle.integration.platform.blocks.event.saq.SAQRemoteBusinessEventConnection.publishEvent(SAQRemoteBusinessEventConnection.java:54)  
      ...  
 Caused by: java.lang.UnsupportedOperationException: Remote JDBC disabled  
      at weblogic.jdbc.common.internal.JDBCServerHelperImpl.<clinit>(JDBCServerHelperImpl.java:50)  
      at weblogic.jdbc.common.internal.JDBCService.initialize(JDBCService.java:91)  
      at weblogic.jdbc.common.internal.JDBCService.start(JDBCService.java:138)  
      at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)  
      at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)  
      at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)  
Причина:
Удалённый доступ к JDBC отключен в Weblogic Server.

Варианты решения:
Первый вариант:
  1. Перейти в директорию домена. Перейти в поддиректорию bin и изменить файл setDomainEnv.sh
  2. Найти свойство WLS_JDBC_REMOTE_ENABLED и изменить его значение с false на true:
     ...  
     WLS_JDBC_REMOTE_ENABLED="-Dweblogic.jdbc.remoteEnabled=true"  
     export WLS_JDBC_REMOTE_ENABLED  
     ...  
    
  3. Перестартовать все Managed-сервера домена.
Второй вариант:
  • Установить при запуске сервера системное свойство (как сделать см.здесь):
     -Dweblogic.jdbc.remoteEnabled=true  
    

воскресенье, 7 октября 2012 г.

Публикация события в EDN из Java

Рассмотрим пример публикации события в EDN из Java для AQ и JMS на примере события:
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
 <definitions xmlns="http://schemas.oracle.com/events/edl" targetNamespace="http://schemas.oracle.com/events/edl/TestEvent">  
   <schema-import namespace="http://nl.xenta/events" location="xsd/TestEvent.xsd"/>  
   <event-definition name="EventElement">  
     <content xmlns:ns0="http://nl.xenta/events" element="ns0:TestEvent"/>  
   </event-definition>  
 </definitions>  
По-умолчанию используется механизм AQ, но можно настроить и с использованием JMS (см. 41.3.6 How to Configure JMS-based EDN Implementations)

Класс реализующий отправку события:
 import oracle.fabric.blocks.event.BusinessEventConnection;  
 import oracle.fabric.blocks.event.BusinessEventConnectionFactory;  
 import oracle.integration.platform.blocks.event.BusinessEventBuilder;  
 import oracle.integration.platform.blocks.event.jms.JmsRemoteBusinessEventConnectionFactory;  
 import oracle.integration.platform.blocks.event.saq.SAQRemoteBusinessEventConnectionFactory;  
 import oracle.soa.common.util.XMLUtil;  
 import org.w3c.dom.Element;  
 import java.util.Date;  
 import java.util.Properties;  
 import javax.jms.Queue;  
 import javax.jms.QueueConnectionFactory;  
 import javax.naming.Context;  
 import javax.naming.InitialContext;  
 import javax.naming.NamingException;  
 import javax.sql.DataSource;  
 import javax.transaction.UserTransaction;  
 import javax.xml.namespace.QName;  
   
 public class EdnUtils {  
   private static final String EDN_JMS_CONNECTION_FACTORY_NAME = "jms/fabric/EDNConnectionFactory";  
   private static final String EDN_JMS_XA_CONNECTION_FACTORY_NAME = "jms/fabric/xaEDNConnectionFactory";  
   private static final String EDN_QUEUE_NAME = "jms/fabric/EDNQueue"; 
   private static final String EDN_DATASOURCE = "jdbc/EDNDataSource";
   private static final String EDN_LOCALTX_DATASOURCE = "jdbc/EDNLocalTxDataSource"; 
   
   public static void main(String[] args) {  
     Properties props = new Properties();  
   
     props.put(Context.PROVIDER_URL, "t3://127.0.0.1:8001");  
     props.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");  
     props.put(Context.SECURITY_PRINCIPAL, "weblogic");  
     props.put(Context.SECURITY_CREDENTIALS, "welcome1");  
   
     try{  
       String eventName = "EventElement";  
       String eventNamespace = "http://schemas.oracle.com/events/edl/TestEvent";  
       String eventBodyStr = "<TestEvent xmlns=\"http://nl.xenta/events\">\n"  
                   + "<action>action from java</action> \n"   
                   + "<description>description at [" + new Date() + "]</description> \n"   
                   + "</TestEvent>";  
       Element eventBody = XMLUtil.parseDocumentFromXMLString(eventBodyStr.toString()).getDocumentElement();  
        
       InitialContext context = new InitialContext(props);  
   
       EdnUtils.publishEvent(context, false, eventName, eventNamespace, eventBody);  
     } catch (Exception e) {  
       e.printStackTrace();  
     }  
   }  
   
   public static void publishEvent(InitialContext context, boolean isJmsEdnMode, String eventName,  
                   String eventNamespace, Element eventBody) throws NamingException {  
     BusinessEventConnectionFactory factory = null;  
     UserTransaction userTransaction =  
       (UserTransaction) context.lookup("javax.transaction.UserTransaction");  
   
     if (!isJmsEdnMode) {  
       DataSource ds = (DataSource) context.lookup(EDN_DATASOURCE);  
       DataSource localTxDs = (DataSource) context.lookup(EDN_LOCALTX_DATASOURCE);  
   
       factory = new SAQRemoteBusinessEventConnectionFactory(ds, localTxDs, userTransaction);  
     } else {  
       QueueConnectionFactory queueConnectionFactory =  
         ((QueueConnectionFactory) context.lookup(EDN_JMS_CONNECTION_FACTORY_NAME));  
       QueueConnectionFactory xaQueueConnectionFactory =  
         ((QueueConnectionFactory) context.lookup(EDN_JMS_XA_CONNECTION_FACTORY_NAME));  
       Queue jmsQueue = ((Queue) context.lookup(EDN_QUEUE_NAME));  
   
       factory = new JmsRemoteBusinessEventConnectionFactory(queueConnectionFactory, xaQueueConnectionFactory,  
           jmsQueue, userTransaction);  
     }  
   
     BusinessEventConnection conn = factory.createBusinessEventConnection();  
   
     BusinessEventBuilder builder = BusinessEventBuilder.newInstance();  
   
     builder.setEventName(new QName(eventNamespace, eventName));  
     builder.setBody(eventBody);  
   
     conn.publishEvent(builder.createEvent(), 3);  
     conn.close();  
   }  
 }  
Для сборки и запуска примера из JDeveloper потребуются следующие библиотеки:
Данное приложение-пример для JDeveloper содержащее два проекта (здесь):
  • EventToFile - композит который при получении события пишет в файл на файловой системе, так же через него можно отправить событие;
  • PublishEventFromJava - проект содержащий данный пример.

вторник, 25 сентября 2012 г.

Тренинги по Oracle Unified Method

Тренинги по Oracle Unified Method доступны на Oracle Learning Library.
На момент написания статьи доступно два уровня OUM: Все тренинги по OUM на Oracle Learning Library здесь.

Полезные ссылки:
  • Официальный блог здесь
  • Информация об сертификации Oracle Unified Method 5 Essentials (1Z0-568) здесь