Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > падает tomcat


Автор: Zhenyusya 16.6.2010, 13:55
Помогите, пожааалста!! В работе с томкатом я, мягко сказать, не гуру. Однако запустили в промышленную эксплуатацию ПК на нем (даже без опытной: сроки поджимают).
Две недели все работало нормально, ды были ошибки, но томкат не падал. А последние 3 дня кошмар какой-то. Над ошибками, конечно, работаем, но и у пользователей сроки поджимают.
Сегодня, например, томкат упал около 30 раз!! В логах я ничего супер криминального не вижу (раньше и с такими как-то работало).
Может ли вообще из-за одного exception'a упасть томкат??
Люди, ну очень нада!!  smile 
Вот мои логи. Мож кто раскроет мне глаза...

Автор: eros2 16.6.2010, 22:47
Ищите в каталоге томката файлы hs_err_pid*.log.
В них инфа о вылетах, видно в какой длл-ке умерло.
См. http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/crashes.html

Не используете ли для доступа к БД jdbc-odbc бридж? Это слабое звено.

Ну вопщем ищите hs_err_pid-ы и показывайте что у вас там.

Автор: Zhenyusya 17.6.2010, 05:20
jdbc-odbc бридж действительно использую, но раньше никаких проблем с этим не возникало, и потом, без него совсем никак не получается: я раньше здесь просила хэлпа по поводу того, что драйвер db2java.jar работает в desctop и никак не хочет в web application. Ответа не нашлось.

А вот мои hs_err_pid*.log и пара классов, в которых возникают ошибки. В чем проблема тож не понему.

Во всех хз_ерр есть это:
C  [ntdll.dll+0x7eeb]
C  [ODBC32.dll+0x8b14]

Чего сделать, чтобы избавиться??  smile  smile 

Автор: dobrolub 17.6.2010, 06:32
используя JDBC Type 4 driver 

jar: db2jcc.jar, db2jcc_license_cu.jar

driver-class: com.ibm.db2.jcc.DB2Driver

url: jdbc:db2://server:port/database


используя JDBC Type 2 Driver требует полной инсталляций DB2 Clienta на серверной машине (JDBC 4 – только нужны jars)

Автор: Zhenyusya 17.6.2010, 08:09
Большое пасиба, использование данного драйвера и строки подключения помогло.  smile  smile 
Раньше не указывала имя сервера и порт, поэтому не арбайтало.
Но возникла другая проблема: при вызове процедуры 
Код

st_db2 = conn_db2.prepareCall("{call msk.get_pfr(" + codePfr + ", 0)}");
rs_db2 = st_db2.executeQuery();

возникает java.sql.Statement.executeQuery() was called but no result set was returned. Use java.sql.Statement.executeUpdate() for non-queries.
Хотя результат 200% не пустой.
А при выполнении обычного select'a работает нормально.
В связи с тем, что у нас около 200 ХП переписывать на select'ы процедуры, порой длиной по 700 строк, не очень целесообразно (мягко говоря),
СНОВА НУЖЕН ХЭЛП!!!!!

Автор: dobrolub 17.6.2010, 08:26
попробуй преобразовать так на одном, чтобы проверить: 

Код

st_db2 = conn_db2.prepareCall("{call msk.get_pfr(" + codePfr + ", 0)}");

conn_db2.executeUpdate();

rs_db2 = st_db2.getResultSet();


Автор: eros2 17.6.2010, 09:05
Цитата(Zhenyusya @ 17.6.2010,  05:20)
C  [ODBC32.dll+0x8b14]

Ну вопщем вы видите что падает в ODBC. Что и ожидалось.

Выходы:

1. Использовать Type4 JDBC-драйвер как вам уже советуют. Это хороший и правильный способ.

2. Есть ещё плохой способ, его следует использовать только если нормального драйвера нет. Нужно взять http://vjdbc.sourceforge.net/ и настроить его на этой же машине (или на другой) отдельной программой в виде сервера, причём так, чтоб если он вылетит - запустился опять.
Т.е. тупо в батнике:
Код

@echo off
SET CLASSPATH=vjdbc.jar;
SET CLASSPATH=%CLASSPATH%vjdbc_server.jar;
SET CLASSPATH=%CLASSPATH%commons-beanutils-core.jar;
SET CLASSPATH=%CLASSPATH%commons-collections-3.2.jar;
SET CLASSPATH=%CLASSPATH%commons-dbcp-1.2.1.jar;
SET CLASSPATH=%CLASSPATH%commons-digester-1.7.jar;
SET CLASSPATH=%CLASSPATH%commons-logging-1.1.jar;
SET CLASSPATH=%CLASSPATH%commons-pool-1.3.jar;
SET CLASSPATH=%CLASSPATH%jakarta-oro-2.0.8.jar;
:loop
java de.simplicit.vjdbc.server.rmi.ConnectionServer vjdbc_jdbcodbc.xml
goto loop

И его же драйвер заюзать внутри томката как клиента. Тогда падать будет внешний процесс и благодаря батнику снова будет перезапускаться. Вопщем, некоторые запросы отрабатывать не будут, но зато сам томкат не упадёт.

Но, повторюсь, это способ на крайний случай, нужно юзать нормальный драйвер, тогда и проблем не будет.

Автор: Zhenyusya 17.6.2010, 09:32
Вот это st_db2.getResultSet(); возвращает null

Автор: eros2 17.6.2010, 09:44
Если проблемы с драйвером - можно временно настроить VJDBC и по крайней мере избавиться от падений, а потом переделать программу чтоб она дружила с нормальным драйвером.

Что касается невозвращаемого resultset - то, возможно, нужно регистрировать output параметры

У нас, например (с ораклом) это примерно так:

Код

CallableStatement stmt = con.prepareCall("BEGIN  PKG_CARD.getProductParamValueByTemplate(:pItemId, :presult); END;");
stmt.setInt("pItemId", pItemId);
stmt.registerOutParameter("presult", OracleTypes.CURSOR); //REF CURSOR
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject("presult");

Автор: Zhenyusya 17.6.2010, 09:59
Процедуры с out-параметрами работают нормально
Код

st_db2 = conn_db2.prepareCall("{call MSK.Get_Next_Num(?, 1)}");
st_db2.registerOutParameter(1, java.sql.Types.BIGINT);
st_db2.setLong(1, 1);

а вот resultset никак не хочет
Код

st_db2 = conn_db2.prepareCall("{call msk.get_pfr(" + codePfr + ", 0)}");
rs_db2 = st_db2.executeQuery();

И через jdbc-odbc resultset возвращался как оно написано

Автор: eros2 17.6.2010, 10:05
Цитата(Zhenyusya @ 17.6.2010,  09:59)
И через jdbc-odbc resultset возвращался как оно написано

Однако jdbc-odbc имеет свойство падать.

Автор: Zhenyusya 17.6.2010, 10:57
Это-то да, только что сделать, чтобы resultset вернулся??
Я про "И через jdbc-odbc resultset возвращался как оно написано" к тому, что resultset не нужно регистрировать

Лююди, ну поможите же кто-нибудь !!!!!  smile  smile 

Автор: dobrolub 17.6.2010, 19:12
Посмотри как процедуры задекларированы, возможно проблема в этом. В коде внизу, обрати внимание на строку 2.
Код

CREATE PROCEDURE prod.resset () LANGUAGE SQL 
 DYNAMIC RESULT SETS 1 
 BEGIN 
 DECLARE C1 CURSOR FOR SELECT * FROM QIWS.QCUSTCDT;
 OPEN C1;
 RETURN; 
 END 



 В java, попробуй вот что:

Код

st_db2 = conn_db2.prepareCall("{call msk.get_pfr(" + codePfr + ", 0)}");
conn_db2.execute(); //executeUpdate();
rs_db2 = st_db2.getResultSet();

Автор: Zhenyusya 18.6.2010, 04:28
Да, да, да!!  smile Получилось!! Ааагромное пасиба!!
Все дело было в 
Код

DYNAMIC RESULT SETS 1

Странное дело, почему вызов процедуры в Центре управления DB2 и через ODBC-источник возвращает результат не null-иковский и без этого!?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)