lunedì 28 febbraio 2011

Come migrare da Weblogic o Websphere a Tomcat

Questo articolo è interessante, più che per i tips di migrazione, per il confronto tra i vari Application Server ( e perché ho scoperto OpenEJB non si finisce mai di imparare)

sabato 26 febbraio 2011

Google AppEngine e le Query in Java

Ho giocato un po' con Google App Engine.
In particolare ho cercato di capire come funziona la gestione del database da un'applicazione Java.
Google App Engine store i suoi dati su quello che viene chiamato Datastore. Il Datastore azzera totalmente per l'utente la gestione di replica, bilanciamento di carico e backup, che è tutta a carico dell'infrastruttura.
L'accesso ai dati viene quindi fatto attraverso un set di API, rese disponibili da Google. Sopra queste API è stato creato un meccanismo che permette di accedere ai dati in due modi standard: o via JPA, le Java Persistence API delle specifiche J2EE, o via JDO, i Java Data Objects di Apache.
Queste due tipologie di accesso vengono rese disponibili attraverso il framework DataNucleus, che si occupa di tradurre (fra l'altro in fase di compilazione) la gestione degli oggetti di persistenza.
La documentazione di Google focalizza i suoi esempi sull'uso di JDO, che non conoscevo, e che quindi mi ha stuzzicato l'appetito.
Per fare un test ho provato a creare una classe Author, con le sole proprietà id e name, fatta così



Le annotations contenute in questa classe consentono a DataNucleus di mappare la classe su una tabella.
Le chiavi primarie per il DataStore sono di tre tipi: Long, Key (un tipo dati custom del DataStore) o String: questo tipo di dati in particolare deve essere gestito dall'applicativo, non viene mai calcolato automaticamente.
Il DataStore richiede che un oggetto abbia una chiave primaria.
Nel mio esempio non volevo usare una String come chiave primaria, ma volevo però che il nome fosse univoco, ed ho quindi taggato con l'annotation @Unique la proprietà name.
Per salvare un oggetto è sufficiente, ottenuto quello che si chiama un PersistenceManager, invocare il metodo makePersistent(Object o).
Ora, supponiamo di aver salvato una serie di autori che iniziano con la A, ad esempio Asimov, Aristotele, Alighieri e di volergli ritrovare.
Se stessi usando Hibernate recupererei una Session, aggiungerei Criteria e Restrictions oppure farei una Query in HSQL.
Con JDO, guardando la documentazione, si ottiene un oggetto Query e su quello si può usare il metodo setFilter o il linguaggio JDOQL, simile a HSQL.
Vediamo quindi come scrivere una query che trovi tutti gli autori che cominciano per A



Dall'esempio si vede che, recuperato il PersistenceManager attraverso una classe si utilità, si crea una Query e su quella, dichiarato che si stanno facendo query sulla classe Author, si applica un filtro.
La clausola SQL LIKE si esprime in JDOQL con .startsWith() e poi si dichiarano i parametri  con la sintassi
Il metodo execute() della query recupera gli oggetti precedentemente salvati. Google App Engine ha un bug in questa operazione: quando gli oggetti vengono sganciati ("detached") dal DataStore, se si tenta di scorrere la List, viene lanciata un'eccezione. Bisogna quindi chiamare il metodo .size() prima di chiudere il PersistenceManager, per permettere il corretto caricamento di tutto l'array.

Tutto qua, per ora, il prossimo step sarà capire come gestire le relazioni 1-n e soprattutto come recuperare entità partendo dalla relazione figlia.
See You Next Time!!!

giovedì 17 febbraio 2011

eXtreme Programming: le regole della semplicità

http://www.c2.com/cgi/wiki?XpSimplicityRules
Che altro dire? Magari si riuscisse a fare sempre un lavoro del genere! :-D

lunedì 14 febbraio 2011

GWT 2.2 ed Eclipse Plugin ora disponibili

Google ha appena rilasciato una nuova versione di GWT e del plugin per Eclipse.
La notizia di maggior rilievo è che è stato integrato il GUI Designer nel plugin.
Inoltre sono stati migliorati il supporto per Html5 e le Api per CellTable

Creare partizioni in tempo reale: un errore comune

Josh Berkus, tra i fondatori di PostGreSQL, ci dice perchè, a suo avviso, è meglio non creare partizioni attraverso i trigger, ma schedulare, da bravi DBA, la creazione.
http://it.toolbox.com/blogs/database-soup/partition-at-insert-time-a-smart-mistake-44294?rss=1