Небольшой вопрос по бд
От: Аноним  
Дата: 12.03.07 15:23
Оценка:
есть код
...
try
{
OracleConnectionCacheImpl ods = new OracleConnectionCacheImpl();
ods.setURL("jdbc:oracle:thin:@//192.168.64.30:1521/DB2");
ods.setUser("name");
ods.setPassword("pass");

Connection conn1;
conn1 = ods.getConnection();

for (int i=0; i<5; i++)
{
new Thread(new Runnable()
{
public void run()
{
try
{
Statement stmt1 = conn1.createStatement();
ResultSet rs = stmt1.executeQuery("SELECT * FROM TEST");
while (rs.next())
{
obj1 = rs.getObject(1);
obj2 = rs.getObject(2);
obj3 = rs.getObject(3);
System.out.println("row1 = " + obj1.toString() + ", row2 = " + obj2.toString() + ", row3 = " + obj3.toString());
}
}
catch(SQLException ex) {System.out.println(ex.toString()); }
}
}
).start();
}
conn1.close();
ods.close();
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
}

Main.java:208: local variable conn1 is accessed from within inner class; needs to be declared final — пишет такую ошибку
когда к Connect добавляю final все равно не пашет
надо чтоб коннект создавался вне потока а sql запрос уже в нем????????????
помогите что надо откорректировать&&&&&&&&&&7
Re: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 12.03.07 15:30
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Main.java:208: local variable conn1 is accessed from within inner class; needs to be declared final — пишет такую ошибку


Тут-то все понятно.

final Connection conn1;
conn1 = ods.getConnection();


А>когда к Connect добавляю final все равно не пашет

И что пишет?

А>надо чтоб коннект создавался вне потока а sql запрос уже в нем????????????

А>помогите что надо откорректировать&&&&&&&&&&7
А зачем connect вне потока? Создвай в нем же. Один connection на несколько конкруентных потоков скорее всего работать не будет.
Re[2]: Небольшой вопрос по бд
От: Аноним  
Дата: 12.03.07 15:33
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Main.java:208: local variable conn1 is accessed from within inner class; needs to be declared final — пишет такую ошибку


B>Тут-то все понятно.


B>

B>final Connection conn1;
B>conn1 = ods.getConnection();


А>>когда к Connect добавляю final все равно не пашет

B>И что пишет?

А>>надо чтоб коннект создавался вне потока а sql запрос уже в нем????????????

А>>помогите что надо откорректировать&&&&&&&&&&7
B>А зачем connect вне потока? Создвай в нем же. Один connection на несколько конкруентных потоков скорее всего работать не будет.


java.sql.SQLException: Локальный указатель более не действителен
Re[3]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 12.03.07 15:54
Оценка:
Здравствуйте, Аноним, Вы писали:

B>>И что пишет?


B>>А зачем connect вне потока? Создвай в нем же. Один connection на несколько конкруентных потоков скорее всего работать не будет.


А>java.sql.SQLException: Локальный указатель более не действителен

Это ответ на оба вопроса?
Re[4]: Небольшой вопрос по бд
От: Аноним  
Дата: 12.03.07 15:58
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


B>>>И что пишет?


B>>>А зачем connect вне потока? Создвай в нем же. Один connection на несколько конкруентных потоков скорее всего работать не будет.


А>>java.sql.SQLException: Локальный указатель более не действителен

B>Это ответ на оба вопроса?

да, мне надо именно такая архитектура там потом больше коннектов будет
мне надо чтоб установка коннекта была отдельно, а sql запросы в потоке!
Re[5]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 12.03.07 16:09
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>да, мне надо именно такая архитектура там потом больше коннектов будет

А>мне надо чтоб установка коннекта была отдельно, а sql запросы в потоке!

Под установокй подразумеваются наверное параметры? Что тогда мешает поместить это код:

Connection conn1;
conn1 = ods.getConnection();


в код новых потоков?


Обычно при подобном подходе используется connection pool, часто реализованый в виде javax.sql.DataSource
Re[6]: Небольшой вопрос по бд
От: Аноним  
Дата: 12.03.07 16:48
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>да, мне надо именно такая архитектура там потом больше коннектов будет

А>>мне надо чтоб установка коннекта была отдельно, а sql запросы в потоке!

B>Под установокй подразумеваются наверное параметры? Что тогда мешает поместить это код:


B>
B>Connection conn1;
B>conn1 = ods.getConnection();
B>


B>в код новых потоков?



B>Обычно при подобном подходе используется connection pool, часто реализованый в виде javax.sql.DataSource


дело в том что мне надо будет выполнять много sql запросов
и постоянно создавать коннекты не катит! мне надо создать их только один раз
идея та что в потоке кроме sql запросов ничего не должно быть

и еще вопрос тут обязательно в данном случае использовать connection pool? или
можно как то по другому реализовать?
Re[3]: Небольшой вопрос по бд
От: dimok@  
Дата: 13.03.07 05:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>java.sql.SQLException: Локальный указатель более не действителен


Еще бы! Пока стартует поток (а у вас их пять), локальная переменная вполне себе успевает выйти за область видимости. Решение — сделать conn1 полем класса. Это раз.
Второе. Пока потоки старуют вполне себе успевает выполнится conn1.close(), а это уже другая ошибка (вы пока до нее не добрались). Решение — синхронизация.
Третье. 99.9%, что обект соединения не потокобезопасен. И потоки с запросами будут в лучшем случае кидать исключения, в худшем — возвращать лажу. Опять же требуется либо синхронизация, либо свое соединение на каждый поток.

Короче. Пулы вам в помощь.
Re[7]: Небольшой вопрос по бд
От: LDimas Россия  
Дата: 13.03.07 06:13
Оценка: +1
Здравствуйте, Аноним, Вы писали:


А>и еще вопрос тут обязательно в данном случае использовать connection pool? или

А>можно как то по другому реализовать?

Вообще обычно его и используют. А почему ты-то не хочешь?
Re[2]: Небольшой вопрос по бд
От: stenkil  
Дата: 13.03.07 06:56
Оценка:
Здравствуйте, Blazkowicz, Вы писали:


B>Один connection на несколько конкруентных потоков скорее всего работать не будет.


Точно будут грабли. Проверено. Этот вопрос уже обсуждался здесь http://www.rsdn.ru/Forum/Message.aspx?mid=2030611&amp;only=1
Автор: Blazkowicz
Дата: 28.07.06
.
Re[3]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 07:14
Оценка:
Здравствуйте, stenkil, Вы писали:

B>>Один connection на несколько конкруентных потоков скорее всего работать не будет.


S>Точно будут грабли. Проверено. Этот вопрос уже обсуждался здесь http://www.rsdn.ru/Forum/Message.aspx?mid=2030611&amp;only=1
Автор: Blazkowicz
Дата: 28.07.06
.


Это не совсем то. Хотя и сродни.
Re[4]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 07:18
Оценка:
Здравствуйте, dimok@, Вы писали:

D>Еще бы! Пока стартует поток (а у вас их пять), локальная переменная вполне себе успевает выйти за область видимости. Решение — сделать conn1 полем класса. Это раз.


Что за чушь? Не пробовал разобратся каким мифическим образом final локальные переменыне попадают в анонимные классы?


D>Второе. Пока потоки старуют вполне себе успевает выполнится conn1.close(), а это уже другая ошибка (вы пока до нее не добрались). Решение — синхронизация.

Такое решение будет равносильно тому что ты эти запросы будешь выполнять в цикле без всяких потоков.

D>Третье. 99.9%, что обект соединения не потокобезопасен. И потоки с запросами будут в лучшем случае кидать исключения, в худшем — возвращать лажу. Опять же требуется либо синхронизация, либо свое соединение на каждый поток.

Про синхронихацию смотри предыдущее мое замечание.
Re[7]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 07:20
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>дело в том что мне надо будет выполнять много sql запросов

А>и постоянно создавать коннекты не катит! мне надо создать их только один раз
А>идея та что в потоке кроме sql запросов ничего не должно быть
У меня идея в том что хорошо бы для начала разобратся с JDBC и понять что при каждой операции происходит на физическом уровне работы с базой. Тогда все станет на свои места и ряд вопросов отпадет. Хотя это наверное не так-то и просто.

А>и еще вопрос тут обязательно в данном случае использовать connection pool? или

А>можно как то по другому реализовать?
Да, можно реализовать так что на каждый поток будет свое соединение. Но connection pool поможет оптимизировать количество физических соединений к базе.
Re[5]: Небольшой вопрос по бд
От: dimok@  
Дата: 13.03.07 07:23
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Что за чушь? Не пробовал разобратся каким мифическим образом final локальные переменыне попадают в анонимные классы?

Согласен! Погорячился. Однако у товарища — не работает!

D>>Второе. Пока потоки старуют вполне себе успевает выполнится conn1.close(), а это уже другая ошибка (вы пока до нее не добрались). Решение — синхронизация.

B> Такое решение будет равносильно тому что ты эти запросы будешь выполнять в цикле без всяких потоков.
А где я писал, что оно будет правильным? Но работать будет.
Re[8]: Небольшой вопрос по бд
От: Аноним  
Дата: 13.03.07 08:21
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>дело в том что мне надо будет выполнять много sql запросов

А>>и постоянно создавать коннекты не катит! мне надо создать их только один раз
А>>идея та что в потоке кроме sql запросов ничего не должно быть
B>У меня идея в том что хорошо бы для начала разобратся с JDBC и понять что при каждой операции происходит на физическом уровне работы с базой. Тогда все станет на свои места и ряд вопросов отпадет. Хотя это наверное не так-то и просто.

А>>и еще вопрос тут обязательно в данном случае использовать connection pool? или

А>>можно как то по другому реализовать?
B>Да, можно реализовать так что на каждый поток будет свое соединение. Но connection pool поможет оптимизировать количество физических соединений к базе.

Переделал под пул как вы и говорили, но все равно пишет что java.sql.SQLException: Локальный указатель более не действителен


try
        {
        OracleConnectionPoolDataSource ocpds = new OracleConnectionPoolDataSource();
        ocpds.setURL("jdbc:oracle:thin:@//192.168.64.30:1521/DB2");
        ocpds.setUser("Login");
        ocpds.setPassword("Pass");
        PooledConnection pc = ocpds.getPooledConnection();
        
        final Connection conn1 = pc.getConnection();
        final Connection conn2 = pc.getConnection();
        final Connection conn3 = pc.getConnection();
        final Connection conn4 = pc.getConnection();
        final Connection conn5 = pc.getConnection();
               
        for (int i=0; i<5; i++)
            {
        new Thread(new Runnable() 
            { 
            public void run() 
                    { 
                        try     
                        {
                    
                        Statement stmt1 = conn1.createStatement();
                        ResultSet rs = stmt1.executeQuery("SELECT * FROM TEST");
                        while (rs.next())
                        {
                        obj1 = rs.getObject(1);
                        obj2 = rs.getObject(2);
                        obj3 = rs.getObject(3);
                        System.out.println("row1 = " + obj1.toString() + ", row2 = " + obj2.toString() + ", row3 = " + obj3.toString());
                        }

                        }
                        catch(SQLException ex) {System.out.println(ex.toString()); }
                    } 
            }
            ).start();
            }

        }
    catch(Exception ex) 
        {
        System.out.println(ex.toString());
        }
Re[9]: Небольшой вопрос по бд
От: an-392  
Дата: 13.03.07 08:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Blazkowicz, Вы писали:


B>>Здравствуйте, Аноним, Вы писали:



А>Переделал под пул как вы и говорили, но все равно пишет что java.sql.SQLException: Локальный указатель более не действителен


Зачем ты взял пять соединений из пула, а используешь только одно и между потоками?
Это не безопасно. Бери соединение на поток и забудь оп роблемах.
Хотя меня терзают смутные сомнения, что тебе действительно нужны потоки.
Колись — что хочешь сделать?
Re[10]: Небольшой вопрос по бд
От: Аноним  
Дата: 13.03.07 08:51
Оценка:
Здравствуйте, an-392, Вы писали:

A3>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Blazkowicz, Вы писали:


B>>>Здравствуйте, Аноним, Вы писали:



А>>Переделал под пул как вы и говорили, но все равно пишет что java.sql.SQLException: Локальный указатель более не действителен


A3>Зачем ты взял пять соединений из пула, а используешь только одно и между потоками?

A3>Это не безопасно. Бери соединение на поток и забудь оп роблемах.
A3>Хотя меня терзают смутные сомнения, что тебе действительно нужны потоки.
A3>Колись — что хочешь сделать?

Мне надо соединение один раз установить, зачем мне 5 раз по циклу устанавливать коннект причем у меня их пять?
я хочу его один раз установить, а в потоке мне надо чтоб выполнялись только sql запросы...
Re[11]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 09:00
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Мне надо соединение один раз установить, зачем мне 5 раз по циклу устанавливать коннект причем у меня их пять?

За тем что 5 парралельных потоков не могут работать с одним соединением одновременно! Сколько тебе это можно повторять.

А>я хочу его один раз установить, а в потоке мне надо чтоб выполнялись только sql запросы...

Нельзя его 1 раз установить. Можно взять соединение из пула в потоке. И в том же потоке положить обратно. А потом когда оно понадбится другому потоку, тот возьем его из пула и после работы положит обратно. Но. Когда тебе вдруг понадобится чтобы все запросы работали одновременно, то тебе для каждого потока свой connection. А со своим "хочу" можешь делать все что угодно. Се ля ва.
Re[12]: Небольшой вопрос по бд
От: Аноним  
Дата: 13.03.07 09:08
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Мне надо соединение один раз установить, зачем мне 5 раз по циклу устанавливать коннект причем у меня их пять?

B>За тем что 5 парралельных потоков не могут работать с одним соединением одновременно! Сколько тебе это можно повторять.
понял...
А>>я хочу его один раз установить, а в потоке мне надо чтоб выполнялись только sql запросы...
B>Нельзя его 1 раз установить. Можно взять соединение из пула в потоке. И в том же потоке положить обратно. А потом когда оно понадбится другому потоку, тот возьем его из пула и после работы положит обратно. Но. Когда тебе вдруг понадобится чтобы все запросы работали одновременно, то тебе для каждого потока свой connection. А со своим "хочу" можешь делать все что угодно. Се ля ва.
а можно пример как брать это соединение? (с синтаксисиом запутался)
Re[13]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 09:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Мне надо соединение один раз установить, зачем мне 5 раз по циклу устанавливать коннект причем у меня их пять?

B>>За тем что 5 парралельных потоков не могут работать с одним соединением одновременно! Сколько тебе это можно повторять.
А>понял...
А>>>я хочу его один раз установить, а в потоке мне надо чтоб выполнялись только sql запросы...
B>>Нельзя его 1 раз установить. Можно взять соединение из пула в потоке. И в том же потоке положить обратно. А потом когда оно понадбится другому потоку, тот возьем его из пула и после работы положит обратно. Но. Когда тебе вдруг понадобится чтобы все запросы работали одновременно, то тебе для каждого потока свой connection. А со своим "хочу" можешь делать все что угодно. Се ля ва.
А>а можно пример как брать это соединение? (с синтаксисиом запутался)

Не очень знаком с OracleConnectionPoolDataSource, надо конкретно его доку читать если хочешь правильно его исользовать. Я например не понял что есть PooledConnection.
Но если следовать интерфейсу javax.sql.DataSource.



final Datasource datasource = ...

new Thread(new Runnable() 
{ 
  public void run() 
  { 
     Connection c = null;
    try 
    {  
      c = datasource.getCopnnection();
      //Все что ты хочешь сделать
    }
    catch(SQLException e) 
    {
       //Что-то делаем с ошибками
    }
    finally
    { 
      if(c != null)
      {
           c.close();
      }
    } 
   
  }
}



c.close() надо ещё в один try...catch обернуть. Думаю сам разберешься как.

Теперь попробую объяснить.
c = datasource.getCopnnection() пытается взять соединение из пула. Если есть свободное. Если свободных нет, то проверяет лимит максимального количества соединений. И если лимит не достигнут. То делает новое физическое соединение с базой.
c.close(); не закрывает физически connection а помещает его в пул. И тогда connection будет доступен для переиспользование другим потоком.

Тут какой есть нюанс. База данных ограничивает максимальное клоичество физических подключений. И если ты хочешь чтобы все потоки работали парралельно. То ты, все же, ограничен настройками базы. Если ты хочешь одновременности всегда. То тебе пул не нужен. Тебе нужно одно соединение на каждый поток.
Но пул позволит тебе запустить больше потоков чем может база держать соединений. Но тогда потоки будут работать не совсем парралельно. Параллельно будет работать количество потоков равное лимиту пула. Остальные должны ждать и начать работу как только в пуле появится свободное соединение. Может быть эту логику придется писать самому, зависит от пула.
Re[14]: Небольшой вопрос по бд
От: Аноним  
Дата: 13.03.07 09:43
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Не очень знаком с OracleConnectionPoolDataSource, надо конкретно его доку читать если хочешь правильно его исользовать. Я например не понял что есть PooledConnection.

B>Но если следовать интерфейсу javax.sql.DataSource.

B>
B>final Datasource datasource = ...

B>new Thread(new Runnable() 
B>{ 
B>  public void run() 
B>  { 
B>     Connection c = null;
B>    try 
B>    {  
B>      c = datasource.getCopnnection();
B>      //Все что ты хочешь сделать
B>    }
B>    catch(SQLException e) 
B>    {
B>       //Что-то делаем с ошибками
B>    }
B>    finally
B>    { 
B>      if(c != null)
B>      {
B>           c.close();
B>      }
B>    } 
   
B>  }
B>}
B>



B> c.close() надо ещё в один try...catch обернуть. Думаю сам разберешься как.


B>Теперь попробую объяснить.

B>c = datasource.getCopnnection() пытается взять соединение из пула. Если есть свободное. Если свободных нет, то проверяет лимит максимального количества соединений. И если лимит не достигнут. То делает новое физическое соединение с базой.
B>c.close(); не закрывает физически connection а помещает его в пул. И тогда connection будет доступен для переиспользование другим потоком.

B>Тут какой есть нюанс. База данных ограничивает максимальное клоичество физических подключений. И если ты хочешь чтобы все потоки работали парралельно. То ты, все же, ограничен настройками базы. Если ты хочешь одновременности всегда. То тебе пул не нужен. Тебе нужно одно соединение на каждый поток.

B>Но пул позволит тебе запустить больше потоков чем может база держать соединений. Но тогда потоки будут работать не совсем парралельно. Параллельно будет работать количество потоков равное лимиту пула. Остальные должны ждать и начать работу как только в пуле появится свободное соединение. Может быть эту логику придется писать самому, зависит от пула.

Спасибо разобрался но тут пример для одного коннекта,
только вот вопрос если у меня 5 коннектов, как мне быть???
и еще хочу добавить мне не надо чтоб потоки работали параллельно, а со смещением...
Re[15]: Небольшой вопрос по бд
От: stenkil  
Дата: 13.03.07 09:50
Оценка:
А>Здравствуйте, Blazkowicz, Вы писали:


B>>[java]

B>>final Datasource datasource = ...

Он уходит из этого метода, а потоки живут, оттуда и java.sql.SQLException: Локальный указатель более не действителен. Соединение с БД надо выделять в синглетон, и оттуда получать коннект. Только задачка какая то из себя...
Re[15]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 09:53
Оценка:
Здравствуйте, Аноним, Вы писали:

Прочитай, пожалуйста, правила форума на предмет излишнего цитирования. А то я как модератор уже напрягаюсь

А>Спасибо разобрался но тут пример для одного коннекта,

А>только вот вопрос если у меня 5 коннектов, как мне быть???
Где у тебя 5 коннектов? Что у тебя 5 коннектов? Зачем тебе 5 коннектов? Тебе должно быть достаточно по одному коннекту на каджый поток. Когда ты в цикле запускаешь 5 потоков. Они берут 5 коннектов из пула. Вот у тебя и есть 5 коонектов.

А>и еще хочу добавить мне не надо чтоб потоки работали параллельно, а со смещением...

Во-первых это уже не в тему этого топика.
Во-вторых они у тебя и так со смещением из-за цилка. Правда чмещение очень мало.
В-третих, тут тебя врядли кто-то сможет помочь, пока ты внятно не расскажешь что за смещение, зачем оно и чем его размер должен определятся.
Re[16]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 10:00
Оценка:
Здравствуйте, stenkil, Вы писали:

B>>>[java]

B>>>final Datasource datasource = ...

S>Он уходит из этого метода, а потоки живут,

Если ты намекаешь на что что этот datasource соберт GC, то ИМХО, это ерунда. Connection в себе сожержит ссылку на datasource (если это пул конечно), чтобы по выполненнии close() сложить соединение в пул.

S>оттуда и java.sql.SQLException: Локальный указатель более не действителен.

Причина этого исключения совсем в другом. Он закрывает connection сразу после выхода из цикла. И естесвенно что потоки ещё не успели им воспользоватся.

S>Соединение с БД надо выделять в синглетон, и оттуда получать коннект. Только задачка какая то из себя...

Соединение не надо выделять в синглетон. Синглтоном может быть DataSource. А соединение это connection. Он связат с физическим соединением и не будет обрабатывать несколько потоков одновременно. Задача вполне себе логичная.
Re[16]: Небольшой вопрос по бд
От: Аноним  
Дата: 13.03.07 10:02
Оценка:
Здравствуйте, Blazkowicz, Вы писали:


А>>Спасибо разобрался но тут пример для одного коннекта,

А>>только вот вопрос если у меня 5 коннектов, как мне быть???
B>Где у тебя 5 коннектов? Что у тебя 5 коннектов? Зачем тебе 5 коннектов? Тебе должно быть достаточно по одному коннекту на каджый поток. Когда ты в цикле запускаешь 5 потоков. Они берут 5 коннектов из пула. Вот у тебя и есть 5 коонектов.
Все разобрался, но тут возникла проблемка:
когда создаю цикл на 5 потоков, то один раз он выполняется а потом
пишет:
java.sql.SQLException: Истраченный набор результатов
java.sql.SQLException: Истраченный набор результатов
java.sql.SQLException: Истраченный набор результатов
java.sql.SQLException: Истраченный набор результатов

то есть один раз он выполняет запрос, а потом 4 раза пишет об ошибке

А>>и еще хочу добавить мне не надо чтоб потоки работали параллельно, а со смещением...

B>Во-первых это уже не в тему этого топика.
B>Во-вторых они у тебя и так со смещением из-за цилка. Правда чмещение очень мало.
B>В-третих, тут тебя врядли кто-то сможет помочь, пока ты внятно не расскажешь что за смещение, зачем оно и чем его размер должен определятся.
Вы не так поняли вы говорили что паралельно там по другому надо реализовывать, а я написал что мне не надо паралельно реализовывать.
Re[17]: Небольшой вопрос по бд
От: stenkil  
Дата: 13.03.07 10:12
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

S>>Он уходит из этого метода, а потоки живут,

B>Если ты намекаешь на что что этот datasource соберт GC, то ИМХО, это ерунда. Connection в себе сожержит ссылку на datasource (если это пул конечно), чтобы по выполненнии close() сложить соединение в пул.

Интересно, посмотрю доку.

S>>оттуда и java.sql.SQLException: Локальный указатель более не действителен.

B>Причина этого исключения совсем в другом. Он закрывает connection сразу после выхода из цикла. И естесвенно что потоки ещё не успели им воспользоватся.

Согласился бы, но в следующих примерах он не закрывал коннект, а результат был тот же

S>>Соединение с БД надо выделять в синглетон, и оттуда получать коннект. Только задачка какая то из себя...

B>Соединение не надо выделять в синглетон. Синглтоном может быть DataSource. А соединение это connection. Он связат с физическим соединением и не будет обрабатывать несколько потоков одновременно. Задача вполне себе логичная.

А здесь позволю себе и не согласиться. Гораздо логичней бы выглядело
new Thread(new Runnable() 
{ 
  public void run() 
  { 
    Connection c = null;
    Statement st= null;
  try 
    { 
     c = BD.getInstance().getConnect();
     st= c.createStatement(.... 


....................
      }
   catch(..){....}
   finally{
      if (st != null) st.close();
      if (c != null) c.close();}
  }
}

И переменные не исчезают из области видимости, и потоки каждый со своим коннектом.
Re[18]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 10:18
Оценка:
Здравствуйте, stenkil, Вы писали:

S>
S>     c = BD.getInstance().getConnect();
S>

S>И переменные не исчезают из области видимости, и потоки каждый со своим коннектом.
И читабельность ни к черту. Вот скажи. Человеку который не знаком с этим API, как понять getConnect() возвращает что?
1) Новый экземпляр соединения соответствующий новому физическому соединению.
2) Новый экземпляр соединения взятого из пула.
3) Одит и тот же экземпляр не важно откуда взятого соединения.

Какой смысл городить свои какие-то методы, когда существует совершенно стандартный JDBC API, который делает тоже самое?
Re[19]: Небольшой вопрос по бд
От: stenkil  
Дата: 13.03.07 10:28
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>И читабельность ни к черту. Вот скажи. Человеку который не знаком с этим API, как понять getConnect() возвращает что?

B>1) Новый экземпляр соединения соответствующий новому физическому соединению.
B>2) Новый экземпляр соединения взятого из пула.
B>3) Одит и тот же экземпляр не важно откуда взятого соединения.

1 Почитает доку.
2 Напишет для читабельности getPoolConnect(), getNewConnect(), getConnect(). Был просто пример

B>Какой смысл городить свои какие-то методы, когда существует совершенно стандартный JDBC API, который делает тоже самое?

Честно говоря не понял противоречий со стандартным API
Re[17]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 10:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Все разобрался, но тут возникла проблемка:

А>когда создаю цикл на 5 потоков, то один раз он выполняется а потом
А>пишет:
А>java.sql.SQLException: Истраченный набор результатов
А>java.sql.SQLException: Истраченный набор результатов
А>java.sql.SQLException: Истраченный набор результатов
А>java.sql.SQLException: Истраченный набор результатов

А>то есть один раз он выполняет запрос, а потом 4 раза пишет об ошибке


Код покажи. Это кажется уже к соединениям не имеет отношения. Ты пытаешься что-то не то переиспользовать.
Re[18]: Небольшой вопрос по бд
От: Аноним  
Дата: 13.03.07 10:34
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Все разобрался, но тут возникла проблемка:

А>>когда создаю цикл на 5 потоков, то один раз он выполняется а потом
А>>пишет:
А>>java.sql.SQLException: Истраченный набор результатов
А>>java.sql.SQLException: Истраченный набор результатов
А>>java.sql.SQLException: Истраченный набор результатов
А>>java.sql.SQLException: Истраченный набор результатов

А>>то есть один раз он выполняет запрос, а потом 4 раза пишет об ошибке


B>Код покажи. Это кажется уже к соединениям не имеет отношения. Ты пытаешься что-то не то переиспользовать.


public static Object obj1;
public static Object obj2;
public static Object obj3;

OracleConnectionPoolDataSource ocpds = new OracleConnectionPoolDataSource();
ocpds.setURL("jdbc:oracle:thin:@//192.168.64.30:1521/DB2");
ocpds.setUser("Login");
ocpds.setPassword("Pass");
final PooledConnection pc = ocpds.getPooledConnection();
        
        for (int i=0; i<5; i++)
            {
        new Thread(new Runnable() 
            { 
            public void run() 
                    { 
                        Connection c = null;
                        Statement st;
                        try     
                        {
                        c = pc.getConnection();
                        st = c.createStatement();
                        ResultSet rs = st.executeQuery("SELECT * FROM TEST");
                        while (rs.next())
                        {
                        obj1 = rs.getObject(1);
                        obj2 = rs.getObject(2);
                        obj3 = rs.getObject(3);
                        System.out.println("row1 = " + obj1.toString() + ", row2 = " + obj2.toString() + ", row3 = " + obj3.toString());
                        }
                        }
                        catch(SQLException ex) {System.out.println(ex.toString()); }
                        finally
                                {
                                if(c != null) { c.close(); }
                                }
                                               
                    } 
            }
            ).start();
            }
Re[17]: Небольшой вопрос по бд
От: an-392  
Дата: 13.03.07 10:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Blazkowicz, Вы писали:


А>когда создаю цикл на 5 потоков, то один раз он выполняется а потом

А>пишет:
А>java.sql.SQLException: Истраченный набор результатов
А>java.sql.SQLException: Истраченный набор результатов
А>java.sql.SQLException: Истраченный набор результатов
А>java.sql.SQLException: Истраченный набор результатов

Кроме чтения и понимания концепций Java, concurrency, JDBC, и конечно же FAQ'a советовать нечего.
Re[20]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 10:38
Оценка: 1 (1)
Здравствуйте, stenkil, Вы писали:

S>1 Почитает доку.

Вот это и называется читабельность ни к черту. Для понимания подобного кода достаточно знать как создатеся DataSource и его методы. А так нужно ещё разбираться что делают твои кастомные методы. Которые на самом деле ничего не делают, а просто безсполезно оборачивают JDBC API.

B>>Какой смысл городить свои какие-то методы, когда существует совершенно стандартный JDBC API, который делает тоже самое?

S>Честно говоря не понял противоречий со стандартным API
Это называется "не плодите сущности без необходимости". Пользы от этих новых методов и классов ноль. Зато есть потенциальный вред от того что новый человек подсядет на не правильное использование синглтона. Я тут сижу на саппорте такого проекта. Там сплошь и рядом BD.getSomeAPI().doSomething(); мега дизайн!
Re[19]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 10:42
Оценка:
Здравствуйте, Аноним, Вы писали:

Вот этот код тоже должен быть в коде потока.

PooledConnection pc = ocpds.getPooledConnection();

Говорил же тебе надо доку читать по классам прежде чем использовать.
Re[20]: Небольшой вопрос по бд
От: Аноним  
Дата: 13.03.07 10:47
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


B>Вот этот код тоже должен быть в коде потока.


B>PooledConnection pc = ocpds.getPooledConnection();


B>Говорил же тебе надо доку читать по классам прежде чем использовать.


Спасибо заработало!
Re[21]: Небольшой вопрос по бд
От: stenkil  
Дата: 13.03.07 10:49
Оценка:
B>Здравствуйте, stenkil, Вы писали:
B>>>Какой смысл городить свои какие-то методы, когда существует совершенно стандартный JDBC API, который делает тоже самое?
S>>Честно говоря не понял противоречий со стандартным API
B>Это называется "не плодите сущности без необходимости". Пользы от этих новых методов и классов ноль. Зато есть потенциальный вред от того что новый человек подсядет на не правильное использование синглтона. Я тут сижу на саппорте такого проекта. Там сплошь и рядом BD.getSomeAPI().doSomething(); мега дизайн!

Теперь совсем не понял. А где пул хранить, по всему коду, создавать новый?
Re[22]: Небольшой вопрос по бд
От: Blazkowicz Россия  
Дата: 13.03.07 10:54
Оценка:
Здравствуйте, stenkil, Вы писали:

S>Теперь совсем не понял. А где пул хранить, по всему коду, создавать новый?


Ну, это уже от проекта зависит. В спрнигах DataSource инжектится, в J2EE либо ищется локатором либо инжектится, в коде автора достаточно final локальной переменной.
Re[20]: Небольшой вопрос по бд
От: Аноним  
Дата: 14.05.07 21:13
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


B>Вот этот код тоже должен быть в коде потока.


B>PooledConnection pc = ocpds.getPooledConnection();


B>Говорил же тебе надо доку читать по классам прежде чем использовать.



Не подскажете, что почитать, чтобы использовать javax.sql.ConnectionPoolDataSource и подключаться к MSSQL Server? Спасибо.
Re: Небольшой вопрос по бд
От: Аноним  
Дата: 15.05.07 06:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>есть код


Очень рекомендую использовать Spring для обвязки JDBC и не мучаться.
И проблем меньше будет и код будет существенно чище и читабельней.
Re[9]: Небольшой вопрос по бд
От: dshe  
Дата: 15.05.07 06:38
Оценка: 6 (1)
Здравствуйте, Аноним, Вы писали:

А>>>и еще вопрос тут обязательно в данном случае использовать connection pool? или

А>>>можно как то по другому реализовать?
B>>Да, можно реализовать так что на каждый поток будет свое соединение. Но connection pool поможет оптимизировать количество физических соединений к базе.

А>Переделал под пул как вы и говорили, но все равно пишет что java.sql.SQLException: Локальный указатель более не действителен


То, что ты использовал в самом начале, OracleConnectionCacheImpl, это и был самый настоящий пул. Использовать OracleConnectionPoolDataSource в данном случае неверно в принципе.

A PooledConnection is not a pool of connections
--
Дмитро
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.