2010-02-09 35 views
13

Tôi đang điều tra bằng cách sử dụng javax.sql.rowset.CachedRowSet trong một phần đơn đăng ký của mình, tuy nhiên tôi chỉ có thể tìm thông tin về việc sử dụng triển khai mặt trời độc quyền com.sun.rowset.CachedRowSetImpl hoặc triển khai cụ thể của Oracle.Có bất kỳ cài đặt CachedRowSet nào tốt hơn là bản Sun độc quyền không?

Việc triển khai mặt trời là unsupported and subject to change. Sử dụng điều này cũng có thể gây ra vấn đề nếu tôi muốn triển khai các máy ảo không phải Sun trong tương lai và cuối cùng nó để lại các cảnh báo không thể truy cập trong nhật ký dựng sẵn của chúng tôi có thể che giấu các cảnh báo khác.

Có triển khai thay thế nguồn mở nào mà chúng tôi có thể triển khai với ứng dụng của mình sẽ hoạt động tốt trên nhiều cơ sở dữ liệu không? Tại một cái gì đó tối thiểu hỗ trợ MySQL.

+0

Liên kết bạn đã trích dẫn cụ thể áp dụng cho các gói 'sun. *'. Nó không áp dụng cho các gói 'com.sun. *'. – EJP

+0

Tương tự: http://stackoverflow.com/q/8217493/642706 –

Trả lời

16

Bạn không nên trực tiếp instantiating thi hành CachedRowSet - sử dụng nhà cung cấp của mình để có được một thể hiện: xem http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/RowSetProvider.html (có sẵn từ JDK7)

Trong thực tế, CachedRowSet của giao diện và nhà máy liên quan là tiêu chuẩn/di động.

Something như sau shoud làm các trick:

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

Điều này không có sẵn khi tôi hỏi câu hỏi ban đầu nhưng thật tốt khi biết rằng khoảng cách này được giải quyết bởi Java ngay bây giờ, cảm ơn. – BenM

+0

Google dường như đã cập nhật và lớp RowSetProvider không còn nằm trong danh sách trắng: java.lang.NoClassDefFoundError: javax.sql.rowset.RowSetProvider là một lớp bị hạn chế. Vui lòng xem hướng dẫn của nhà phát triển Google App Engine để biết thêm chi tiết. – mba12

3

Đây là triển khai cải tiến của tôi về CachedRowSetImpl để hỗ trợ tên và nhãn của MySQL 5.x. Dựa trên việc thực hiện thiy chàng 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

Điều này không biên dịch. Tên lớp và tên hàm tạo không đồng ý. Bạn nên thêm một số bình luận giải thích những vấn đề này khắc phục. – EJP

1

Oracle Thực hiện nguồn mở

Câu hỏi đặt ra không đúng cách khẳng định rằng việc thực hiện Oracle RowSet là độc quyền. Không phải vậy; nó đã là mã nguồn mở.

Mã nguồn được phát hành dưới dạng giấy phép miễn phí theo giấy phép GNU General Public Library (GPL) version 2 với "Classpath" exception. Đọc the source code để xem giấy phép.

Vì vậy, chúng không thể bị thu hồi. Bạn và những người khác được tự do duy trì hoặc sửa đổi các lớp này miễn là bạn tuân theo các điều khoản của GPL.

Thực hiện trình điều khiển JDBC

Ngoài ra, một số trình điều khiển JDBC cung cấp triển khai RowSet. Tôi không biết liệu có bất kỳ nguồn mở nào không, nhưng đó sẽ là một con đường để khám phá.

Các vấn đề liên quan