Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient? / 10 сообщений из 10, страница 1 из 1
29.02.2012, 11:16:11
    #37683733
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
Собственно и вопрос в теме.
Хочу вызвать хранимую процедуру в Oracle и получить результат в виде ResultSet'а.
Вот основной EJB, в котором производится вызов хранимой процедуры.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    @Override
    public ResultSet exec_sql_proc(String call_function, String[] args, String[] in_args){
        ResultSet cursor;
        try{
            String arguments="()";
            if(in_args.length>0){
                arguments="(";
                for(int i=0;i<in_args.length;i++){
                    arguments=arguments+"?,";
                }
                arguments=arguments.substring(0, arguments.length()-1)+")";
            }

            Connection connection = ds.getConnection();
            CallableStatement callableStatement = connection.prepareCall("begin ? := "+call_function+arguments+"; end;");
            callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
            
            if(in_args.length>0){
                for(int i=0;i<in_args.length;i++){
                    callableStatement.setString(2+i, in_args[i]);
                }
            }
            
            OracleCallableStatement ocs = callableStatement.unwrap(oracle.jdbc.OracleCallableStatement.class);
            boolean bb=callableStatement.execute();
            cursor=ocs.getCursor(1);
        }
        catch(Exception e){
            errors=e.getMessage();
            return null;
        }
        return cursor;
    }


Вот ещё 1 EJB, который вызывает основной EJB:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    @Override
    public ResultSet get_lpus(String find_words){
        try{
        ResultSet q=workTimeTableFacade.exec_sql_proc("work_time.get_lpu", new String[] {"lpucode","name"},new String[] {find_words});
// В q у нас всё нормально возвращается!
// В следующей строчке происходит исключение!
        return q;
        }
        catch(Exception e){
            errors=e.getMessage();
            return null;
        }
    }


А вот код клиента, который вызывает удалённый метод EJB:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    public String get_lpus(String find_words){
        NewSessionBean4Remote newSessionBean4=lookupNewSessionBean4Remote();
        ResultSet cursor=newSessionBean4.get_lpus(find_words);
...
...
...
        }
        catch(Exception e){
            return e.getMessage();
        }
        return result_var;
    }




Вот какое исключение происходит при попытке вернуть q:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:438)
	at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:165)
Caused by: javax.ejb.EJBException: java.rmi.MarshalException: CORBA MARSHAL 1330446343 No; nested exception is: 
	org.omg.CORBA.MARSHAL: FINE: IOP00810007: Underflow in BufferManagerReadStream after last fragment in message  vmcid: OMG  minor code: 7  completed: No
	at NewSessionBean4._NewSessionBean4Remote_Wrapper.get_lpus(NewSessionBean4/_NewSessionBean4Remote_Wrapper.java)
	at remotes_calls.Remote_calls.get_lpus(Remote_calls.java:36)
	at applicationclient4.Main.main(Main.java:43)
	... 6 more
Caused by: java.rmi.MarshalException: CORBA MARSHAL 1330446343 No; nested exception is: 
	org.omg.CORBA.MARSHAL: FINE: IOP00810007: Underflow in BufferManagerReadStream after last fragment in message  vmcid: OMG  minor code: 7  completed: No
	at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:267)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:213)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
	at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:227)
	at NewSessionBean4.__NewSessionBean4Remote_Remote_DynamicStub.get_lpus(NewSessionBean4/__NewSessionBean4Remote_Remote_DynamicStub.java)
	... 9 more
Caused by: org.omg.CORBA.MARSHAL: FINE: IOP00810007: Underflow in BufferManagerReadStream after last fragment in message  vmcid: OMG  minor code: 7  completed: No
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
	at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
	at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
	at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
	at $Proxy34.endOfStream(Unknown Source)
	at com.sun.corba.ee.impl.encoding.BufferManagerReadStream.underflow(BufferManagerReadStream.java:128)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_1.grow(CDRInputStream_1_1.java:113)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_2.alignAndCheck(CDRInputStream_1_2.java:126)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_long(CDRInputStream_1_0.java:496)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.readValueTag(CDRInputStream_1_0.java:1810)
	at com.sun.corba.ee.impl.encoding.CDRInputStream_1_0.read_value(CDRInputStream_1_0.java:1040)
	at com.sun.corba.ee.impl.encoding.CDRInputObject.read_value(CDRInputObject.java:531)
	at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl$14.read(DynamicMethodMarshallerImpl.java:384)
	at com.sun.corba.ee.impl.presentation.rmi.DynamicMethodMarshallerImpl.readResult(DynamicMethodMarshallerImpl.java:483)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:203)
	... 12 more
Java Result: 1



А что не так-то?
Строки возвращаются, а ResultSet почему-то не возвращается...
...
Рейтинг: 0 / 0
29.02.2012, 11:23:56
    #37683748
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
Niky4000,

ResultSet не сериализуемый объект.
...
Рейтинг: 0 / 0
29.02.2012, 11:25:06
    #37683754
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
Niky4000,

Оберните результат в DTO и будет вам счастье.
...
Рейтинг: 0 / 0
29.02.2012, 11:40:16
    #37683785
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
GregTkОберните результат в DTO и будет в
сомневаюсь.
Курсор ResultSet - сложный динамический объект.
ЗЫ.
Я не понял, зачем ему _удалённо_ его передавать?
...
Рейтинг: 0 / 0
29.02.2012, 11:51:14
    #37683823
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
http://ru.wikipedia.org/wiki/DTO
Понятно.
авторЯ не понял, зачем ему _удалённо_ его передавать?
Есть функции, которые работают с ResultSet и хотелось бы этим функциям его просто подсунуть.

авторОберните результат в DTO и будет вам счастье.
А можно примерчик? Никак нигде не найду как это делается.
Как ResultSet обернуть-то?
Я так понимаю нужно создать некий объект, который сериализуется и подсунуть ему в качестве параметра мой ResultSet, а потом вернуть этот сериализуемый объект.
...
Рейтинг: 0 / 0
29.02.2012, 11:58:20
    #37683841
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
Данные можно загать в RowSet. Он специально для этого был разработан. Смотрите доки по
CachedRowSet
WebRowSet

Например, дефолтная реализация - com.sun.rowset.CachedRowSetImpl помечена как Serializable.
...
Рейтинг: 0 / 0
29.02.2012, 12:25:29
    #37683908
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
Niky4000Есть функции, которые работают с ResultSet и хотелось бы этим функциям его просто подсунуть.
есть функции.... это не ответ.
- сериализация требуется для передачи объекта между гетерогенными средами. Например, через веб на клиента.
Я лично, не понял, зачем вам ТАКИЕ подсовывания в ТАКИЕ функции.
...
Рейтинг: 0 / 0
29.02.2012, 14:47:19
    #37684436
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
Niky4000,

Вы просто нужную выборку возьмите из ResultSet и положите в свой DTO и передайте его на клиента.
...
Рейтинг: 0 / 0
05.03.2012, 11:26:30
    #37691273
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
Что-то я решил не париться с этими ResultSet'ми и DTO всякими. ResultSet закрывать надо, а то у нас произойдёт утечка Курсоров и вывалится исключение, да к тому же и объект тяжёлый. Я решил вместо него использовать ArrayList. А методы, которые используют ResultSet перегружать лучше.
...
Рейтинг: 0 / 0
05.03.2012, 11:42:15
    #37691301
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
Niky4000Что-то я решил не париться с этими ResultSet'ми и DTO всякими . ResultSet закрывать надо, а то у нас произойдёт утечка Курсоров и вывалится исключение, да к тому же и объект тяжёлый. Я решил вместо него использовать ArrayList. А методы, которые используют ResultSet перегружать лучше.
- DTO\VO это и есть грубо говоря ArrayList (переливать объекты БД в другой формат)
- курсоры нужны для определённых проектов (десктоп\веб-длинные транзакции\корпоратив-не сайт)
- альтернатива ему - ОРМ в широком смысле.
Поэтому, неудивительно - что не вышло.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]