powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
10 сообщений из 10, страница 1 из 1
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
    #37683733
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно и вопрос в теме.
Хочу вызвать хранимую процедуру в 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
Как вернуть удалённый объект (ResultSet) из EJB в ApplicationClient?
    #37683748
GregTk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niky4000,

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

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

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

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

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


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