powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
10 сообщений из 10, страница 1 из 1
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151269
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такая ситуация,
логика работы с 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
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151301
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathсразу закрывать connection после каждого PreparedStatement или CallableStatement, а бин будет жить дальше, и при его повторном вызове, он опять будет брать connection из пула
...
вобщем какая тут best practice ?

Ну, сами же всё знаете. Нефиг серверу без дела занимать ресурсы БД.
...
Рейтинг: 0 / 0
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151348
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант просто выставить в админке ejb pool idle timeout = 1 вместо ejb pool idle timeout = 600 не очень ?
получается лучше бину жить подольше, и брать/класть connection в pool, чем уничтожаться и создаваться контейнером ? (в этом случае просто переписывать ничего не нужно, все и так находиться в @PostConstruct, @PreDestroy у AbstractDB)
...
Рейтинг: 0 / 0
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151364
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathвариант просто выставить в админке ejb pool idle timeout = 1 вместо ejb pool idle timeout = 600 не очень ?
получается лучше бину жить подольше, и брать/класть connection в pool, чем уничтожаться и создаваться контейнером ? (в этом случае просто переписывать ничего не нужно, все и так находиться в @PostConstruct, @PreDestroy у AbstractDB)
Ну, это уже нужно смотреть на ваши нагрузки, померять. Но есть сомнения, что это будет сильно лучше.
Т.е. если у бинов есть какая-то логика помимо JDBC, они могут вообще безболезнено отдавать соединения на это время.
Кроме этого, бины могут просто вместе работать, обслуживая клинтов чуть дольше (каждого, но при этом более эффективно всех вместе.
Короткий idle time к чему приведёт? Бины всегда будут намного чаще пересоздаваться? Скорее всего увеличится нагрузка на GC. Кроме этого не понятно сколько вообще стоит создание-дестрой. Вдруг оно тоже не так дешево обходится. Даже почти наверняка, это же EJB.
...
Рейтинг: 0 / 0
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151383
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на сколько знаю, ejb бины не создаются и не удаляются как обычные объекты, они находятся в пуле, и после уничтожения помещаются туда, а по требованию клиента вынимаются от туда, то есть GC тут отдыхает как бы.
один из моментов, который нравиться в них.
...
Рейтинг: 0 / 0
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151387
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
breathна сколько знаю, ejb бины не создаются и не удаляются как обычные объекты, они находятся в пуле, и после уничтожения помещаются туда, а по требованию клиента вынимаются от туда, то есть GC тут отдыхает как бы.
один из моментов, который нравиться в них.
Да, но короткий idle timeout, который вы предлагаете приведёт к частому пересозданию вместо пулирования. Разве нет?
...
Рейтинг: 0 / 0
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151388
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Т.е. если у бинов есть какая-то логика помимо JDBC, они могут вообще безболезнено отдавать соединения на это время.
у бинов для работы с DB больше никакой логики нет, но есть бины с другим функционалом - RESTful Web Services
@Path("document")
@Stateless
public class DocumentService extends BaseHttpService {
...
...
Рейтинг: 0 / 0
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151396
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДа, но короткий idle timeout, который вы предлагаете приведёт к частому пересозданию вместо пулирования. Разве нет?
не знаю
...
Рейтинг: 0 / 0
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151406
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
    #38151483
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял, пасибо
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / glassfish 3, ejb3 pool idle timeout (пул ejb бинов)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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