代码之家  ›  专栏  ›  技术社区  ›  BenM

除了专有的sun one之外,还有什么好的cachedrowset实现吗?

  •  14
  • BenM  · 技术社区  · 14 年前

    我正在调查使用 javax.sql.rowset.CachedRowSet 但是,在我的应用程序的一部分中,我只能找到有关使用专有sun实现的信息 com.sun.rowset.CachedRowSetImpl 或特定于Oracle的实现。

    sun实现是 unsupported and subject to change . 如果我想在将来部署到非Sun虚拟机,使用此选项也可能会导致问题,最后,它会在生成日志中留下无法抑制的警告,这些警告可以屏蔽其他警告。

    有没有一个开源的替代实现,我们可以与我的应用程序一起部署,可以很好地跨多个数据库工作?至少支持mysql。

    3 回复  |  直到 7 年前
        1
  •  20
  •   PaoloC    10 年前

    不应该直接实例化CachedRowset的实现——使用其提供程序获取实例:请参见 http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/RowSetProvider.html (从JDK7开始提供)

    实际上,cachedrowset的接口和相关工厂是标准/可移植的。

    像下面这样的东西应该能起到作用:

    CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
    crs.populate(myResultSet);
    
        2
  •  3
  •   Kai Burghardt    11 年前

    以下是我改进的 cachedrowsetimpl 支持mysql 5.x名称和标签。基于thiy guy的实现 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));
        }
    }
    
        3
  •  1
  •   Basil Bourque    7 年前

    Oracle实施 开放源代码

    这个问题错误地指出oracle行集实现是专有的。它不是;它已经是开源的了。

    源代码作为自由软件发布在 GNU General Public Library (GPL) version 2 许可证 "Classpath" exception . 读 the source code 去看执照。

    所以他们不能撤回。你和其他人可以自由地维护或修改这些类,只要你遵守gpl的条款。

    JDBC驱动程序实现

    另外,一些JDBC驱动程序提供了行集的实现。我不知道是否有开源的,但那将是一个探索的途径。

    推荐文章