powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate+Oracle=много soft parse
25 сообщений из 30, страница 1 из 2
Hibernate+Oracle=много soft parse
    #37652281
stateistat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем в наличии систему Tomcat+Hibernate+Oracle. Все запросы вроде используют связанные переменные. При этом имеем для наших запросов в V$SQLAREA кол-во parse_calls=executions.
Трассирование показало, что в основном parse_calls идут в soft parse.

Классический

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
            stm = conn.prepareStatement(sql) ;
            for(int i = 0; i < 200; i++) {
	            stm.setLong(1, 101L);
	            stm.setLong(2, 102L);
                    rs = stm.executeQuery();
	            while (rs.next()) {
	                .....
	            }
            }



дает parse_calls+1 и executions+200.
Если закрывать коннект, имеем одинаковый прирост по обеим переменным.

Соответственно вопрос:
Можно как-то настроить hibernet на такой же результат? Как-то удерживать коннект между запросами в сервлете?
Насколько стоит обращать внимание на soft parse?
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37652301
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и soft parse, вроде, как раз и есть показатель того что квери не парсятся полностью, а используются те что парсились раньше.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37652308
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из простор интернетаIf an SQL statement is parsed in a cursor and then executed repeatedly without closing the cursor or parsing another statement in it, then the V$SQLAREA statistics will show many more EXECUTIONS than PARSE_CALLS for that statement. If statements are never reused, then EXECUTIONS and PARSE_CALLS are normally identical.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37653070
stateistat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понимаю, что PARSE_CALLS, это все запросы на парс стейтмента. Дальше начинаются варианты. Если в кэше есть аналогичный разобранный стейтмент, идет софт парс. Если нет, идет хард парс.
Если мы держим готовый ПрепередСтейтмент и только дергаем экзекьют, запрос на парс приходит только один, остальное идет в счетчик экзекьюшнс. Но, т.к. приходится использовать пул коннектов, готовый ПрепередСтейтмент не сохраняется и получается в итоге parse_calls=executions. Возникает вопрос, есть ли возможность как-то сохранять готовый ПрепередСтейтмент? Или может софт парс не та вещь на которой стоит заморачиваться? Стоит овчинка выделки, убрать даже софт парс?
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37653120
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stateistat,
а ты замерял тормоза без данного кэша?
Размер запросов небольшой, задержки по сети минимальные, оракл на такой запрос даст ответ из своего кэша.
?
______________________________________________
"Сделай настолько просто, насколько это возможно, но не проще". © А. Эйнштейн.
AutoPOI.ru — ГИС-технологии для Oracle
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37653401
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stateistatЯ так понимаю, что PARSE_CALLS, это все запросы на парс стейтмента. Дальше начинаются варианты. Если в кэше есть аналогичный разобранный стейтмент, идет софт парс. Если нет, идет хард парс.
Если мы держим готовый ПрепередСтейтмент и только дергаем экзекьют, запрос на парс приходит только один, остальное идет в счетчик экзекьюшнс. Но, т.к. приходится использовать пул коннектов, готовый ПрепередСтейтмент не сохраняется и получается в итоге parse_calls=executions. Возникает вопрос, есть ли возможность как-то сохранять готовый ПрепередСтейтмент? Или может софт парс не та вещь на которой стоит заморачиваться? Стоит овчинка выделки, убрать даже софт парс?
У вас реально есть причины предполагать, что soft parse является источником серьезных тормозов на проекте?
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37653874
stateistat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Нет. Просто попытки за что-то зацепиться. Рассматриваю варианты.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37653916
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stateistatНет. Просто попытки за что-то зацепиться. Рассматриваю варианты.
В трех-звенке, обычно, не задарживают курсоры и prepared statement на долго, потому что это сильно снижает масштабируемость.
Получил свободное соединение, создал statement - отправил запрос. По окончании транзакции, всё это барахло закрыл. Чем дольше транзакция, тем больше вероятность взаимных блокировок и других неприятностей при высоких нагрузках.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37653942
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stateistatРассматриваю варианты.
вариантов вроде не так много, ровно полтора
Чаще чем коннект-транзакция на реквест (веб) нет смысла.
Длиннее (на view) экзотика и надо обосновать.
Ещё вариант оптимизации - транзакцию открывать только на пишущие. На читающие не надо. Т.е. работать только с сессией хибера.
imho
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37653984
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Длиннее (на view) экзотика и надо обосновать.

Да-да. Надо запустить на тестах. Отследить все запросы хибера и конвертнуть их в хранимки.


Petro123Ещё вариант оптимизации - транзакцию открывать только на пишущие. На читающие не надо. Т.е. работать только с сессией хибера.
imho
А это как должно помочь? Чтение "без транзакции", приведет к тому же soft parse.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654012
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
ты меня не понял.
1. Я нашёл только один способ в вебе - все рессурсы ведут к HibernateFilter. Есть другие - напиши.
2. На чтении это просто лишнее действие - оверхед. (делать start transaction на SELECT).
Просто на это никто внимания не обращает.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654030
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro1231. Я нашёл только один способ в вебе - все рессурсы ведут к HibernateFilter. Есть другие - напиши.

ОК. Объясни идею плз. Что в нем делать-то?

Petro1232. На чтении это просто лишнее действие - оверхед. (делать start transaction на SELECT).
Просто на это никто внимания не обращает.
Почему не обращает? @Transactional(readOnly=true) и готово.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654060
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
типа такого - сам пока не проверял. Идея проста как 3 рубля - на несколько реквестов - одна сессия хибера (а-ля десктоп)
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
//фильтр
public class HibernateFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("Servlet Фильтр init, теперь Сеанс открытия/закрытия для каждого реквеста.");
    }
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        // получит текущую сессию.
        try {
            chain.doFilter(request, response);
            HibernateSessionController.commitTransaction();// Завершить любые транзакции, если открыты
        } catch (SessionManagementException sme) {
             log.error(sme);
        } finally { // закрыть по любому
            try {
                HibernateSessionController.closeSession();
            } catch (SessionManagementException sme) {
                 log.error(sme);
            }
        }
    }
    public void destroy() {}
}

//менеджер-класс:
public class HibernateSessionController {
    private static Log logger = LogFactory.getLog(HibernateSessionController.class);
    private static Configuration configuration;
    private static SessionFactory sessionFactory;
    private static final ThreadLocal threadSession = new ThreadLocal();
    private static final ThreadLocal threadTransaction = new ThreadLocal();
    private static final ThreadLocal threadInterceptor = new ThreadLocal();
    // создать Default SessionFactory 
    static {
        try {
            configuration = new Configuration();
            sessionFactory = configuration.configure().buildSessionFactory();
        } catch (Throwable ex) {
            logger.error("Building SessionFactory failed.", ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    /**
     * Returns the SessionFactory used for this static class.
     *
     * @return SessionFactory
     */
    public static SessionFactory getSessionFactory() {
        /* Instead of a static variable, use JNDI:
        SessionFactory sessions = null;
        try {
            Context ctx = new InitialContext();
            String jndiName = "java:hibernate/HibernateFactory";
            sessions = (SessionFactory)ctx.lookup(jndiName);
        } catch (NamingException ex) {
            throw new InfrastructureException(ex);
        }
        return sessions;
        */
        return sessionFactory;
    }

    /**
     * Returns the original Hibernate configuration.
     *
     * @return Configuration
     */
    public static Configuration getConfiguration() {
        return configuration;
    }

    /**
     * Rebuild the SessionFactory with the static Configuration.
     *
     */
     public static void rebuildSessionFactory()
        throws SessionManagementException {
        synchronized(sessionFactory) {
            try {
                sessionFactory = getConfiguration().buildSessionFactory();
            } catch (Exception ex) {
                throw new SessionManagementException(ex);
            }
        }
     }

    /**
     * Rebuild the SessionFactory with the given Hibernate Configuration.
     *
     * @param cfg
     */
     public static void rebuildSessionFactory(Configuration cfg)
        throws SessionManagementException {
        synchronized(sessionFactory) {
            try {
                sessionFactory = cfg.buildSessionFactory();
                configuration = cfg;
            } catch (Exception ex) {
                throw new SessionManagementException(ex);
            }
        }
     }

    /**
     * Retrieves the current Session local to the thread.
     * <p/>
     * If no Session is open, opens a new Session for the running thread.
     *
     * @return Session
     */
    public static Session getCurrentSession()
        throws SessionManagementException {
        Session s = (Session) threadSession.get();
        try {
            if (s == null) {
                logger.debug("Opening new Session for this thread.");
                if (getInterceptor() != null) {
                    if (logger.isDebugEnabled())
                        logger.debug("Using interceptor: " + getInterceptor().getClass());
                    s = getSessionFactory().openSession(getInterceptor());
                } else {
                    s = getSessionFactory().openSession();
                }
                threadSession.set(s);
            }
        } catch (HibernateException ex) {
            throw new SessionManagementException(ex);
        }
        return s;
    }

    /**
     * Closes the Session local to the thread.
     */
    public static void closeSession()
        throws SessionManagementException {
        try {
            Session s = (Session) threadSession.get();
            threadSession.set(null);
            if (s != null && s.isOpen()) {
                if (logger.isDebugEnabled())
                    logger.debug("Closing Session of this thread.");
                s.close();
            }
        } catch (HibernateException ex) {
            throw new SessionManagementException(ex);
        }
    }
}


2. я говорил о hibernateSession.beginTransaction(); Если от аннотации тот же эффект, то ОК
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654106
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
по поводу п.2
Тут надо автора спросить, каким методом он их там стартует.
Если JPA-аннотации то там "такие камни есть"

Проблемы с флагом read-only аннотации @Transactional
http://www.k-press.ru/cs/2009/1/ts/ts.asp#ID0ESG
хотя может и "боян".
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654162
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123 Проблемы с флагом read-only аннотации @Transactional
http://www.k-press.ru/cs/2009/1/ts/ts.asp#ID0ESG

Спасибо! Эта статья как-то прошла мимо меня.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654190
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор http://www.k-press.ru/cs/2009/1/ts/ts.asp#ID0ESG

О, спасибо за инфу, весьма любопытно
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654211
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор http://www.k-press.ru/cs/2009/1/ts/ts.asp#ID0ESG
О, спасибо
я боюсь, что она разочарует любителей аннотаций-транзакций.
Слишком много там тонкостей и частностей в данном методе.
Ничего личного (с), я все модели транзакций люблю :)
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654234
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123я боюсь, что она разочарует любителей аннотаций-транзакций.
Слишком много там тонкостей и частностей в данном методе.
Ничего личного (с), я все модели транзакций люблю :)
Во-первых всё сильно зависит от того как реализован менеджер транзакций. Во-вторых статья показывает очевидное превосходство Spring над JEE. В спринг, я всегда могу пойти и посмотреть что делает менеджер. :)

Но дефолтное поведение, действительно, не тривиальное. Надо бы на новых версиях потестить.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654265
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВо-первых всё сильно зависит от того как реализован менеджер транзакций. Во-вторых статья показывает очевидное превосходство Spring над JEE. В спринг, я всегда могу пойти и посмотреть что делает менеджер. :)

Но дефолтное поведение, действительно, не тривиальное. Надо бы на новых версиях потестить.

Ну я особых преимуществ у Spring не заметил, почти все описанные проблемы тривиально отлавливаются при помощи тестирования, что меня реально удивило так это поведение флага readonly, на практике редко встречался с ним, и скорее всего наткнулся бы на грабли
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654537
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-вторых статья показывает очевидное превосходство Spring над JEE.

А в каких местах функциональность спринга пересекается с функциональностью JEE?
Spring transactions это же просто обертка над JTA.
Соотношение как между Ubuntu и Bolgenos.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654545
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪSpring transactions это же просто обертка над JTA.


http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/transaction/support/AbstractPlatformTransactionManager.html Direct Known Subclasses:
CciLocalTransactionManager,
DataSourceTransactionManager,
HibernateTransactionManager,
JdoTransactionManager,
JmsTransactionManager,
JpaTransactionManager,
JtaTransactionManager,
TopLinkTransactionManager
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654859
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, мне очень не нравится использование слова TransactionManager в этих классах. Термин Transaction Manager определен в стандарте http://en.wikipedia.org/wiki/X/Open_XA за 20 лет до появления спринга и имеет четкое значение. Зачем надо было переопределять термин внутри спринга, мне неясно.
Во-вторых, что на самом деле делают эти классы?
1)Заменяют try/finally лапшу на transactionTemplate.execute(new TransactionCallback(){public void doInTransaction()...} лапшу.
2)Использует для передачи переменной, в которой хранится текущая транзакция, динамический скоупинг вместо лексического ( http://en.wikipedia.org/wiki/Scope_%28computer_science%29).
Можно считать, что это удобно, можно считать, что нет. В любом случае, это не технология, а простейшая обертка над API. Любой программист напишет такую без проблем за минимальное время. Скорее всего, получится даже лучше(проще и понятнее).
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654881
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪМожно считать, что это удобно, можно считать, что нет. В любом случае, это не технология, а простейшая обертка над API. Любой программист напишет такую без проблем за минимальное время. Скорее всего, получится даже лучше(проще и понятнее).Старая песня - "лушче написать свое". Вы там случаем свой аппликейшн сервер не написали еще? А то, мало ли - вдруг вам какая-нибудь аббревиатура или имя класса в существующих не нравятся
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654912
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йуный джавистЪ,
ну, тут тебя в сторону повело :).
На критику декларативного управления транзакций :)
Это же оффтоп.
А многословность многочисленных обёрток в Java действительно есть. Мне вот, 3 буквы у спрингMVC не нравятся.
Но ведь одно другому не мешает? ;)
С помощью Хибер-утилиту пожно писать одной строкой.
ЗЫ
Понятие менеджер или хелпер можно натянуть на что угодно.
...
Рейтинг: 0 / 0
Hibernate+Oracle=много soft parse
    #37654970
Йуный джавистЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я в этом треде не собирался ничего критиковать. Просто не понимаю, как можно сравнивать Spring и JEE.
В JEE есть очередь сообщений, вебсервер, менеджер транзакций - в Spring нет ничего из этого.
Пересечение есть только по JSF и Spring MVC.
WebSphereMQ уходит корнями в 70-е. Технология существует 40 лет и будет существовать еще столько же без проблем.
Цикл жизни какого-нибудь спринга - несколько лет. Откройте гитхаб - там этих спрингов тысячи. Завтра какой-нибудь Вася наведет хайп вокруг своего поделия, и все бросятся его внедрять в свои проекты. Ну например, сейчас json обороты набирает. В новом DI контейнере можно будет делать конфигурацию через json, это так современно и круто!
Был EJB CMP, стал гибернейт.
Были container-managed transactions, стали spring declarative transactions.
И т.д.
При этом программист ставится в положение идиота. Все время надо изучать какие-то новые дебильные апи, которые делают то же что и старые, только с учетом тараканов в голове их создателя. Это на фоне того что ключевые технологии не меняются по 30 лет.
Когда крупный вендор объявляет смену технологии, то да, тут ничего не поделаешь, придется переучиваться. Но добровольно самим раз в несколько лет находить какую-нибудь новую волшебную библиотеку, внедрять ее, потом через несколько лет опять все переписывать - это выше моего понимания.
Еще, кстати, из-за того что надо изучать какой-нибудь новый хибернейт, нет времени изучить фундаментальные технологии.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate+Oracle=много soft parse
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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