SQLJ problem in VA Java

Garry
Уже с Приветом
Posts: 240
Joined: 25 Jan 2000 10:01
Location: KS, USA

SQLJ problem in VA Java

Post by Garry »

Hi all,

When I try to run my java application in VA Java it fails in execution of the SQLJ (I am not getting any data from DB2, it fails in the first statement of the following group:

synchronized (__sJT_execCtx) {
sqlj.runtime.profile.RTStatement __sJT_stmt = __sJT_execCtx.registerStatement(__sJT_connCtx, MdApplicationDataAccessDeptDiv_SJProfileKeys.getKey(0), 0);
try
{
sqlj.runtime.profile.RTResultSet __sJT_result = __sJT_execCtx.executeQuery();
aMdDepartmentDivisionCursor = new MdDepartmentDivisionInfo_Cursor(__sJT_result);
}
finally
{
__sJT_execCtx.releaseStatement();
}
}

When I export the project as jar file (classes and resources) and run it using JRE it is working fine.

I was thinking that it was related to Workspace classpath in VA Java, but I have the following in my Windows-Options-Resources:

C:\Program Files\SQLLIB\;
C:\Program Files\SQLLIB\bin\;
C:\Program Files\SQLLIB\java\db2java.zip;
C:\Program Files\SQLLIB\java\runtime.zip;
C:\Program Files\SQLLIB\java\sqlj.zip;

Thank you very much in advance for any ideas.

Garry
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

Есть подозрение, что Visual Age может иметь свою версию SQLJ - классов (довольно старуюю) и он их загружает вперёд того, что написано в настройках.

Или вариант 2 - VA не может найти SER-файл...
I hated LA
Garry
Уже с Приветом
Posts: 240
Joined: 25 Jan 2000 10:01
Location: KS, USA

Post by Garry »

SQLJ Runtime Library feature is included in the workspace and it can't be old due to it comes with VA Java.

.ser files are created in the project-resources when I import SQLJ file.

I also applied IBM VA Java 4.0 fix pack. I did not help.

But, thank you anyway for your ideas.

Garry
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

К сожалению вы не привели стэка вызовов и сообщение об ошибке - хотя бы имя класса ошибки не помешало бы, а также верхушку стэка. Но есть вот такие идеи: если посмотреть на то, что генерится SQLJ компилером в качестве реализации ProfileKeys то видим (пример):

Code: Select all

class XXX_Package_SJProfileKeys 
{
  private static XXX_Package_SJProfileKeys inst = null;
  public static java.lang.Object getKey(int keyNum)
    throws java.sql.SQLException
  {
    if (inst == null)
    {
      inst = new XXX_Package_SJProfileKeys();
    }
    return inst.keys[keyNum];
  }
  private final sqlj.runtime.profile.Loader loader = sqlj.runtime.RuntimeContext.getRuntime().getLoaderForClass(getClass());
  private java.lang.Object[] keys;

  private XXX_Package_SJProfileKeys()
    throws java.sql.SQLException
  {
    keys = new java.lang.Object[1];
    keys[0] = XXX_Conn_ContextEx.getProfileKey(loader, "com.yyy.XXX_Package_SJProfile0");
  }
}


Обратите внимание на то, что в конструкторе (здесь singleton-pattern) исользуется loader тот, которым загружен указанный класс(XXX_Package_SJProfileKeys). И скорее всего, оно здесь падает ибо не может найти .SER-файлы.

Еще есть подозрение, что Statement на котором у вас падает - это первая ссылка на MdApplicationDataAccessDeptDiv_SJProfileKeys - то есть в этот момент загружается этот злостный класс, затем в статических инициализаторах он создаёт свой единственный instance, в конструкторе которого он не может загрузить SER - результат что-то вроде ExceptionInInitializersError или что-то в этом роде наследованное от java.lang.Error - оно не ловится catch(Exception e) ;)

Если всё таки не удаётся загрузить SER'ы - пропишите в CLASSPATH их root... Да и вообще под отладчиком можно попробовать зайти во внутрь.

Сорри, что не могу ничего толком про VA сказать - я как-то под Eclipse занимаюсь...
I hated LA
Garry
Уже с Приветом
Posts: 240
Joined: 25 Jan 2000 10:01
Location: KS, USA

Post by Garry »

I tried to add the folders where .ser files are into classpath.
The same result.

Program fails on synchronized (__sJT_execCtx) statement. It is not going in the synchronized block at all.

I commented out synchronized (__sJT_execCtx). It fails now in the following constructor:
aMdDepartmentDivisionCursor = new MdDepartmentDivisionInfo_Cursor(__sJT_result);

No any exception was thrown.

{
sqlj.runtime.ConnectionContext __sJT_connCtx = sqlj.runtime.ref.DefaultContext.getDefaultContext();
if (__sJT_connCtx == null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
sqlj.runtime.ExecutionContext __sJT_execCtx = __sJT_connCtx.getExecutionContext();
if (__sJT_execCtx == null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_EXEC_CTX();

// synchronized (__sJT_execCtx) {
sqlj.runtime.profile.RTStatement __sJT_stmt = __sJT_execCtx.registerStatement(__sJT_connCtx, MdApplicationDataAccessDeptDiv_SJProfileKeys.getKey(0), 0);
try
{
sqlj.runtime.profile.RTResultSet __sJT_result = __sJT_execCtx.executeQuery();
aMdDepartmentDivisionCursor = new MdDepartmentDivisionInfo_Cursor(__sJT_result);
}
finally
{
__sJT_execCtx.releaseStatement();
}
// }
}

Return to “Вопросы и новости IT”