2016-04-22 3 views
0

В моем веб-приложении я использую шаблон с сеансом за запрос. У меня есть пул соединений и открытые сеансы в Filter с использованием SessionFactory.openSession(), а затем Session.close().Как отключить сеанс Hibernate

В этом же приложении для сложного процесса я хочу использовать сеанс за разговор. Я попытался открыть вторую сессию с SessionFactory.openSession(), но впоследствии вызов Session.disconnect() ничего не делает.

Как я могу вручную подключать/отключать сеансы? Это мой файл конфигурации Hibernate:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property> 
    <property name="hibernate.connection.url">jdbc:postgresql://localhost/.....</property> 
    <property name="hibernate.connection.username">...</property> 
    <property name="hibernate.connection.password">...</property> 

    <property name="hibernate.c3p0.min_size">1</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.test_connection_on_checkout">true</property> 

    <property name="hibernate.cache.use_second_level_cache">true</property> 
    </session-factory> 
</hibernate-configuration> 

код Java:

longSession = mySessionFactory.openSession(); 
System.out.println(((SessionImplementor) longSession).isConnected()); 
longSession.disconnect(); 
System.out.println(((SessionImplementor) longSession).isConnected()); 

Это выводит true дважды ...

ответ

1

Я думаю, что это связано с этой запиской в ​​Hibernate Documents:

Обратите внимание, что disconnect() вызывает сеанс, в котором co было ть соединение извлекается Hibernate через настроенный ConnectionProvider не имеет никакого эффекта, при условии ConnectionReleaseMode.ON_CLOSE не действует

Также обратите внимание на это в Documentation for session-per-conversation:

Совершения транзакций базы данных разъединяет сеанс от JDBC подключение и возврат к подключению к бассейну

Это говорит, что вам нужно только совершить переход действия для возврата соединения в пул, для последней сделки в вашем разговоре, за исключением:

// foo is an instance loaded earlier by the old session 
Transaction t = session.beginTransaction(); // Obtain a new JDBC connection, start transaction 

foo.setProperty("bar"); 

session.flush(); // Only for last transaction in conversation 
t.commit();   // Also return JDBC connection 
session.close(); // Only for last transaction in conversation 
+0

Я знаю, но везде, где я читал о сеансах за разговор, но не знают, что на самом деле назвать его использовать , Как настроить Hibernate для отключения сеанса связи? – Oliv

+0

Как открыть сеанс для отключения? – Oliv

+0

@Oliv Я не понимаю, почему вы не хотите использовать 'session.close()'? –

Смежные вопросы