LINUX.ORG.RU

JDBC изоляция сессий


0

0

Предистория: было некое приложение работяющее с базой, каждый пользователь приложения был зарегистрирован в базе как пользователь субд (как это культурно назвать?), и соотв. коннектился под своим уникальным именем, в итоге SQL программисты часто использовали SQL сессию, временные таблицы надеясь что они друг от друга изолированны и т.д.

Итак, есть веб приложение (есесно на Java) использующее процедуры из вышеописанной системы, в этом приложении есть записи и поиск этих записей, все вроде работает, но: - делаем посик и находим некоторые особые записи - просматриваем их - заходим под другим вользователем в веб приложение - повторяем поиск и он возвращает неверный результат, - просматриваем записи - повторяем поиск и он работает верно

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

Вопрос: как «сбросить» состояние SQL соединения?

База DB2, сервер Tomcat 5.5.27 подключение создается через настроенный пул соединений: Код:

	<Resource Schema="TEST"
	          auth="Container"
	          connectionProperties="retrieveMessagesFromServerOnGetMessage=true;clientProgramName=TEST/WEB;driverType=4;readOnly=false;currentSchema=TEST;"
	          driverClassName="com.ibm.db2.jcc.DB2Driver"
	          factory="org.apache.commons.dbcp.BasicDataSourceFactory"
	          maxActive="20"
	          maxIdle="10"
	          maxWait="10000"
	          name="jdbc/testDS"
	          removeAbandoned="true"
	          removeAbandonedTimeout="300"
	          scope="Shareable"
	          testOnBorrow="true"
	          testWhileIdle="true"
	          type="javax.sql.DataSource"
	          url="jdbc:db2://localhost:50002/testdb"
	          username="test"
	          password="1"
	          validationQuery="values 1" />
Замечено что если удалить строку «factory=«org.apache.commons.dbcp.BasicDataSourceFactory»» то вероятность «испортить» поиск становится меньше единицы

ps. да я знаю что архитектуру сего беобразия нужно переделывать

★★☆

Ответ на: комментарий от ef37

шутишь? хранимки через хибер-то?

тс-у: могу только постоветовать самому написать свой менеджер конекшнов, который каждое соедениение будет создавать для каждого пользователя в thread local.

dizza ★★★★★
()

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html#Resource%20Defini...

У тебя же через пул сессий, т.е. сессии не сбрассываются.
Может дело в параметре scope?

Specify whether connections obtained through this resource manager can be shared. The value of this attribute must be Shareable or Unshareable. By default, connections are assumed to be shareable.

aydar ★★★★★
()
Ответ на: комментарий от dizza

>шутишь? хранимки через хибер-то?

Если их немного, то можно через NamedQuery

ef37 ★★
()
Ответ на: комментарий от dizza

>могу только постоветовать самому написать свой менеджер конекшнов, который каждое соедениение будет создавать для каждого пользователя в thread local.

Как вариант патчить org.apache.commons.dbcp.BasicDataSourceFactory на предмет принудительного закрытия сессии с БД перед возвратом в пул.

ef37 ★★
()
Ответ на: комментарий от aydar

имха scope связанно лмшь с менеджером ресурсов.

wfrr ★★☆
() автор топика

А если повесить листенер на веб-сессию (HttpSessionListener) и при создании чистить эти темповые таблицы (иногда хватает послать commit, если они созданы с опцией ON COMMIT DELETE ROWS), ну и настроить у HttpSession короткое время жизни (setMaxInactiveInterval)?

P.S. объекты взял из книги, на томкате писал только хеллоуворды )

aydar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.