28.08.2015

Weblogic: weblogic.jdbc.wrapper.Blob_oracle_sql_BLOB cannot be cast to oracle.sql.BLOB

Ошибка возникает потому, что типы oracle.sql сервер Weblogic обвязывает в свои из weblogic.jdbc.wrapper.
Решение 1 - отключить обвязку на уровне источника данных через консоль, галочку нужно снять:


Решение 2 (и предпочтительное) - выполнить приведение типов в коде.
Код до:
public Connection getServerConnection() {
      System.out.println("DataSource = " + this._ds);
      Connection conn = null;
      try {
  if (this.conn == null){
              conn = this._ds.getConnection();  //меняем эту строку
         }
      } catch (SQLException var4) {
         String msg = "ERROR. Cannot get connection from datasource: " + var4.getMessage();
         System.out.println(msg);
         var4.printStackTrace();
      }
      return conn;
}
Код после:
import oracle.jdbc.OracleConnection;
import weblogic.jdbc.extensions.WLConnection;

public Connection getServerConnection() {
      System.out.println("DataSource = " + this._ds);
      Connection conn = null;
      try {
  if (this.conn == null){
              conn = (((WLConnection) this._ds.getConnection()).getVendorConnection());
         }
      } catch (SQLException var4) {
         String msg = "ERROR. Cannot get connection from datasource: " + var4.getMessage();
         System.out.println(msg);
         var4.printStackTrace();
      }
      return conn;
}
Класс WLConnection можно подключить через com.bea.core.datasource_1.9.0.0.jar

27.08.2015

Парсер SAX

SAX - альтернатива стандартному парсеру DOM, который в силу особенностей реализации (создание в памяти объекта XMLDocument, содержащего целиком весь файл), подходит только для распарсивания маленьких xml-документов.

Фишка парсера в том, что поток InputStream обрабатывается последовательно и к тем или иным событиям применяется пользовательская логика:
             SAXParserFactory factory = SAXParserFactory.newInstance();
             SAXParser parser;
             parser = factory.newSAXParser();
             MySAXParser prsHandler = new MySAXParser();
             parser.parse(is, prsHandler);
, где is - объект класса InputStream, MySAXParser - класс с перекрытыми методами обработки событий
public class MySAXParser extends DefaultHandler{
    private String currentParameterTypes;
    private String currentQName;
 
    @Override
    public void startDocument(){  //событие начала парсинга
        System.out.println("start parse document;");
    }
   
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes){
        // встретили элемент
        this.currentParameterTypes = qName;
    }
   
    @Override
    public void endElement(String uri, String localName, String qName){
        // вышли из элемента
    }
   
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // получает значение тега/атрибута this.currentParameterTypes
        String value = new String(ch, start, length);
    }
}
Ниже - график заполнения heap'a во время распарсивания файда в 150МБ.




11.08.2015

Weblogic: Cannot read from policy store

Cannot read from policy store. Reason is PolicyStore Error, javax.xml.stream.XMLStreamException

Данная ошибка означает, что процесс не может прочитать настройки политик для домена.

При детальном осмотре файловой системы оказалось, что файл %domain%\config\fmwconfig\system-jazn-data.xml в какой-то момент стал пустым (подробнее о структуре файла). Проблема решилась заменой данного файла работоспособным, взятым у коллеги.