Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / glassfish 3, ejb3 pool idle timeout (пул ejb бинов) / 10 сообщений из 10, страница 1 из 1
14.02.2013, 14:25:32
    #38151269
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
такая ситуация,
логика работы с DB находиться в ejb @Stateless бинах
например,

Код: 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.
@Stateless
class ShowDB extends AbstractDB {
... 
  public List<BaseModel> getTypesList() {
    List<BaseModel> ret = new ArrayList<>();
    String sql = "SELECT " +
            " s.show_type_id," +
            " s.show_type_name" +
            " FROM gk.t_show_type s";
    PreparedStatement s;
    try {
      s = getConnection().prepareStatement(sql);
      try (ResultSet r = s.executeQuery()) {
        while (r.next()) {
          BaseModel model = new BaseModel();
          model.setId(r.getLong("show_type_id"));
          model.setName(r.getString("show_type_name"));
          ret.add(model);
        }
        r.close();
      } catch (SQLException e) {
        Logger.getLogger(ShowDB.class.getName()).log(Level.SEVERE, "getTypesList:s.executeQuery():", e);
      } finally {
        s.close();
      }
    } catch (SQLException e) {
      Logger.getLogger(ShowDB.class.getName()).log(Level.SEVERE, "getTypesList:conn.prepareStatement():", e);
    }
    return ret;
  }


..

где

Код: 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 abstract class AbstractDB {
  @Resource(name = "jdbc/worker1")
  private DataSource dataSource;
  @Getter(AccessLevel.PROTECTED)
  Connection connection = null;

  @PostConstruct
  private void init() {
    try {
      connection = dataSource.getConnection();
      Logger.getLogger(AbstractDB.class.getName()).log(Level.SEVERE, "init:start db connection!!! ", connection);
    } catch (SQLException e) {
      Logger.getLogger(AbstractDB.class.getName()).log(Level.SEVERE, "init:dataSource.getConnection():", e);
    }
  }

  @PreDestroy
  private void destroy() {
    if (null != connection) {
      try {
        try {
          connection.close();
          connection = null;
        } catch (SQLException e) {
          throw new SQLException("connection.close()" + e.getMessage());
        }
        Logger.getLogger(AbstractDB.class.getName()).log(Level.SEVERE, "destroy:stop db connection!!! ", connection);
      } catch (SQLException e) {
        Logger.getLogger(AbstractDB.class.getName()).log(Level.SEVERE, "destroy:conn.close():", e);
      }
    }
  }
}



все работает, но иногда при множестве запросах от кучи клинетов заканчиваются курсоры в оракле,
выставил
connection-leak-timeout-in-seconds="10"
statement-timeout-in-seconds="6"
statement-leak-timeout-in-seconds="2"
в логах иногда проскакивает
[
Код: java
1.
2.
#|2013-02-14T13:35:40.309+0400|WARNING|glassfish3.1.2|javax.enterprise.resource.resourceadapter.com.sun.enterprise.resource.pool|_ThreadID=55;_ThreadName=Thread-2;|A potential connection leak detected for connection pool worker1. The stack trace of the thread is provided below : 
db.AbstractDB.init(AbstractDB.java:29)


а это и есть
Код: java
1.
connection = dataSource.getConnection();



вижу два варианта,
сразу закрывать connection после каждого PreparedStatement или CallableStatement, а бин будет жить дальше, и при его повторном вызове, он опять будет брать connection из пула,
или выставить у ejb pool idle timeout = 1 sec например, по умолчанию 600, то есть ejb бин живет 10 мин и только потом в нем срабатывает
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@PreDestroy
  private void destroy() {
    if (null != connection) {
      try {
        try {
          connection.close();
          connection = null;
        } catch (SQLException e) {
          throw new SQLException("connection.close()" + e.getMessage());
        }


...
как мне кажется плюсы того что бин живет 10 мин и не отдает connection в пул, в том что при его вызовах в пределах эти 10 мин
он не берет connection из пула, а сразу вынимает из него PreparedStatement или CallableStatement, это видно по логам.

вобщем какая тут best practice ?
спасибо
...
Рейтинг: 0 / 0
14.02.2013, 14:35:30
    #38151301
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
breathсразу закрывать connection после каждого PreparedStatement или CallableStatement, а бин будет жить дальше, и при его повторном вызове, он опять будет брать connection из пула
...
вобщем какая тут best practice ?

Ну, сами же всё знаете. Нефиг серверу без дела занимать ресурсы БД.
...
Рейтинг: 0 / 0
14.02.2013, 14:54:39
    #38151348
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
вариант просто выставить в админке ejb pool idle timeout = 1 вместо ejb pool idle timeout = 600 не очень ?
получается лучше бину жить подольше, и брать/класть connection в pool, чем уничтожаться и создаваться контейнером ? (в этом случае просто переписывать ничего не нужно, все и так находиться в @PostConstruct, @PreDestroy у AbstractDB)
...
Рейтинг: 0 / 0
14.02.2013, 15:01:22
    #38151364
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
breathвариант просто выставить в админке ejb pool idle timeout = 1 вместо ejb pool idle timeout = 600 не очень ?
получается лучше бину жить подольше, и брать/класть connection в pool, чем уничтожаться и создаваться контейнером ? (в этом случае просто переписывать ничего не нужно, все и так находиться в @PostConstruct, @PreDestroy у AbstractDB)
Ну, это уже нужно смотреть на ваши нагрузки, померять. Но есть сомнения, что это будет сильно лучше.
Т.е. если у бинов есть какая-то логика помимо JDBC, они могут вообще безболезнено отдавать соединения на это время.
Кроме этого, бины могут просто вместе работать, обслуживая клинтов чуть дольше (каждого, но при этом более эффективно всех вместе.
Короткий idle time к чему приведёт? Бины всегда будут намного чаще пересоздаваться? Скорее всего увеличится нагрузка на GC. Кроме этого не понятно сколько вообще стоит создание-дестрой. Вдруг оно тоже не так дешево обходится. Даже почти наверняка, это же EJB.
...
Рейтинг: 0 / 0
14.02.2013, 15:08:31
    #38151383
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
на сколько знаю, ejb бины не создаются и не удаляются как обычные объекты, они находятся в пуле, и после уничтожения помещаются туда, а по требованию клиента вынимаются от туда, то есть GC тут отдыхает как бы.
один из моментов, который нравиться в них.
...
Рейтинг: 0 / 0
14.02.2013, 15:11:42
    #38151387
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
breathна сколько знаю, ejb бины не создаются и не удаляются как обычные объекты, они находятся в пуле, и после уничтожения помещаются туда, а по требованию клиента вынимаются от туда, то есть GC тут отдыхает как бы.
один из моментов, который нравиться в них.
Да, но короткий idle timeout, который вы предлагаете приведёт к частому пересозданию вместо пулирования. Разве нет?
...
Рейтинг: 0 / 0
14.02.2013, 15:11:47
    #38151388
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
>Т.е. если у бинов есть какая-то логика помимо JDBC, они могут вообще безболезнено отдавать соединения на это время.
у бинов для работы с DB больше никакой логики нет, но есть бины с другим функционалом - RESTful Web Services
@Path("document")
@Stateless
public class DocumentService extends BaseHttpService {
...
...
Рейтинг: 0 / 0
14.02.2013, 15:15:29
    #38151396
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
BlazkowiczДа, но короткий idle timeout, который вы предлагаете приведёт к частому пересозданию вместо пулирования. Разве нет?
не знаю
...
Рейтинг: 0 / 0
14.02.2013, 15:19:53
    #38151406
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
breathне знаю
А кто должен знать? Вы же предлагаете такое решение.
Pool Idle Timeout : the maximum time that a stateless session bean, entity bean, or message-driven bean is allowed to be idle in the pool. After this time, the bean is destroyed if the bean in case is a stateless session bean or a message driver bean. This is a hint to server. The default value is 600 seconds. The corresponding EJB deployment descriptor attribute is pool-idle-timeout-in-seconds.
...
Рейтинг: 0 / 0
14.02.2013, 15:55:34
    #38151483
breath
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
понял, пасибо
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / glassfish 3, ejb3 pool idle timeout (пул ejb бинов) / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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