2013-12-09 7 views
1

Я собираюсь выполнить запрос и вернуть результат с помощью com.sun.rowset.CachedRowSetImpl пользователям (которые не находятся под моим контролем). Я хочу убедиться, что они не будут выполнять любую операцию обновления на этом объекте, которая может вносить изменения в базу данных. Одним из способов может быть:Как сделать CachedRowSetImpl readonly

  1. Продлить CachedRowSetImpl и переопределить SetReadOnly() метод так, чтобы ни один пользователь не может установить его в ложное.

Этого достаточно? Или есть другие способы, с помощью которых пользователи могут обновлять базу данных? Должен ли я также переопределить метод clone()?

Благодаря

ответ

1

Я не вижу причин, чтобы переопределить клон(), но самый простой способ убедиться, что обновление не может произойти, кажется, использовать ResultSet.CONCUR_READ_ONLY.

Как вы видите из Javadoc, все мутаторы выбрасывают SQLException в этом случае.

Итак, чтобы создать только для чтения в кэше набора строк, следующее должно хватить:

CachedRowSet rowSetImpl = new CachedRowSetImpl(); 
rowSetImpl.setConcurrency(ResultSet.CONCUR_READ_ONLY); 
rowSetImpl.setCommand("Select * from foo"); 
rowSetImpl.execute(); 
+0

за [JavaDoc] (http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#CONCUR_READ_ONLY) это поле является константой (статический окончательный int). Не могу это изменить :) – simpleDev

+0

Я не хотел менять значение константы, которую вы numbnuts. Он используется в запросе для определения того, разрешает ли ResultSet обновления или нет. – Kayaman

+0

Спасибо! не знал этого. Кроме того, если вы не укажете, результат Set «по-прежнему» по умолчанию [javadoc] (http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#prepareStatement (java .lang.String)). Не понравилось, что вы используете слово «you numbnuts», несмотря на то, что я его :) Потому что я не знал, как это использовать. Теперь я использую как setReadOnly, так и CONCUR_READ_ONLY – simpleDev

1

классы под com.sun для внутреннего использования они обеспечивают эталонную реализацию API, и вы не должны нуждаться обращаться к ним напрямую ,

Это лучше избегать сочетания кода для классов, присутствующих в com.sun, а скорее код против javax. или java пакетов

Кроме того, занятия в com.sun пакеты могут быть изменены или упали в любой версии Java.

+0

, но [javadoc] (http://docs.oracle.com/javase/7/docs/api/javax/sql/rowset/CachedRowSet.html) сам упоминает-> _ «Разработчики могут использовать эту реализацию так же, как это , ** они могут продлить его **, или они могут выбрать .... »_ – simpleDev

+0

« com.sun.rowset.CachedRowSetImpl »является эталонной реализацией, поэтому это небольшое отклонение от этого (это даже явно указано в публичном api doc). Но для создания экземпляра лучше использовать 'RowSetProvider' и' RowSetFactory'. –

Смежные вопросы