powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat 7 + JSP + OracleDataSource Pool
19 сообщений из 19, страница 1 из 1
Tomcat 7 + JSP + OracleDataSource Pool
    #38373367
krupt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Установлен Tomcat 7. Пытаюсь сделать пул подключений к БД Oracle не через dbcp, а через Oracl'овый пул.
В папку CATALINA_BASE\lib бросил ojdbc6.jar
В CATALINA_BASE\conf настроил файл server.xml:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  <GlobalNamingResources>
    <Resource
      name="jdbc/oracle"
      auth="Container"
      type="oracle.jdbc.pool.OracleDataSource"
      driverClassName="oracle.jdbc.driver.OracleDriver"
      factory="oracle.jdbc.pool.OracleDataSourceFactory"
      url="jdbc:oracle:thin:@127.0.0.1:1521:db1"
      user="user"
      password="password"
      InitialLimit="10"
      MaxLimit="50"
      MinLimit="10"
      InactivityTimeout="3600"
      TimeToLiveTimeout="600"
      AbandonedConnectionTimeout="3600"
      ConnectionWaitTimeout="300"
      ValidateConnection="true"
    />
  </GlobalNamingResources>


В CATALINA_BASE\conf настроил файл context.xml:
Код: xml
1.
2.
3.
4.
5.
<ResourceLink
      global="jdbc/oracle"
      name="jdbc/oracle"
      type="oracle.jdbc.pool.OracleDataSource"
    />


В приложении настроил WEB-INF\web.xml:
Код: xml
1.
2.
3.
4.
5.
6.
  <resource-ref>
    <description>Oracle database 11g</description>
    <res-ref-name>jdbc/oracle</res-ref-name>
    <res-type>oracle.jdbc.pool.OracleDataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>


Сделал класс для теста:
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
import oracle.jdbc.pool.OracleDataSource;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
//import java.util.Properties;

public class ConnectionPool implements Serializable {
String message = "Not Connected";

public void init() {
Connection conn = null;
ResultSet rst = null;
Statement stmt = null;
try {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
if (envContext == null) 
	throw new Exception("Error: No Context");
OracleDataSource ds = (OracleDataSource) envContext.lookup("jdbc/oracle/ion");

if (ds == null) throw new Exception("Error: No DataSource");
if (ds != null) conn = ds.getConnection();

if (conn != null) {
message = "Got Connection " + conn.toString() + ", ";
stmt = conn.createStatement();
stmt.execute("BEGIN dbms_lock.sleep(10); END;");
rst = stmt.executeQuery("SELECT 'Success obtaining connection' FROM DUAL");
}
if (rst.next()) message = rst.getString(1);

rst.close();
rst = null;
stmt.close();
stmt = null;
conn.close(); // Return to connection pool
conn = null; // Make sure we don't close it twice

} catch (Exception e) {
e.printStackTrace();
} finally {
// Always make sure result sets and statements are closed,
// and the connection is returned to the pool
if (rst != null) {
try {
rst.close();
} catch (SQLException e) {;}
rst = null;
}

if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {;}
stmt = null;
}

if (conn != null) {
try {
	
conn.close();
} catch (SQLException e) {;}
conn = null;
}
}
}

public String getMessage() {return message;}

}


И сделал страничку connect.jsp:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<%@page contentType="text/html"%>
<%@page pageEncoding="windows-1251"%>
<html>
<head>
<body>
<% ConnectionPool ocp = new ConnectionPool();
ocp.init(); %>
<h2>Results</h2>
Message: <%= ocp.getMessage() %>
</body>
</html>


Запрос выполняется корректно и все хорошо, но это же должен быть пул соединений.
Стоит свойство InitialLimit="10", т.е. при создании он должен создать 10 подключений к БД и в v$session я их должен видеть.
А происходит следующее: при выполнении запроса в v$session есть одна сессия, при завершении запроса она исчезает. Хотя во всех местах написано, что метод close() не должен закрывать физического соединения, а должен возвращать его в пул.
Подскажите, пож-та, что я сделал не так.
Спасибо.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38373771
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разве оракловый датасорс не мог прибить сессию, но оставить живым физическое соединение? По-моему это было бы вполне разумным вариантом.
http://stackoverflow.com/questions/1039637/relation-between-oracle-session-and-connection-pool
Там есть ссылку на книгу, в которой как раз есть объяснения ссесии и соединения в рамках пула.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374069
krupt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Разницу понял. Не подскажете как сделать пул сессий (соединений+сессий)? В БД используются пакеты и при их инициализации выполняются приличные операции и сохраняются в переменные в пакете. Хотелось бы, чтобы создались сессии и для них были проинициализированы пакеты только один раз, а не каждый раз когда соединение отдается сервлету.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374502
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот локально можно заставить пул открывать заранее требуемые соединения, через вызов метода OracleDataSource.setConnectionCachingEnabled(). Например, пока я не нажму Enter, то вижу 5 сессий:
DbPool.java
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
import oracle.jdbc.pool.OracleDataSource;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class DbPool {

  public static void main(String[] args)
    throws Exception {
    Properties properties = new Properties();
    properties.setProperty("MinLimit", "5");     // the cache size is 5 at least
    properties.setProperty("MaxLimit", "100");
    properties.setProperty("InitialLimit", "5"); // create 5 connections at startup

    OracleDataSource pool = new OracleDataSource();
    pool.setConnectionCacheProperties(properties);

    // Set DataSource properties
    pool.setURL("jdbc:oracle:thin:@127.0.0.1:1521:orcl");
    pool.setUser("scott");
    pool.setPassword("tiger");

    // This cache's name
    pool.setConnectionCacheName("OracleCache");

    // Be sure set to true
    pool.setConnectionCachingEnabled(true);

    Connection con = null;
    Statement st = null;
    ResultSet rs = null;
    try {
      con = pool.getConnection();
      st = con.createStatement();
      rs = st.executeQuery("select * from scott.EMP");
      while (rs.next()) {
        System.out.println(rs.getString("ename"));
      }
    } finally {
      if (rs != null) {rs.close();}
      if (st != null) {st.close();}
      if (con != null) {con.close();}
    }

    readEntry("Press Enter: ");
    pool.close();
  }

  public static String readEntry(String prompt) {
    try {
      StringBuffer buffer = new StringBuffer();
      System.out.print(prompt);
      System.out.flush();
      int c = System.in.read();
      while (c != '\n' && c != -1) {
        buffer.append((char) c);
        c = System.in.read();
      }
      return buffer.toString().trim();
    } catch (IOException e) {
      return "";
    }
  }
}

...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374846
krupt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov,

Как бы это tomcat'у сказать, добавил параметр ConnectionCachingEnabled="true" в <Rosource> - ничего не изменилось.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374868
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kruptХотелось бы, чтобы создались сессии и для них были проинициализированы пакеты только один раз, а не каждый раз когда соединение отдается сервлету.Заберите соединение из пула настолько, насколько это необходимо.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374869
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kruptКак бы это tomcat'у сказать, добавил параметр ConnectionCachingEnabled="true" в <Rosource> - ничего не изменилось.
А если с маленькой буквы написать?
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374912
krupt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovЗаберите соединение из пула настолько, насколько это необходимо.
Пользователь подключается и неизвестно когда отключиться. Если привязывать соединение в session.setAttribute, дак только от пула никакого, получается, что каждому пользователю 1 соединение.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374914
krupt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kruptПользователь подключается и неизвестно когда отключиться. Если привязывать соединение в session.setAttribute, дак только от пула никакого толку, получается, что каждому пользователю 1 соединение.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374928
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 22.08.2013 16:32, krupt wrote:

> Как бы это tomcat'у сказать, добавил параметр ConnectionCachingEnabled="true" в <Rosource> - ничего не изменилось.

Например, тут говорят что там все плохо:

https://forums.oracle.com/message/1673742#559728

предлагают наследоваться от OracleDataSource и вписать куда-нибудь вызов setConnectionCachingEnabled(), например, в
setConnectionCacheProperties().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374940
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kruptПользователь подключается и неизвестно когда отключиться. Если привязывать соединение в session.setAttribute, дак только от пула никакого, получается, что каждому пользователю 1 соединение.Давайте вы немного определите меня в реализации вашей системы ...

В случае двухзвёнки "пользователь == логин СУБД", в случае трёхзвёнки "пользователь == некая_сущность".
В случае трёхзвёнки с базой работает совершенно отдельный служебный пользователь и сессия пользователя "привязывается" к запросам отдельным механизмом.
В этом случае на одном физическом подключении к СУБД могут исполняться запросы разных сессий.
А в этом случае "возвращать или не возвращать" определяется, в основном, частотой запросов.

А как организовано у вас ?
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38374976
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
+1
В СУБД оракле сессия = коннект = соединение.
Следовательно инициализация пакетов субд у вас долгая с какой целью?
Пакеты в БД привязаны к сессии. Т.е. на каждого пользюка СУБД свои переменные пакетов и своя их инициализация.
IMHO вы 3-х звенку пытаетесь натянуть на 2-х звенку.
Или 5-ю пакетами-коннектами работать со всеми сервлетами (HTTP сеансами), причём не давая пулу их закрыть.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38375001
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123В СУБД оракле сессия = коннект = соединение.

Пруфлинк есть? Я выше привел ссылку на книгу, в которой написано обратное утверждение.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38375017
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczPetro123В СУБД оракле сессия = коннект = соединение.

Пруфлинк есть? Я выше привел ссылку на книгу, в которой написано обратное утверждение.
я тебя не понял. Скажи своими словами.
kruptт.е. при создании он должен создать 10 подключений к БД и в v$session я их должен видеть.
т.е. 10 подключений и будет 10 сессий.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38375021
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
там наверно Java сессия путается с СУБД сессией imho
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38375042
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Blazkowicz,
там наверно Java сессия путается с СУБД сессией imho
100%

Expert Oracle JDBC Programming Connections and Sessions in Oracle

Before we delve into connection pooling, you need to understand the difference between a connection and a session in the context of Oracle. This difference is particularly useful in understanding OCI connection pooling, which the upcoming section OCI Connection Pooling covers. Most of us think of connections and sessions as being the same, but in reality they are not. A connection is a network connection or a physical pathway to the Oracle database. A session encapsulates a user s interaction with the Oracle database from the time the user has been authenticated to the time the user disconnects. A session connects to Oracle via a physical connection. Note that you could be connected to a database and yet have zero, one, or more sessions that use a given connection. In the most common case, one session corresponds to one connection this explains why we tend to consider them the same. Figure 14-1 illustrates a connection being shared by three sessions, two of which belong to the user SCOTT, and one of which belongs to the user BENCHMARK. The thick arrow represents the connection itself. Although the figure shows a two-tier system, the same concept applies to a three-tier system. You will learn in the section OCI Connection Pooling how you can open multiple sessions per physical connection.
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38375064
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я просто не представляю что у него там в инит пакета окромя переменных

Код: plsql
1.
2.
3.
4.
CREATE OR REPLACE PACKAGE "ФФФФФФ" is
  --------------------
  --  PUBLIC CONSTANTS
  CONST_ВВВВВВВ CONSTANT NUMBER := 1;
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38375084
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krupt, еще вариант: http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#As_a_Resource Только надо будет учесть что в качестве Connection тебе будет приходить не оракловая реализация (т.е. не будут работать методы типа BLOB.createTermporary(), требующие именно OracleConnection)но до нее можно достучаться через Connection.getMetadata().getConnection()
...
Рейтинг: 0 / 0
Tomcat 7 + JSP + OracleDataSource Pool
    #38375087
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis Popovkrupt, еще вариант: http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#As_a_Resource Только надо будет учесть что в качестве Connection тебе будет приходить не оракловая реализация (т.е. не будут работать методы типа BLOB.createTermporary(), требующие именно OracleConnection)но до нее можно достучаться через Connection.getMetadata().getConnection()

Можно использовать томкатовский пул вместо OracleDataSourceFactory. Тот не сможет сделать финт ушами и удалить сессию.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat 7 + JSP + OracleDataSource Pool
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]