Нужно ли явно закрывать сеанс спящего режима? [Дубликат]

Поскольку люди, похоже, обращаются к этому вопросу, когда речь заходит об ошибках компоновщика, я собираюсь добавить это здесь.

Одной из возможных причин ошибок компоновщика с GCC 5.2.0 является то, что новая библиотека libstdc ++ ABI теперь выбран по умолчанию.

Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.

. Если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0 это было бы замечательно.

59
задан coding_idiot 8 November 2013 в 13:17
поделиться

3 ответа

Я новичок в hibernate, после чтения hibernate api и учебника, кажется, что сессия должна быть закрыта, если не используется.

Он должен быть закрыт, когда вы (но это может быть сделано автоматически для вас, как мы увидим).

У меня нет вопросов при использовании его в автономном приложении. Однако я не уверен при использовании в веб-приложении.

Ну, как объясняется в разделе 11.1.1. Единица работы документации, , наиболее распространенным шаблоном в многопользовательском клиент-серверном приложении является сеанс за запрос .

Например , У меня есть сервлет: TestServlet для получения параметров от клиента, затем я вызываю диспетчера для запроса чего-либо в соответствии с параметрами: точно так же (...) Должен ли я закрывать сеанс в методе запроса?

Все зависит от того, как вы получите сеанс.

  • , если вы используете sessionFactory.getCurrentSession(), вы получите «текущую сессию», которая привязана к жизненному циклу [и g10]
  • , если вы решите использовать sessionFactory.openSession(), вам придется управлять сеансом самостоятельно и скрывать и закрывать его, когда транзакция завершается (фиксация или откат).
  • «вручную».

Чтобы реализовать шаблон для каждого запроса , предпочитайте первый подход (намного проще и менее подробный). Используйте второй подход для реализации длинных цепочек .

Страница wiki Сессии и транзакции являются хорошим дополнением к документации по этой теме.

Кстати, работает ли tx.commit ()

Возможно, вы захотите прочитать Доступ к транзакционным данным и режим автоматической фиксации , чтобы прояснить несколько вещей, но, проще говоря, , ваш Hibernate-код должен быть выполнен внутри транзакции, и я бы предложил использовать явные границы транзакций (то есть явные beginTransaction и commit).

Также в чем проблема с использованием потока session in servlet, так как я видел, что сеанс не является потокобезопасным в api.

Просто не делайте его переменной экземпляра сервлета, и у вас не будет проблем.

Ссылки

106
ответ дан SpringLearner 24 August 2018 в 05:44
поделиться

Мы можем использовать ThreadLocal.

public class MyUtil {
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
private static final ThreadLocal<Session> threadLocal;

static {
try {
    Configuration configuration = new Configuration();
    configuration.configure();
    serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
    threadLocal = new ThreadLocal<Session>();

    } catch(Throwable t){
      t.printStackTrace();
      throw new ExceptionInInitializerError(t);
    }
}
public static Session getSession() {
    Session session = threadLocal.get();
    if(session == null){
        session = sessionFactory.openSession();
        threadLocal.set(session);
    }
    return session;
}

public static void closeSession() {
    Session session = threadLocal.get();
    if(session != null){
    session.close();
    threadLocal.set(null);
    }
}

public static void closeSessionFactory() {
    sessionFactory.close();
    StandardServiceRegistryBuilder.destroy(serviceRegistry);
   }
}

Здесь SessionFactory инициализируется только один раз с использованием статического блока. Следовательно, всякий раз, когда класс main вызывает вызов getSession(), присутствие объекта Session сначала проверяется в объекте threadLocal. Поэтому эта программа обеспечивает безопасность потоков. После каждой операции closeSession() закроет сеанс и установите для объекта threadLocal значение null. Наконец, назовите closeSessionFactory().

0
ответ дан AnirbanDebnath 24 August 2018 в 05:44
поделиться

Если вы получаете сеанс через sessionFactory.openSession(), вам нужно закрыть его извне. Открытая сессия в течение непредвиденного периода может привести к утечке данных. Кроме того, он может дать приглашение угрозе безопасности веб-приложений.

0
ответ дан KernelPanic 24 August 2018 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: