пятница, 18 декабря 2009 г.

ProcessBuilder java.io.IOException: Cannot run program : CreateProcess error=123

ProcessBuilder мутный. Он непонимает команду одной строчкой.



Такую строчку он не поймёт - CreateProcess error=123







 String debugCmd = "C:\\development\\Java\\jdk1.6.0_12\\bin\\java -cp C:\\work\\trunk\\Server\\lib\\xxx.jar; xxx.Test";

а такую совсем не поймёт - CreateProcess error=2


String debugCmd = "java -cp C:\\work\\trunk\\Server\\lib\\xxx.jar; xxx.Test";

а так поймёт!
String[] debugCmd = new String[]{
    "java", "-cp", "C:\\work\\trunk\\Server\\lib\\xxx.jar;", "xxx.Test"
  };


и поехали
ProcessBuilder processBuilder = new ProcessBuilder(debugCmd);
            processBuilder.directory(new File(home));
            processBuilder.redirectErrorStream(true);
            Process process = processBuilder.start();


узнал тут :
http://forums.sun.com/thread.jspa?threadID=5396595&messageID=10761026

среда, 16 декабря 2009 г.

Генератор classpath

Рекурсивный генератор classpath. Всасывает только jar.

суббота, 5 декабря 2009 г.

Hibernate - merge update refresh

                                 Пусть в абсолютно сферическом хибернейте на абсолютно перпендикулярной базе есть ентитя, и у неё есть два интовых поля a и b. 


четверг, 26 ноября 2009 г.

SymmetricDS UDF Firebird fuck


Invalid token.
invalid request BLR at offset 63.
function SYM_ESCAPE is not defined.
module name or entrypoint could not be found.

Хня похоже не зависит от системы(винды) - вообще непонятно от чего она зависит. Одинаково хорошо проявлялась на windows server 2003(32), 2008(32/64) с Firebird(2.1.3, 2.0.5). Возникает потому что udf  SYM_UDF.dll не всасывается. Для того чтобы всосалась необходимо пересобрать эту udf в VisualStudio под Runtime 8.0.

понедельник, 16 ноября 2009 г.

OSGI ant bnd fuck

bnd
это такая jar ка
 http://www.aqute.biz/Code/Download

Зачем bnd?
Умеет делать красивый манифест с импортами и экспортами по спецификации OSGI и jar.

Нада bnd?
Вообще нет. Основная фишка что он автоматически умеет вписывать пэкэджи в манифест.

Как bnd?
Тулза используется в ряде фрэймворков для генерации jar под OSGI. В анте она работает так -
лезит в спец файл(обычно он имеет расширение .bnd) и получает оттуда пути всех используемых в билде jar и маски импортов-экспортов, на основе чего генерит манифест и jar.

вторник, 10 ноября 2009 г.

Osmorc fuck



Osmorc for IDEA 8 Release 0.14.0

Ни в коем случае не связываться с этим говном. 

среда, 21 октября 2009 г.

Как повесить System.exit(0)

Как написано в доках - This method never returns normally...

Вообще хуки они -
They should, in particular, be written to be thread-safe and to avoid deadlocks insofar as possible. They should also not rely blindly upon services that may have registered their own shutdown hooks and therefore may themselves in the process of shutting down. Attempts to use other thread-based services such as the AWT event-dispatch thread, for example, may lead to deadlocks.  

вторник, 20 октября 2009 г.

Java Service Wrapper

Он клёвый и простой.
Можно указывать зависимости от других сервисов. Куча настроек.
Таймауты на запуск/перезапуск и тп.

Как внедрять:

1)Пускач должен наследоваться от 
implements WrapperListener


четверг, 15 октября 2009 г.

Репликация с SymmetricDS

С первого взгляда всё просто, но потом появляются всякие левые ошибки, частично связанные с таймаутами(необходимо неопределённое время на запуск сервера репликации), частично хрен знает с чем.  Все примеры есть во вражеском коде - там типа скрипты, в документации описана последовательность действий для тестов(см глава 2) Вот пример на яве:


среда, 7 октября 2009 г.

Репликация с db4o

Как бы попроще организовать репликацию данных между серверами. Вот в чём вопрос.
db4o(http://www.db4o.com) клёвые. Со своим 
dRS Replication System(http://www.db4o.com/about/productinformation/resources/dRS-6.0-tutorial-java.pdf) они могут реплицировать базы через хибернейт соединения типа


вторник, 6 октября 2009 г.

org.hibernate.AssertionFailure: possible nonthreadsafe access to session

Следствие того что где-то в коде присутствует следующая последовательность

          hibernate.saveOrUpdate(obj);
          ................................................................
          hibernate.evict(obj);
причём эта последовательность находится внутри транзакции(если нет транзакции то между этой последовательностью нету flush())

четверг, 24 сентября 2009 г.

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

   Ошибка возникает потому что пытаемся сохранить/удалить/проапдейтить объект из другой сессии, который уже загружен в нашей сессии(закэширован).
 Лечение:
1) 100% лекарство использовать hibernateTemplate.merge(object);
2) 100% лекарство которое приводит к обнулению всего кэша

      hibernateTemplate.flush();
      hibernateTemplate.clear();
      hibernateTemplate.saveOrUpdate(object);


3)   лекарство может не помочь

      hibernateTemplate.evict(object); - убирает объекты из кэша сравнивая их по объектной ссылке
      hibernateTemplate.saveOrUpdate(object); - проверяет наличие объектов в кэше(прежде чем их сохранить) по айдишнику. Вывод: такая пара смысла не имеет(ну, имеет смысл в рамках одной сессии и совсем для другого).

      Можно написать так:
      Class dataObjectClass = object.getClass();
      long id = object.getId();
      T dataObject = (T) hibernateTemplate.get(dataObjectClass, id);

      if (dataObject != null) {
        hibernateTemplate.evict(dataObject );
      }

Но это спасёт нас только в том случае - если в ентитях нигде нету перекрёстных ссылок. Если они есть - то при каскадном сохранении будут ентити добавляться в кэш по нескольку раз и в результате получим тот же иксэпшн(Зы: иксэпшн будет валиться непосредственно при комите транзакции и всякие flush перед evict тут непомогут).

    
  
4) делать всё в одной сессии
5)загрузить по id,  выставить необходимые поля, сохранить

org.hibernate.LazyInitializationException

Возникает потому что сессия, в которой был получен объект - закрыта, а поля объекта были помечены как @XXXToXXX(fetch = FetchType.LAZY).
Лечение:
1)меняем аннотацию на @XXXToXXX(fetch =FetchType.EAGER) - самый простой способ но вызывает осложнения типа долгой загрузки объекта
2)вычитав объект впервые тут же инициализируем поле с FetchType.LAZY -
делаем это так - hibernateTemplate.initialize(entity) - самый бестолковый способ
3)даём новой сессии права на работу с объектом -    
if (!hibernateTemplate.contains(track)) {
                hibernateTemplate.lock(track, LockMode.READ);;
 - самый клёвый способ НО!
you only use lock() if you are sure that the object has not been modified - иначе 

org.springframework.dao.InvalidDataAccessApiUsageException: cannot lock an unsaved transient instance: 
4) делать всё в одной сессии
5)прикрепляем к новой сессии через
             if (!hibernateTemplate.contains(track)) {
                 hibernateTemplate.merge(track);}
6)если таки точно собрались загружать поля то можно сделать hql запрос типа:
List<Customer> list = hibernateTemplate.find(
            "select distinct с from Customer с " +
            "left join fetch c.orders where c=?", customer);
в sql
 select distinct from Customer c left join fetch c.orders
 http://bwinterberg.blogspot.com/2009/08/how-to-eagerly-fetch-associations-with.html
7)Есть спец фильтры для загрузки нужных частей сущностей см. тут
http://bwinterberg.blogspot.com/2009/09/hibernate-preload-pattern.html
8)держать сессию открытой(паттерн типа '...а после нас хоть потоп') http://alekseiko.blogspot.com/2010/02/hibernate-lazyinitializationexception.html
9)загрузить по id,  выставить необходимые поля, сохранить
10)Написать свою аннотацию, которая будет проверять необходимость переподключения коллекции к новой сессии: http://9mmedia.com/blog/?p=272

среда, 23 сентября 2009 г.

Тик-так, ж-ж-ж

Тик-так, ж-ж-ж.
Огромный серый грибулонский разведывательный корабль тихо плыл сквозь черную пустоту (а может, пустую черноту?). Он несся с невероятной, захватывающей дух скоростью, и все же на фоне биллионов далеких-далеких звезд казалось, будто он не движется вовсе. Так, темная крапинка, примерзшая к бархатной подкладке бриллиантовой ночи.
На борту корабля все шло так, как было тысячелетиями. Тишь-гладь-темень.
Тик-так, ж-ж-ж.
Ну-у-у, редкие исключения не в счет.
Тик-тик-так, ж-ж-ж.
Тик-ж-ж-так-ж-ж-тик-ж-ж.
Тик-тик-тик-тик-так-ж-ж.
Хм-м-м.