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...
Пока на собственное сообщение не было ответов, его можно удалить.