вторник, 20 апреля 2010 г.

Unexpected Log from org.apache.commons.httpclient.Wire

В commons-httpclient-3.1 славный парень Oleg Kalnichevski нахуячил  в классе org.apache.commons.httpclient.Wire :


    public static Wire HEADER_WIRE = new Wire(LogFactory.getLog("httpclient.wire.header"));

   

    public static Wire CONTENT_WIRE = new Wire(LogFactory.getLog("httpclient.wire.content"));



Соответсвенно даже если в log4j.properties прописано что то типа 
log4j.logger.org=WARN
сраный лог из httpclient продолжает валиться.
засим в log4j.properties надо добавить что то вроде
log4j.logger.httpclient=ERROR.

Что интересно, на http://hc.apache.org/httpclient-3.x/logging.html в примере логирования присутствуют указания на эту хрень...

четверг, 15 апреля 2010 г.

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544336. deadlock update conflicts with concurrent update

Эта хрень возникает из за того что два потока пытаются одновременно изменить поля одной и той же ентити. Вот что пишут про это
 http://www.firebirdfaq.org/faq151/ ,
http://edn.embarcadero.com/article/30213.

В целом есть два способа это побороть

1)В коде добавить синхронизацию

2)Разобраться с изоляцией транзакций.
Подробнее:
http://ru.wikipedia.org/wiki/Уровни_изолированности_транзакций
для хибернэйта они задаются параметром  hibernate.connection.isolation в пропертях,
значения описаны в java.sql.Connection:
Наверняка:
для hibernate, в пропертях прописать: hibernate.connection.isolation=8

Выдержки из java.sql.Connection:

    /**
     * A constant indicating that transactions are not supported.
     */
    int TRANSACTION_NONE     = 0;

    /**
     * A constant indicating that
     * dirty reads, non-repeatable reads and phantom reads can occur.
     * This level allows a row changed by one transaction to be read
     * by another transaction before any changes in that row have been
     * committed (a "dirty read").  If any of the changes are rolled back,
     * the second transaction will have retrieved an invalid row.
     */
    int TRANSACTION_READ_UNCOMMITTED = 1;

    /**
     * A constant indicating that
     * dirty reads are prevented; non-repeatable reads and phantom
     * reads can occur.  This level only prohibits a transaction
     * from reading a row with uncommitted changes in it.
     */
    int TRANSACTION_READ_COMMITTED   = 2;

    /**
     * A constant indicating that
     * dirty reads and non-repeatable reads are prevented; phantom
     * reads can occur.  This level prohibits a transaction from
     * reading a row with uncommitted changes in it, and it also
     * prohibits the situation where one transaction reads a row,
     * a second transaction alters the row, and the first transaction
     * rereads the row, getting different values the second time
     * (a "non-repeatable read").
     */
    int TRANSACTION_REPEATABLE_READ  = 4;

    /**
     * A constant indicating that
     * dirty reads, non-repeatable reads and phantom reads are prevented.
     * This level includes the prohibitions in
     * TRANSACTION_REPEATABLE_READ and further prohibits the
     * situation where one transaction reads all rows that satisfy
     * a WHERE condition, a second transaction inserts a row that
     * satisfies that WHERE condition, and the first transaction
     * rereads for the same condition, retrieving the additional
     * "phantom" row in the second read.
     */
    int TRANSACTION_SERIALIZABLE     = 8;

четверг, 25 марта 2010 г.

Recursive generic


Увидел нечто подобное у своего коллеги =)


public class X {

  static class A<T extends A<T>> {

    public T createObejct() {
      return null;
    }
  }

  static class B extends A<B> {
    public B createObejct() {
      return null;
    }
  }
  public static void main(String[] args) {
    new B().createObejct();
  }

}



четверг, 11 марта 2010 г.

Unexpected generics behaviour

If someone knows what the fuck please suggest!




public class Test {

  public interface EntityObject {

  }


  public interface SomeInterface {

  }


  public class BasicEntity implements EntityObject {

  }


  public interface BuisnessObject<E extends EntityObject> {

    E getEntity();

  }





  public interface ComplexObject1<V extends SomeInterface> extends BuisnessObject<BasicEntity> {

  }


  public interface ComplexObject2 extends BuisnessObject<BasicEntity> {

  }


   public void test(){

    ComplexObject1 complexObject1 = null;

    ComplexObject2 complexObject2 = null;

    EntityObject entityObject1 = complexObject1.getEntity();

    //BasicEntity entityObject1 = complexObject1.getEntity(); wtf incompatible types!!!!

    BasicEntity basicEntity = complexObject2.getEntity();

  }

}







среда, 17 февраля 2010 г.

HibernateOptimisticLockingFailureException

При попытке сделать hibernateTemplate.saveOrUpdate(entity) вывалился такой иксэпшн:


org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Иксэпшн вываливается потому что у entity был id!=null и в базе не было entity с такой id. Фактически хибернэйт при сохранении entity вместо insert пытался сделать update. 

Решил проблему вызов save вместо saveOrUpdate.

Помогла

вторник, 2 февраля 2010 г.

Тануки: комплимент с дерьмом

Есть такая сеть ресторанов -ТАНУКИ. И вот однажды я с другом зашёл  перекусить в ресторанчик на Генерала Белова(вспоминается история про бар кручёная сиська). В ресторане было полно свободных мест и мы выбрали замечательное место в курящем зале. Приветливая официантка-таджичка расторопно принесла меню и заказ был сделан. Принесли его довольно быстро, и трапеза началась. Закончив с едой я решил отведать чаю КОМПЛИМЕНТ. Этот чай разливается бесплатно всем посетителям тануки, основной его ингридиент судя по вкусу - каргадэ.
  Есть у меня такая особенность - не люблю когда в чае сверху плавают чаинки - поэтому когда я пью чай в котором сверху плавают чаинки я на них укоризненно смотрю. Вот и в этот раз. Но в чае плавало нечто, что сразу идентифицировать я не смог. Это нечто было овальной формы, коричневого цвета, где то 4 мм в ширину и около сантиметра в длину. Достав это из чая я подверг найденный артефакт пристальному изучению и выяснил что это кал или очень отожравшейся мыши или средней такой крысы. Я позвал мэнэджера и попросил её объяснить что это такое. Увидев экскременты мэнеджер(миловидная белая девушка) не растерялась и заявила что это такие ягоды,но в принесённых ей позже образцах чая таких ягод больше не попалось(видимо все съели - очень вкусные, правда попробовать эту ягоду мэнэджер отказалась). После этого была выдвинута версия два - это сорт другого чая, который туда случайно попал. Я отщепнул кусочек дерьма и передал его мэнеджеру чтобы она нашла мне такой же чай - больше я этот кусочек не видел, что впрочем меня не особо расстраивает, а вернувшаяся белая девушка мэнеджер заявила что она ничего не искала и не собиралась(куда она ходила с калом в кармене не ясно). Спустя какое то время мэнеджер призвала себе на помощь ещё одного белого человека - мусина в самом расцвете сил. Чертовски логичный. На мой вопрос: "А что вы будете делать если в  чае который вам принесли вы обнаружите дерьмо?" он ответил "Я закажу ещё чая". Короче он почти убедил меня что это не дерьмо а чай ферментированный видимо самим тануки, привезённым из японии.

Выводы:
1)Дерьмо всплывает
2)Не ходите в тануки. Там дерьмо в еде.

суббота, 23 января 2010 г.

How to set Spring bean properties

Казалось бы тривиальная задача. Но вот возникла проблема - а именно вопрос: Как передать в качестве параметров одного бина - параметры другого. Задача возникла исходя из желания конфигурировать org.springframework.beans.factory.config.PropertyPlaceholderConfigurer(умеет врапить проперти из всяких файлов типа config.properties в переменные applicationContext.xml) не из applicationContext.xml, а из командной строки при запуске приложения.