JAVA

 

CachedRowSetImpl

 

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.