2010-02-09 1 views
13

내 응용 프로그램의 일부에서 javax.sql.rowset.CachedRowSet을 사용하여 조사 중이지만, 독점적 인 태양 구현 com.sun.rowset.CachedRowSetImpl 또는 오라클 특정 구현에 대한 정보 만 찾을 수 있습니다.독점적 인 Sun 이외의 CachedRowSet 구현체가 있습니까?

태양 구현은 unsupported and subject to change입니다. 나중에 Sun 이외의 가상 시스템에 배포하려는 경우이 문제를 사용하면 결국 다른 경고를 숨길 수있는 빌드 로그에 경고 할 수없는 경고가 남습니다.

여러 데이터베이스에서 잘 작동하는 응용 프로그램과 함께 배포 할 수있는 오픈 소스 대체 구현이 있습니까? 적어도 MySQL을 지원하는 것.

+0

당신이 인용 한 링크는 특히'sun. *'패키지에 적용됩니다. com.sun. * 패키지에는 적용되지 않습니다. – EJP

+0

유사 : http://stackoverflow.com/q/8217493/642706 –

답변

16

직접의 CachedRowSet의 구현을 인스턴스화하지 않아야 - 인스턴스를 얻기 위해 공급자를 사용 : (JDK7부터 가능)의 CachedRowSet의 사실

http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/RowSetProvider.html 참조 인터페이스 및 관련 공장은 표준/휴대용입니다. 하여 트릭을 수행 갈까요 다음과 같은

뭔가 :

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

원래 질문을했을 때 사용할 수 없었지만이 차이가 Java에 의해 해결되었습니다. 감사합니다. 감사합니다. – BenM

+0

Google이 업데이트를 작성한 것으로 보이며 RowSetProvider 클래스가 더 이상 허용 목록에 포함되지 않습니다. java.lang.NoClassDefFoundError : javax.sql.rowset.RowSetProvider는 제한된 클래스입니다. 자세한 내용은 Google App Engine 개발자 가이드를 참조하십시오. – mba12

3

내 개선 된 구현은 입니다. CachedRowSetImpl은 MySQL 5.x 이름과 레이블을 지원합니다. thiy 사람의 구현을 바탕으로 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

이것은 컴파일되지 않습니다. 클래스 이름과 생성자 이름이 일치하지 않습니다. 이 문제점을 수정하는 해설을 추가해야합니다. – EJP

1

오라클 구현 을인가 오픈 소스

문제는 잘못 오라클의 RowSet 구현이 독점이라고 주장한다. 그렇지 않습니다. 그것은 이미 오픈 소스입니다.

소스 코드는 GNU General Public Library (GPL) version 2 라이선스하에 "Classpath" exception 라이선스가있는 무료 소프트웨어로 배포됩니다. 라이센스를 보려면 the source code을 읽으십시오.

그래서 철회 할 수 없습니다. 귀하와 다른 사람들은 귀하가 GPL 조항을 준수한다는 조건하에이 클래스들을 유지 보수하거나 수정할 수 있습니다.

JDBC 드라이버 구현

또한 일부 JDBC 드라이버는 RowSet 구현을 제공합니다. 어떤 것이 오픈 소스인지는 모르겠지만, 그것은 하나의 방법 일 것입니다.