Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> prepareCall, Missing IN or OUT parameter at index 
:(
    Опции темы
Anatret
Дата 16.6.2010, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



Всем привет! Столкнулся с такой проблемой. Использую prepareCall для вызова oracle процедуры. Время от времени выходит ошибка Missing IN or OUT parameter at index. Причем ошибка выходит в случайном порядке то есть в первый раз может отработать без ошибок, второй раз с ошибками в третий раз тоже с ошибкой но может поругаться на другой index хотя переменные и условия одинаковы.  В чем дело не могу понять.
Код

 public void run() {

    synchronized (semaphores) {
      semaphores[this.threadNum].set = true;
      semaphores.notify();
      int off = this.threadNum * 554;

      try {
        
        serial = read(off, 0, 4);
        duration = read(23 + off, 0, 4) / 100;
        gsvn = read(73 + off, 0, 1);
        bearer_service = read(121 + off, 0, 1);
        start_time = Long.toString(read(11 + off, 1, 6));
        end_time = Long.toString(read(17 + off, 1, 6));
        from_number = read(30 + off, 2, 10);
        on_number = read(43 + off, 2, 10);
        conn_number = read(98 + off, 2, 10);
        charge_party_indicator = read(10 + off, 4, 1);
        centrex_group_number = read(53 + off, 0, 2);
        trunk_group_out = read(67 + off, 0, 2);
        trunk_group_in = read(65 + off, 0, 2);
        called_ctx_number = read(60 + off, 2, 5);
        caller_ctx_number = read(55 + off, 2, 5);

      }
      catch (Exception ex) {
        ex.fillInStackTrace();
      }
    }
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (Exception ex) {
      System.out.println(ex);
    }
    try {

      try {
        conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
      } catch (SQLException e) {
        e.printStackTrace();
      }

      cstmt = conn.prepareCall("BEGIN NGN_PKG.READ_DAT(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);END;");
      cstmt.setLong(1, serial);
      cstmt.setLong(2, duration);
      cstmt.setString(3, start_time);
      cstmt.setString(4, end_time);
      cstmt.setLong(5, from_number);
      cstmt.setLong(6, on_number);
      cstmt.setLong(7, conn_number);
      cstmt.setLong(8, centrex_group_number);
      cstmt.setLong(9, charge_party_indicator);
      cstmt.setLong(10, caller_ctx_number);
      cstmt.setLong(11, called_ctx_number);
      cstmt.setLong(12, gsvn);
      cstmt.setLong(13, bearer_service);
      cstmt.setLong(14, trunk_group_out);
      cstmt.setLong(15, trunk_group_in);
      cstmt.execute();

    }
    catch (SQLException e) {
      logger.error(this.threadNum +" "+e);
    }
    System.gc();
  }

Я думал может переменные не инициализируются, проверил, значения присваиваются. 
Помогите плиз.
PM MAIL   Вверх
MaxPayneC
Дата 16.6.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Покажите код или заголовок оракловой процедуры и полный текст эксепшна.
PM   Вверх
Anatret
Дата 16.6.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



PROCEDURE READ_DAT(
    v_csn IN NUMBER,
    v_duration IN NUMBER,
    v_start_time IN VARCHAR2,
    v_end_time IN VARCHAR2,
    v_from_number IN NUMBER,
    v_on_number IN NUMBER,
    v_conn_number IN NUMBER,
    v_centrex_group_number IN NUMBER,
    v_charge_party_indicator IN NUMBER,
    v_caller_ctx_number IN NUMBER,
    v_called_ctx_number IN NUMBER,
    v_gsvn IN NUMBER,
    v_bearer_service IN NUMBER,
    v_trunk_group_out IN NUMBER,
    v_trunk_group_in IN NUMBER)

а ошибка вот такая 

java.sql.SQLException: Missing IN or OUT parameter at index:: 3
PM MAIL   Вверх
pathfinder
Дата 16.6.2010, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 2
Всего: 10



Попробовать использовать только локальные переменные.

Добавлено через 2 минуты и 9 секунд
И еще раз проверить инициализацию всех переменных, поскольку при указанном способе при ошибк в каком-нибудь read последующие переменные будут не проинициалзированы(правда это важно только для не объектных переменных)
PM MAIL   Вверх
MaxPayneC
Дата 16.6.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Попробуйте передать методу строковую константу. Если заработает, проверьте инициализацию параметра еще раз.
PM   Вверх
Anatret
  Дата 16.6.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



пробовал локальные, не получилось ( и проверял инициализацию всех переменных до вызова процедуры.
To MaxPayneC
"строковую константу" - я не совсем понял. переменная стринг?

Это сообщение отредактировал(а) Anatret - 16.6.2010, 13:45
PM MAIL   Вверх
pathfinder
Дата 16.6.2010, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 2
Всего: 10



Выложите полный код вместе с проверками(и локальными переменными вместо serial и тп), может чего в запарке пропустили.

Добавлено через 1 минуту и 41 секунду
Объедините все try-catch блоки в один.
PM MAIL   Вверх
MaxPayneC
Дата 16.6.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Anatret, 
Код

cstmt.setString(3, "ya stroka");

PM   Вверх
Anatret
Дата 16.6.2010, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



Вот код я тут уже извращаюсь с while. Try уберу позже я думаю что они не мешают сейчас 
Код


import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.log4j.Logger;

import java.io.*;
import java.sql.*;
import java.util.Properties;

public class threadDAT implements Runnable {
  protected static int THREADS = 0;
  public long duration = -1, from_number = -1, on_number = -1, conn_number = -1,
          serial = -1, centrex_group_number = -1, charge_party_indicator = -1, caller_ctx_number = -1,
          called_ctx_number, gsvn = -1, bearer_service = -1, trunk_group_out = -1, trunk_group_in = -1;
  public String start_time, end_time;

  private static class Semaphore {
    public boolean set = false;
  }

  private static Logger logger = Logger.getLogger(singleDat.class);
  private static final String CONFIG_FILE_NAME = "/opt/billing/settings/ngn_datreader.properties";
  public static String dbUrl;
  public static String dbDriverClass;
  public static String dbUser;
  public static String dbPassword;
  public static String datdir;
  public static String ftpUrl;
  public static String ftpLogin;
  public static String ftpPassword;
  public static int dbconnCount = 10;
  public static int maxSessionTimeout = 25;
  private static InputStream configFile;
  protected static RandomAccessFile dat_file;
  protected static Semaphore[] semaphores;
  protected static Thread[] threads;
  protected final int threadNum;
  public static Connection conn = null;
  public static CallableStatement cstmt = null;
  public static Statement stmt = null;
  public static long last_time = 0l;

  protected threadDAT(int num) {
    this.threadNum = num;
  }

  public void run() {

    synchronized (semaphores) {
      semaphores[this.threadNum].set = true;
      semaphores.notify();
      int off = this.threadNum * 554;

      try {

        while (serial ==-1){
          serial = read(off, 0, 4);
        }
        while (duration == -1){
          duration = read(23 + off, 0, 4) / 100;
        }
        while (gsvn == -1){
          gsvn = read(73 + off, 0, 1);
        }
        while (bearer_service == -1){
          bearer_service = read(121 + off, 0, 1);
        }
        while (start_time == null){
          start_time = Long.toString(read(11 + off, 1, 6));
        }
        while (end_time == null){
          end_time = Long.toString(read(17 + off, 1, 6));
        }
        while (from_number == -1){
          from_number = read(30 + off, 2, 10);
        }
        while (on_number==-1){
          on_number = read(43 + off, 2, 10);
        }
        while (conn_number==-1){
          conn_number = read(98 + off, 2, 10);
        }
        while (charge_party_indicator==-1){
          charge_party_indicator = read(10 + off, 4, 1);
        }
        while (centrex_group_number==-1){
          centrex_group_number = read(53 + off, 0, 2);
        }
        while (trunk_group_out==-1){
          trunk_group_out = read(67 + off, 0, 2);
        }
        while (trunk_group_in==-1){
          trunk_group_in = read(65 + off, 0, 2);
        }
        while (called_ctx_number==-1){
          called_ctx_number = read(60 + off, 2, 5);
        }
        while (caller_ctx_number==-1){
          caller_ctx_number = read(55 + off, 2, 5);
        }

      }
      catch (Exception ex) {
        ex.fillInStackTrace();
      }
    }
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (Exception ex) {
      System.out.println(ex);
    }
    try {

      try {
        conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
      } catch (SQLException e) {
        e.printStackTrace();
      }
//      logger.debug("Thread N" + this.threadNum);
      cstmt = conn.prepareCall("BEGIN NGN_PKG.READ_DAT(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);END;");
      cstmt.setLong(1, 12511525l);
      cstmt.setLong(2, 616l);
      cstmt.setString(3, "100616160811");
      cstmt.setString(4, "100616160840");
      cstmt.setLong(5, 1226444l);
      cstmt.setLong(6, 1578661l);
      cstmt.setLong(7, 1578661l);
      cstmt.setLong(8, 65535l);
      cstmt.setLong(9, 1l);
      cstmt.setLong(10, 0l);
      cstmt.setLong(11, 0l);
      cstmt.setLong(12, 1l);
      cstmt.setLong(13, 11l);
      cstmt.setLong(14, 0l);
      cstmt.setLong(15, 65535l);
      cstmt.execute();

    }
    catch (SQLException e) {

      logger.debug("Thread N" + this.threadNum + ". SERIAL: " + serial +" duration= "+duration+ " start_time= "+start_time+"" +
              " end_time= "+end_time+" from_number= "+from_number+" on_number="+on_number+"conn_number="+conn_number+ " " +
              "centrex_group_number="+centrex_group_number +" charge_party_indicator=" +charge_party_indicator +" caller_ctx_number= "+caller_ctx_number+
              " called_ctx_number= "+called_ctx_number+" gsvn="+gsvn+" bearer_service= "+bearer_service+ " trunk_group_out "+trunk_group_out + " trunk_group_in "+trunk_group_in);
      logger.error(this.threadNum +" "+e);
    }
    System.gc();
  }


  public long read(long off, int cod, int wi) throws IOException {

    long temp = 0;
    String stemp = "";
    try {
      if (cod == 0) {
        dat_file.seek(off);
        logger.debug("this.threadNum "+ this.threadNum +" getFilePointer() " + dat_file.getFilePointer());
        for (int i = 0; i < wi; i++) {
          temp += dat_file.read() * Math.pow(256, i);
        }
      } else if (cod == 1) {
        dat_file.seek(off);
        logger.debug("this.threadNum "+ this.threadNum +" getFilePointer() " + dat_file.getFilePointer());
        for (int i = 0; i < wi; i++) {
          stemp += String.format("%02d", dat_file.read());
        }
        temp = Long.parseLong(stemp);
      } else if (cod == 2) {
        dat_file.seek(off);
        logger.debug("this.threadNum "+ this.threadNum +" getFilePointer() " + dat_file.getFilePointer());
        for (int i = 0; i < wi; i++) {
          temp = dat_file.read();
          if ((temp >> 4) != 0xf) {
            stemp += temp >> 4;
          }
          if ((temp & 0xf) != 0xf) {
            stemp += temp & 0xf;
          }
        }
        temp = Long.parseLong(stemp);
      } else if (cod == 4) {
        dat_file.seek(off);
        logger.debug("this.threadNum "+ this.threadNum +" getFilePointer() " + dat_file.getFilePointer());
        for (int i = 0; i < wi; i++) {
          temp += dat_file.read() >> 4;
        }
      }
    }
    catch (IOException e) {
      e.printStackTrace();
    }
    return temp;
  }

  public static void main(String[] args) throws IOException, SQLException {
    long timestamp = 0l;
    String WorkingDirectory = "";
    try {

      configFile = new FileInputStream(CONFIG_FILE_NAME);
      Properties globalProperties = new Properties();
      globalProperties.load(configFile);
      dbUrl = (String) globalProperties.get("database.url");
      dbDriverClass = (String) globalProperties.get("database.driver_class");
      dbUser = (String) globalProperties.get("database.username");
      dbPassword = (String) globalProperties.get("database.password");
      dbconnCount = Integer.parseInt((String) globalProperties.get("database.connectionscount"));
      maxSessionTimeout = Integer.parseInt((String) globalProperties.get("ngn.maxsessiontimeout"));
      datdir = (String) globalProperties.get("datdir");
      ftpUrl = (String) globalProperties.get("ftp.url");
      ftpLogin = (String) globalProperties.get("ftp.login");
      ftpPassword = (String) globalProperties.get("ftp.password");
    } catch (IOException e) {
      e.printStackTrace();
    }


    FTPClient ftpClient = new FTPClient();
    ftpClient.connect(ftpUrl);
    ftpClient.login(ftpLogin, ftpPassword);
    ftpClient.changeWorkingDirectory("ngn");
    FTPFile[] ftpList = ftpClient.listFiles();
    for (FTPFile aFList : ftpList) {
      if (aFList.isDirectory()) {

        if (timestamp < aFList.getTimestamp().getTimeInMillis()) {
          timestamp = aFList.getTimestamp().getTimeInMillis();
          WorkingDirectory = aFList.getName();
        }
      }
    }
    try {
      conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    ResultSet res;
    stmt = conn.createStatement();
    res = stmt.executeQuery("SELECT MAX(DATA_TIME) FROM LAST_DATA_FILE");
    while (res.next()) {
      last_time = res.getLong(1);
    }
    res.close();
    System.out.println("last_time " + last_time);
    ftpClient.changeWorkingDirectory(WorkingDirectory);

    FTPFile[] dList = ftpClient.listFiles();
    for (FTPFile aFList : dList) {
      if (!aFList.isDirectory()) {
        if (aFList.toString().substring(aFList.toString().length() - 4).equals(".dat") && last_time < aFList.getTimestamp().getTimeInMillis()) {
          System.out.println(aFList.getTimestamp().getTimeInMillis());
          File file = new File(datdir + File.separator + aFList.getName());
          FileOutputStream fos = new FileOutputStream(file);
          ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
          ftpClient.retrieveFile(aFList.getName(), fos);
          fos.close();
          stmt.executeUpdate("INSERT INTO LAST_DATA_FILE(NAME,DATA_TIME) values('" + aFList.getName() + "'," + aFList.getTimestamp().getTimeInMillis() + ")");


        }
      }
    }
    conn.close();
    stmt.close();
    ftpClient.logout();
    ftpClient.disconnect();


    File dir = new File(datdir);
    File[] fList = dir.listFiles();
    int ftotal = fList.length;
    if (ftotal == 0) { // нечего удалять
//      logger.error("Каталог "+args[0]+" уже пуст");
      return;
    }
    for (File aFList : fList) {
      if (aFList.toString().substring(aFList.toString().length() - 4).equals(".dat")) {
        try {
          dat_file = new RandomAccessFile(aFList, "rw");
          THREADS = (int) dat_file.length() / 554;
          semaphores = new Semaphore[THREADS];
          threads = new Thread[THREADS];
          for (int i = 0; i < THREADS; i++) {
            semaphores[i] = new Semaphore();
          }
          logger.info("Starting " + THREADS + " threads...");

          synchronized (singleDat.class) {
            synchronized (semaphores) {
              for (int i = 0; i < THREADS; i++) {
                final threadDAT mainThread = new threadDAT(i);
                threads[i] = new Thread(mainThread, "Thread N" + i);
                threads[i].setDaemon(true);
                threads[i].start();
              }

              logger.info("Waiting for simultaneous start...");

              boolean isAllStarted = false;
              while (!isAllStarted) {
                try {
                  semaphores.wait();
                }
                catch (InterruptedException e) {
                  e.printStackTrace();
                }

                isAllStarted = true;
                for (int i = 0; i < THREADS; i++) {
                  if (!semaphores[i].set) {
                    isAllStarted = false;
                    break;
                  }
                }
              }
            }
          }
          logger.info("Waiting for threads to finish execution...");

          for (int i = 0; i < THREADS; i++) {
            try {
              threads[i].join();

            }
            catch (InterruptedException e) {
              e.printStackTrace();
              return;
            }
          }
          aFList.delete();
          cstmt.close();
          conn.close();
          logger.info("Program terminated successfully.");
        } catch (Exception ex) {
          //todo главный TRY
          ex.fillInStackTrace();
        }
      }

    }

  }
}



а вот лог ошибки из 33 тредов 5 выдал ошибку 
Код

 INFO 16:39:04 (threadDAT.java:295) - Starting 33 threads...
 INFO 16:39:04 (threadDAT.java:306) - Waiting for simultaneous start...
 INFO 16:39:04 (threadDAT.java:327) - Waiting for threads to finish execution...
DEBUG 16:39:05 (threadDAT.java:149) - Thread N5. SERIAL: 12511742 duration= 11 start_time= 100616163338 end_time= 100616163349
from_number= 1220102 on_number=2744302conn_number=2744302 centrex_group_number=0 charge_party_indicator=1 caller_ctx_number= 129
called_ctx_number= 0 gsvn=1 bearer_service= 11 trunk_group_out 0 trunk_group_in 65535
ERROR 16:39:05 (threadDAT.java:153) - 5 java.sql.SQLException: Missing IN or OUT parameter at index:: 1
INFO 16:39:05 (threadDAT.java:342) - Program terminated successfully.


Это сообщение отредактировал(а) Anatret - 16.6.2010, 15:40
PM MAIL   Вверх
pathfinder
Дата 16.6.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 2
Всего: 10



Вообщем ошибка понятна.

Вы работаете в многопоточном окружении, при этом не локальные переменные(serial, duration, etc) устанавливаются в блоке синхронизаци, но используются уже вне этого блока. Что приводит к тому что пока один поток пытается установить в cstmt.setString(start_time), другой поток эту же строку зануляет в start_time = read(...). Именно по-этому ошибка появляется спонтанно, должны совпасть: один поток вышел из синхронного блока с не пустыми переменными, другой же уже зашел в этот же самый блок и считал через read(...) пустую(null) строку.

Решение проблемы в лоб - сделать все переменные (serial, duration, ...) локальными по отношению к методу run, т.е. вместо того что-бы их объявлять в данных объекта, объявить их в методе run:
Код

public void run() {
   long duration = -1, from_number = -1, on_number = -1, conn_number = -1,
          serial = -1, centrex_group_number = -1, charge_party_indicator = -1, caller_ctx_number = -1,
          called_ctx_number, gsvn = -1, bearer_service = -1, trunk_group_out = -1, trunk_group_in = -1;
   String start_time, end_time;
   // старый код
}


Добавлено через 13 минут и 23 секунды
Не посмотрел метод read поэтому слегка ошибся.

Метод read всегда возращается long по-этому переменные(start_time, end_time) не могут быть null-ами.

Ошибка тут из-за cstmt - он у вас статический. По-этому когда один поток уже собрался выполнить cstmt.execute() но происходит переключение на другой поток, который только создал новый cstmt, происходит переключение на предыдущий поток и идет вызов cstmt.execute() с пустыми параметрами.

Решение - все переменные, включая cstmt необходимо объявить внутри метода run().
PM MAIL   Вверх
Anatret
Дата 16.6.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



(((( неа. Таже самая ошибка (( но зато логи ошибок не всегда но иногда выходят так 
Код

Thread N8. SERIAL: 12512003 duration= 299 start_time= 100616165358 end_time= 100616165857 from_number= 1221709
on_number=4450629conn_number=4450629 centrex_group_number=65535 charge_party_indicator=1 caller_ctx_number= -1 called_ctx_number= -1
gsvn=1 bearer_service= 11 trunk_group_out 0 trunk_group_in 65535
ERROR 17:30:05 (threadDAT.java:155) - 8 java.sql.SQLException: Missing IN or OUT parameter at index:: 1

caller_ctx_number= -1 called_ctx_number= -1 хотя не должно. Вот я и думаю что проблема у меня в синхронизации. а вот где ? не знаю.
Да и у меня пока так 
Код

      cstmt = conn.prepareCall("BEGIN NGN_PKG.READ_DAT(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);END;");
      cstmt.setLong(1, 12511525l);
      cstmt.setLong(2, 616l);
      cstmt.setString(3, "100616160811");
      cstmt.setString(4, "100616160840");
      cstmt.setLong(5, 1226444l);
      cstmt.setLong(6, 1578661l);
      cstmt.setLong(7, 1578661l);
      cstmt.setLong(8, 65535l);
      cstmt.setLong(9, 1l);
      cstmt.setLong(10, 0l);
      cstmt.setLong(11, 0l);
      cstmt.setLong(12, 1l);
      cstmt.setLong(13, 11l);
      cstmt.setLong(14, 0l);
      cstmt.setLong(15, 65535l);
      cstmt.execute();


Это сообщение отредактировал(а) Anatret - 16.6.2010, 15:42
PM MAIL   Вверх
Anatret
Дата 16.6.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 18.9.2007

Репутация: нет
Всего: нет



to pathfinder ооооо спсб Вам))) получилось! огромное спасибо!!!
PM MAIL   Вверх
pathfinder
Дата 16.6.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 2
Всего: 10



Ошибка вот здесь
Код

      cstmt = conn.prepareCall("BEGIN NGN_PKG.READ_DAT(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);END;");
      cstmt.setLong(1, 12511525l);
      cstmt.setLong(2, 616l);
      cstmt.setString(3, "100616160811");
      cstmt.setString(4, "100616160840");
      cstmt.setLong(5, 1226444l);
      cstmt.setLong(6, 1578661l);
      cstmt.setLong(7, 1578661l);
      cstmt.setLong(8, 65535l);
      cstmt.setLong(9, 1l);
      cstmt.setLong(10, 0l);
      cstmt.setLong(11, 0l);
      cstmt.setLong(12, 1l);
      cstmt.setLong(13, 11l);
      cstmt.setLong(14, 0l);
      cstmt.setLong(15, 65535l);
      cstmt.execute();


cstmt - статическая переменная, как следствие "любое" действие сделанное с ней в одном потоке будет видно и в другом.

Разберем на примере двух потоков А и Б. Поток А инициализировал все переменные, создал новый cstmt, установил у него все IN/OUT параметры, но вызвать метод execute() не успел, произошло переключение на поток Б. Поток Б инициализировал все переменные, создал (ВНИМАНИЕ) новый cstmt, и начал у него устанвливать IN/OUT параметры, установил 1, 2, 3, но 4 не успел, произошло переключение обратно на поток А. Поток А продолжает с дого места, где он был прерван, т.е. с вызова execute(). Однако(ВНИМАНИЕ) он будет вызывать execute() у  cstmt, что создал поток Б и не успел до конца подготовить, а не тот cstmt что поток А подготовил.

Или то же самое в виде последовательного кода:

Код

// Поток А
cstmt = conn.prepareCall("BEGIN NGN_PKG.READ_DAT(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);END;");
      cstmt.setLong(1, 12511525l);
      cstmt.setLong(2, 616l);
      cstmt.setString(3, "100616160811");
      cstmt.setString(4, "100616160840");
      cstmt.setLong(5, 1226444l);
      cstmt.setLong(6, 1578661l);
      cstmt.setLong(7, 1578661l);
      cstmt.setLong(8, 65535l);
      cstmt.setLong(9, 1l);
      cstmt.setLong(10, 0l);
      cstmt.setLong(11, 0l);
      cstmt.setLong(12, 1l);
      cstmt.setLong(13, 11l);
      cstmt.setLong(14, 0l);
      cstmt.setLong(15, 65535l);
      // Переключение на поток Б


Код

// Поток Б
cstmt = conn.prepareCall("BEGIN NGN_PKG.READ_DAT(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);END;");
      cstmt.setLong(1, 12511525l);
      cstmt.setLong(2, 616l);
      cstmt.setString(3, "100616160811");
      // переключение обратно на поток А


Код

// Поток А
      // Установлены только три параметра: 1, 2, 3
      cstmt.execute(); 




Это сообщение отредактировал(а) pathfinder - 16.6.2010, 15:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.