Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Tomcat 7 + JSP + OracleDataSource Pool / 19 сообщений из 19, страница 1 из 1
21.08.2013, 14:48:14
    #38373367
krupt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
Всем привет.
Установлен 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
21.08.2013, 18:07:18
    #38373771
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
Разве оракловый датасорс не мог прибить сессию, но оставить живым физическое соединение? По-моему это было бы вполне разумным вариантом.
http://stackoverflow.com/questions/1039637/relation-between-oracle-session-and-connection-pool
Там есть ссылку на книгу, в которой как раз есть объяснения ссесии и соединения в рамках пула.
...
Рейтинг: 0 / 0
22.08.2013, 08:00:43
    #38374069
krupt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
Blazkowicz,

Разницу понял. Не подскажете как сделать пул сессий (соединений+сессий)? В БД используются пакеты и при их инициализации выполняются приличные операции и сохраняются в переменные в пакете. Хотелось бы, чтобы создались сессии и для них были проинициализированы пакеты только один раз, а не каждый раз когда соединение отдается сервлету.
...
Рейтинг: 0 / 0
22.08.2013, 13:07:57
    #38374502
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
Вот локально можно заставить пул открывать заранее требуемые соединения, через вызов метода 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
22.08.2013, 15:32:47
    #38374846
krupt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
Denis Popov,

Как бы это tomcat'у сказать, добавил параметр ConnectionCachingEnabled="true" в <Rosource> - ничего не изменилось.
...
Рейтинг: 0 / 0
22.08.2013, 15:40:13
    #38374868
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
kruptХотелось бы, чтобы создались сессии и для них были проинициализированы пакеты только один раз, а не каждый раз когда соединение отдается сервлету.Заберите соединение из пула настолько, насколько это необходимо.
...
Рейтинг: 0 / 0
22.08.2013, 15:40:28
    #38374869
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
kruptКак бы это tomcat'у сказать, добавил параметр ConnectionCachingEnabled="true" в <Rosource> - ничего не изменилось.
А если с маленькой буквы написать?
...
Рейтинг: 0 / 0
22.08.2013, 16:06:28
    #38374912
krupt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
Basil A. SidorovЗаберите соединение из пула настолько, насколько это необходимо.
Пользователь подключается и неизвестно когда отключиться. Если привязывать соединение в session.setAttribute, дак только от пула никакого, получается, что каждому пользователю 1 соединение.
...
Рейтинг: 0 / 0
22.08.2013, 16:07:33
    #38374914
krupt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
kruptПользователь подключается и неизвестно когда отключиться. Если привязывать соединение в session.setAttribute, дак только от пула никакого толку, получается, что каждому пользователю 1 соединение.
...
Рейтинг: 0 / 0
22.08.2013, 16:14:39
    #38374928
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
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
22.08.2013, 16:20:17
    #38374940
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
kruptПользователь подключается и неизвестно когда отключиться. Если привязывать соединение в session.setAttribute, дак только от пула никакого, получается, что каждому пользователю 1 соединение.Давайте вы немного определите меня в реализации вашей системы ...

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

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

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

Пруфлинк есть? Я выше привел ссылку на книгу, в которой написано обратное утверждение.
я тебя не понял. Скажи своими словами.
kruptт.е. при создании он должен создать 10 подключений к БД и в v$session я их должен видеть.
т.е. 10 подключений и будет 10 сессий.
...
Рейтинг: 0 / 0
22.08.2013, 17:00:19
    #38375021
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
Blazkowicz,
там наверно Java сессия путается с СУБД сессией imho
...
Рейтинг: 0 / 0
22.08.2013, 17:08:11
    #38375042
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
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
22.08.2013, 17:20:05
    #38375064
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Tomcat 7 + JSP + OracleDataSource Pool
я просто не представляю что у него там в инит пакета окромя переменных

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


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