2010-02-09 13 views
13

Sto studiando utilizzando javax.sql.rowset.CachedRowSet in una parte della mia applicazione, tuttavia posso solo trovare informazioni sull'utilizzo dell'implementazione esclusiva Sun com.sun.rowset.CachedRowSetImpl o sulle implementazioni specifiche di Oracle.Esistono buone implementazioni di CachedRowSet diverse dal proprietario Sun One?

L'implementazione del sole è unsupported and subject to change. L'utilizzo di questo potrebbe anche causare problemi se desidero eseguire il deployment su macchine virtuali non Sun in futuro, e alla fine lascia degli avvisi non sopprimibili nei nostri log di compilazione che possono mascherare altri avvisi.

Esiste un'implementazione alternativa open source che possiamo distribuire con la mia applicazione che funzionerà bene su più database? Almeno qualcosa che supporti MySQL.

+0

Il link citato si applica in modo specifico ai pacchetti 'sun. *'. Non si applica ai pacchetti 'com.sun. *'. – EJP

+0

simile: http://stackoverflow.com/q/8217493/642706 –

risposta

16

Non si dovrebbe essere istanziare direttamente realizzazione di CachedRowSet - usare il suo fornitore per ottenere un'istanza: vedi http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/RowSetProvider.html (disponibile dal JDK7)

Infatti, CachedRowSet di l'interfaccia e la fabbrica correlata sono standard/portatili.

Qualcosa di simile a quanto segue shoud fare il trucco:

CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet(); 
crs.populate(myResultSet); 
+1

Questo non era disponibile quando ho posto la domanda originale, ma è bene sapere che questa lacuna è affrontata da Java ora, grazie. – BenM

+0

Google sembra aver effettuato un aggiornamento e la classe RowSetProvider non è più nella whitelist: java.lang.NoClassDefFoundError: javax.sql.rowset.RowSetProvider è una classe con restrizioni. Consulta la guida per sviluppatori di Google App Engine per ulteriori dettagli. – mba12

3

Ecco la mia implementazione migliorata di CachedRowSetImpl per supportare i nomi e le etichette di MySQL 5.x. Sulla base della realizzazione di thiy ragazzo http://tech.groups.yahoo.com/group/Firebird-Java/message/10715

import java.math.BigDecimal; 
import java.sql.Array; 
import java.sql.Blob; 
import java.sql.Clob; 
import java.sql.Ref; 
import java.sql.SQLException; 
import java.util.Calendar; 
import java.util.Collection; 
import java.util.Hashtable; 

import javax.sql.rowset.RowSetMetaDataImpl; 

import com.sun.rowset.CachedRowSetImpl; 

public class FixedCachedRowSetImplMySql extends CachedRowSetImpl { 

    private static final long serialVersionUID = -9067504047398250113L; 
    private RowSetMetaDataImpl RowSetMD; 

    public FixedCachedRowSetImpl() throws SQLException { 
     super(); 
    } 

    public FixedCachedRowSetImpl(Hashtable env) throws SQLException { 
     super(env); 
    } 

    private int getColIdxByName(String name) throws SQLException { 
     RowSetMD = (RowSetMetaDataImpl) this.getMetaData(); 
     int cols = RowSetMD.getColumnCount(); 

     for (int i = 1; i <= cols; ++i) { 
      String colLabel = RowSetMD.getColumnLabel(i); 
      String colName = RowSetMD.getColumnName(i); 
      if (colName != null) if (name.equalsIgnoreCase(colName) || name.equalsIgnoreCase(RowSetMD.getTableName(i) + "." + colName)) {    
       return (i); 
      } 
      else if (colLabel != null) if (name.equalsIgnoreCase(colLabel)) { 
       return (i); 
      } 
      else 
       continue; 
     } 
     throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.invalcolnm").toString()); 
    } 

    @Override 
    public Collection<?> toCollection(String column) throws SQLException { 
     return toCollection(getColIdxByName(column)); 
    } 

    @Override 
    public String getString(String columnName) throws SQLException { 
     return getString(getColIdxByName(columnName)); 
    } 

    @Override 
    public boolean getBoolean(String columnName) throws SQLException { 
     return getBoolean(getColIdxByName(columnName)); 
    } 

    @Override 
    public byte getByte(String columnName) throws SQLException { 
     return getByte(getColIdxByName(columnName)); 
    } 

    @Override 
    public short getShort(String columnName) throws SQLException { 
     return getShort(getColIdxByName(columnName)); 
    } 

    @Override 
    public int getInt(String columnName) throws SQLException { 
     return getInt(getColIdxByName(columnName)); 
    } 

    @Override 
    public long getLong(String columnName) throws SQLException { 
     return getLong(getColIdxByName(columnName)); 
    } 

    @Override 
    public float getFloat(String columnName) throws SQLException { 
     return getFloat(getColIdxByName(columnName)); 
    } 

    @Override 
    public double getDouble(String columnName) throws SQLException { 
     return getDouble(getColIdxByName(columnName)); 
    } 

    @Override 
    public BigDecimal getBigDecimal(String columnName, int scale) throws SQLException { 
     return getBigDecimal(getColIdxByName(columnName), scale); 
    } 

    @Override 
    public byte[] getBytes(String columnName) throws SQLException { 
     return getBytes(getColIdxByName(columnName)); 
    } 

    @Override 
    public java.sql.Date getDate(String columnName) throws SQLException { 
     return getDate(getColIdxByName(columnName)); 
    } 

    @Override 
    public java.sql.Time getTime(String columnName) throws SQLException { 
     return getTime(getColIdxByName(columnName)); 
    } 

    @Override 
    public java.sql.Timestamp getTimestamp(String columnName) throws SQLException { 
     return getTimestamp(getColIdxByName(columnName)); 
    } 

    @Override 
    public java.io.InputStream getAsciiStream(String columnName) throws SQLException { 
     return getAsciiStream(getColIdxByName(columnName)); 

    } 

    @Override 
    public java.io.InputStream getUnicodeStream(String columnName) throws SQLException { 
     return getUnicodeStream(getColIdxByName(columnName)); 
    } 

    @Override 
    public java.io.InputStream getBinaryStream(String columnName) throws SQLException { 
     return getBinaryStream(getColIdxByName(columnName)); 
    } 

    @Override 
    public Object getObject(String columnName) throws SQLException { 
     return getObject(getColIdxByName(columnName)); 
    } 

    @Override 
    public int findColumn(String columnName) throws SQLException { 
     return getColIdxByName(columnName); 
    } 

    @Override 
    public java.io.Reader getCharacterStream(String columnName) throws SQLException { 
     return getCharacterStream(getColIdxByName(columnName)); 
    } 

    @Override 
    public BigDecimal getBigDecimal(String columnName) throws SQLException { 
     return getBigDecimal(getColIdxByName(columnName)); 
    } 

    @Override 
    public boolean columnUpdated(String columnName) throws SQLException { 
     return columnUpdated(getColIdxByName(columnName)); 
    } 

    @Override 
    public void updateNull(String columnName) throws SQLException { 
     updateNull(getColIdxByName(columnName)); 
    } 

    @Override 
    public void updateBoolean(String columnName, boolean x) throws SQLException { 
     updateBoolean(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateByte(String columnName, byte x) throws SQLException { 
     updateByte(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateShort(String columnName, short x) throws SQLException { 
     updateShort(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateInt(String columnName, int x) throws SQLException { 
     updateInt(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateLong(String columnName, long x) throws SQLException { 
     updateLong(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateFloat(String columnName, float x) throws SQLException { 
     updateFloat(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateDouble(String columnName, double x) throws SQLException { 
     updateDouble(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException { 
     updateBigDecimal(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateString(String columnName, String x) throws SQLException { 
     updateString(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateBytes(String columnName, byte x[]) throws SQLException { 
     updateBytes(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateDate(String columnName, java.sql.Date x) throws SQLException { 
     updateDate(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateTime(String columnName, java.sql.Time x) throws SQLException { 
     updateTime(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException { 
     updateTimestamp(getColIdxByName(columnName), x); 
    } 

    @Override 
    public void updateAsciiStream(String columnName, java.io.InputStream x, int length) throws SQLException { 
     updateAsciiStream(getColIdxByName(columnName), x, length); 
    } 

    @Override 
    public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException { 
     updateBinaryStream(getColIdxByName(columnName), x, length); 
    } 

    @Override 
    public void updateCharacterStream(String columnName, java.io.Reader reader, int length) throws SQLException { 
     updateCharacterStream(getColIdxByName(columnName), reader, length); 
    } 

    @Override 
    public void updateObject(String columnName, Object x, int scale) throws SQLException { 
     updateObject(getColIdxByName(columnName), x, scale); 
    } 

    @Override 
    public void updateObject(String columnName, Object x) throws SQLException { 
     updateObject(getColIdxByName(columnName), x); 
    } 

    @Override 
    public Object getObject(String columnName, java.util.Map<String, Class<?>> map) throws SQLException { 
     return getObject(getColIdxByName(columnName), map); 
    } 

    @Override 
    public Ref getRef(String colName) throws SQLException { 
     return getRef(getColIdxByName(colName)); 
    } 

    @Override 
    public Blob getBlob(String colName) throws SQLException { 
     return getBlob(getColIdxByName(colName)); 
    } 

    @Override 
    public Clob getClob(String colName) throws SQLException { 
     return getClob(getColIdxByName(colName)); 
    } 

    @Override 
    public Array getArray(String colName) throws SQLException { 
     return getArray(getColIdxByName(colName)); 
    } 

    @Override 
    public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException { 
     return getDate(getColIdxByName(columnName), cal); 
    } 

    @Override 
    public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException { 
     return getTime(getColIdxByName(columnName), cal); 
    } 

    @Override 
    public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException { 
     return getTimestamp(getColIdxByName(columnName), cal); 
    } 

    @Override 
    public void updateRef(String columnName, java.sql.Ref ref) throws SQLException { 
     updateRef(getColIdxByName(columnName), ref); 
    } 

    @Override 
    public void updateClob(String columnName, Clob c) throws SQLException { 
     updateClob(getColIdxByName(columnName), c); 
    } 

    @Override 
    public void updateBlob(String columnName, Blob b) throws SQLException { 
     updateBlob(getColIdxByName(columnName), b); 
    } 

    @Override 
    public void updateArray(String columnName, Array a) throws SQLException { 
     updateArray(getColIdxByName(columnName), a); 
    } 

    @Override 
    public java.net.URL getURL(String columnName) throws SQLException { 
     return getURL(getColIdxByName(columnName)); 
    } 
} 
+0

Questo non viene compilato. Il nome della classe e il nome del costruttore non sono d'accordo. Dovresti aggiungere alcuni commenti per spiegare quali problemi risolve questo problema. – EJP

1

Oracle Attuazione Viene Open-Source

La domanda erroneamente che l'implementazione di Oracle RowSet è proprietario. Non è; è già open-source.

Il codice sorgente è rilasciato come software libero con la licenza GNU General Public Library (GPL) version 2 con "Classpath" exception. Leggi the source code per vedere la licenza.

Quindi non possono essere ritirati. Tu e altri siete liberi di mantenere o modificare queste classi a patto che seguiate i termini della GPL.

driver JDBC Attuazione

Inoltre, alcuni driver JDBC fornire un'implementazione di set di righe. Non so se alcuni sono open-source, ma quella sarebbe una strada da esplorare.

Problemi correlati