Dall’1.4.2 della JDK la garbage collection e la deallocazione delle risorse e’ stata probabilmente ritoccata e migliorata.
Prima era possibile passare come parametro tra metodi di classi differenti un Result Set e questo rimaneva in vita anche se lo statement veniva chiuso.
Adesso non e’ piu’ cosi e si potrebbe andare incontro ad un errore : Exception:java.sql.SQLException: ResultSet is closed.
Per ovviare a questo inconveniente e permettere il passaggio di result set tra classi, la SUN promuove un JAR (rowset.jar) (ancora non introdotto nella jdk standard) che introduce il concetto di CachedResultSet.
CachedRowSetImpl crs = new CachedRowSetImpl();
crs.populate(rs);
In questo modo viene popolato da un
Result Set (rs) di partenza
un istanza di Cachedresultset (crs),
che puo’ essere serializzato e passato come
parametro.
Se si va incontro ad un errore di questo tipo :
java.lang.NullPointerException
java/lang/Throwable.<init>(Throwable.java:180)
java/lang/Exception.<init>(Exception.java:29)
java/lang/NullPointerException.<init>(NullPointerException.java:36)
java/io/Reader.<init>(Reader.java:61)
java/io/InputStreamReader.<init>(InputStreamReader.java:80)
java/util/Properties.load(Properties.java:266)
java/util/PropertyResourceBundle.<init>(PropertyResourceBundle.java:96)
com/sun/rowset/JdbcRowSetResourceBundle.<init>(Unknown
Source)
com/sun/rowset/JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle(Unknown
Source)
com/sun/rowset/CachedRowSetImpl.<init>(Unknown
Source)
Significa che si sta verificando il bug
della versione attualmente presente della libreria in
oggetto.
Cioe’ nel jar esiste una classe JdbcRowSetResourceBundle che si occupa di leggere il file di property presente nel jar stesso secondo il seguente codice :
Locale locale = Locale.getDefault();
String s = locale.getCountry();
if(!s.equals("") && !s.equals("US"))
propResBundle = new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/sun/rowset/RowSetResourceBundle_"
+ s + "." + "properties"));
else
propResBundle = new PropertyResourceBundle(Thread.currentThread().getContextClassLoader().getResourceAsStream("com/sun/rowset/RowSetResourceBundle.properties"));
Quindi sulla base del Locale considerato prende il RowSetResourceBundle.properties specfico,
il problema pero’ e’ che di RowSetResourceBundle.properties
nel jar non ne esiste uno per ogni country(es. per Italy RowSetResourceBundle_IT.properties) e quindi se non
stiamo usando il country US, non trovandolo va in errore.
Per fissare il problema occorre vedere che locale si usa, e inserire nel Jar una copia del .properties presente con il giusto nome a seconda del getCountry utilizzato.