С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/63: Рейтинг темы: голосов - 63, средняя оценка - 4.65
Tops
1

Ограничение на количество открываемых сессий одним пользователем в Oracle.

28.01.2010, 15:16. Показов 11592. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Существует такая проблема: есть web-приложение, в котором происходит коннект к Oracle 8.1.7. В качестве сервера приложений используется Tomcat 4.1.27 (сервер стоит под RedHat 8, но есть и на W2000 Server SP3. J2SDK 1.4.2_02)
Коннект происходит через JDBC драйвер (использовался как classes12 так и ojdbc12.jar), коннект происходит нормально никаких проблем, но в результате на Oracle открывается куча сессий (для одного пользователя).

Естественно если число пользователей возрастает, кол-во сессий тоже растет. Вот это то и не нравится (ведь само кол-во сессий ограничено на Oracle).

Можно ли как-то, и если да то как, ограничить кол-во открываемых сессий на одного пользователя? (оптимально насколько я понимаю должна быть одна?)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2010, 15:16
Ответы с готовыми решениями:

OpenDialog: ограничение на количество открываемых файлов
Здравствуйте. Делаю приложение на Delphi XE с использованием Firemonkey и сталкнулся с проблемой...

Есть ли в CommonDialog ограничение на количество открываемых файлов
Здравствуйте. Для открытия файлов использую CommonDialog, с разрешением открытия нескольких файлов....

Ограничение количества сессий tcp/ip для Windows 10
Доброго времени суток! В Win XP Prof одновременно к сетевому ресурсу может быть 10 подключений, в...

Ограничение по количеству сессий. Максимальное число пользователей 20
Доброе время суток. У меня следующий вопрос. При создании общей папки в windows 7 присутствует...

8
mishgun
28.01.2010, 21:39 2
Первый вопрос код в студию))
Второй а Connection Statement ResultSet закрываем?Похожий вопрос уже возникал тут по моему и решение было именно такое....
1 / 1 / 1
Регистрация: 03.06.2008
Сообщений: 101
28.01.2010, 22:08 3
Что то я не припомню где в Оракле ограничивается количество сессий.
0
Tops
30.01.2010, 17:56 4
Вот собственно код:

***************************************
Класс где создается коннект к ораклу (класс OracleConnect() ):

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class OracleConnect {
  private String lUserName  = null;
  private String lPassword  = null;
  private String lUrl       = null;
  private Context ctx       = null;
 
  public OracleConnect() {
    try{
      ctx = new InitialContext();
      lUserName   = (String) ctx.lookup('java:/comp/env/db.user');
      lPassword   = (String) ctx.lookup('java:/comp/env/db.pass');
      lUrl        = (String) ctx.lookup('java:/comp/env/db.url');
    } catch (NamingException e) {
      System.out.println('JNDI failed : ' + e);
    }
    try{
      DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    }catch(SQLException e){
      e.printStackTrace();
    }
  }
 
  public synchronized Connection getConnection(){
    Connection conn = null;
    try{
    conn = DriverManager.getConnection(this.lUrl,this.lUserName,this.lPassword);
    }catch(SQLException e){
      e.printStackTrace();
    }
    return conn;
  }
}
Далее, при вызове метода другого класса создаем конект (lDataSource и lCon) (например получения какого-либо наименования)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 public class Auto{
  private OracleConnect     lDataSource;  // пул коннектов к БД
  private Connection        lCon = null;  // соединение с БД
  private CallableStatement lCstmt;   
  private ResultSet     lResult;      
 
 
 public Auto(){
    lDataSource = new OracleConnect();
    lCon = lDataSource.getConnection();
  }
 
  /* Получить список наименований */
  public synchronized List getNameList(int pGrpId, int pActIt){
    List lList  = new ArrayList();
    try{
      lCstmt = lCon.prepareCall('{call webapi.name_select(?,?,?)}');  // вызывается пакет из оракла
      lCstmt.registerOutParameter(1,OracleTypes.CURSOR);
      lCstmt.setInt(2,pGrpId);
      lCstmt.setInt(3,pActIt);
      lCstmt.execute();
      this.lResult = (ResultSet)lCstmt.getObject(1);
      while (lResult.next()){
        lList.add( new Data(lResult.getInt('id'),
                            lResult.getString('name')));
      };
      lCstmt.close();
    } catch (SQLException sqle) {
      sqle.printStackTrace();
    }
    return lList;
  }
}
В этом же классе присутствует метод закрывающий коннект
Java
1
2
3
4
5
6
7
8
9
  /* Закрываем коннект */
  public synchronized void closeCon(){
      if (lCon != null)
        try {
          lCon.close(); }
        catch (SQLException sqle1) {
          sqle1.printStackTrace();
        }
    }
*****************************************

После вызова метода getNameList() и соотвественно вывода всех данных на страницу
в jsp вызывается метод закрытия коннектта (lAuto - экземпляр класса Auto) - <%lAuto.closeCon();%>

Сессии же все равно создаются у одного пользователя.

2 space_center: количество сессий задается в файле ora.ini (у нас оно равно 165, можно конечно же их увеличить, но это не выход, согласитесь )

2 mishgun: '... а Connection Statement ResultSet закрываем?...' - в моем случае это означает закрыть lResult?
1 / 1 / 1
Регистрация: 03.06.2008
Сообщений: 101
30.01.2010, 19:35 5
2 Tops:
Ты наверно хотел сказать в init.ora 8)
Во-первых: да, IResult тоже надо закрывать.
Во-вторых: в данном приложении тебе лучше использовать уже готовые решения для хранения пула соединений, а то при постоянной установке нового соединения СУБД жутко загружаеться.
0
Tops
31.01.2010, 08:51 6
Ага, имено в нем - в init.ora
А какие готовые решения для хранения пула соединений можно тут порекомендовать?
1 / 1 / 1
Регистрация: 03.06.2008
Сообщений: 101
31.01.2010, 09:26 7
По идее с каждым сервером приложений уже должны идти механизмы пула,
а так можешь посмотреть здесь:
http://jakarta.apache.org/commons/dbcp/
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
31.01.2010, 10:15 8
Попробуй oracle.jdbc.pool.OracleConnectionPoolDataSource.
0
0 / 0 / 1
Регистрация: 29.05.2009
Сообщений: 52
03.02.2010, 11:01 9
Sorry for translit.
IMHO vmesto:
Java
1
2
3
4
5
6
7
try {
  Connection conn = ...;
  . . .
  conn.close();
} catch (...) {
 
}
Ispol'zovat' konstrukciju:
Java
1
2
3
4
5
6
7
try {
  Connection conn = ...;
  . . .
} catch (...) {
} finally {
  if (conn != null) { conn.close(); }
}
Eto pozvolit zakryt' soedinenie v sluchae esli proizoydet lybaya oshibka v rabote. Inache mozno poluchit' 'zavisshie' konnekty .
0
03.02.2010, 11:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2010, 11:01
Помогаю со студенческими работами здесь

Количество одновременно открываемых файлов
в DOS была команда Files которая указывала количество одновременно открытых файлов, есть что0нибудб...

Как ограничить количество открываемых форм при нажатии на кнопку
Подскажите как ограничить количество открываемых форм при нажатии на кнопку. При каждом клике...

Ограничение показов одним городом
Добрый день! Мне нужно сделать так чтоб показ объявлений ограничивался одним городом, причем...

Авторизация с одним пользователем
Есть две страницы. На первой - форма для ввода логина и пароля. На второй - основное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru