Почему MyBatis закрывает сессии после выполнения каждого оператора? - PullRequest
1 голос
/ 07 марта 2012

Я использую MyBatis в Spring 3. Теперь я пытаюсь выполнить два следующих запроса:

SELECT SQL_CALC_FOUND_ROWS() * 
FROM media m, contract_url_${contract_id} c
WHERE m.media_id = c.media_id AND
    m.media_id = ${media_id}
LIMIT ${offset}, ${limit}

SELECT FOUND_ROWS()

, чтобы я мог получить общее количество строк первого запроса без выполнения count (*) дополнительно.

Однако второй всегда возвращает 1, поэтому я открыл журнал и обнаружил, что класс SqlSessionDaoSupport открывает соединение для первого запроса, закрывает его (тупо) и открывает новыйподключение для второго.

Как это исправить?

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Я не уверен, что мой ответ будет точным на 100%, поскольку у меня нет опыта работы с MyBatis, но похоже, что ваша проблема не совсем связана с этой структурой.

В общем, если вы не укажетекаким-то образом границы транзакций, каждый вызов API ORM или JDBC пружины будет выполняться в соединении, полученном для этого вызова из dataSource / connectionPool.

Вы можете использовать транзакции, чтобы убедиться, что вы остаетесь с тем же соединением, или управлять соединением вручную.Я рекомендую первый способ использования Spring db apis.

0 голосов
/ 26 марта 2013

надеюсь, это поможет

    @Resource
    public void setSqlSessionFactory(DefaultSqlSessionFactory sqlSessionFactory) {
      this.sqlSessionFactory = sqlSessionFactory;
    }

    SqlSession sqlSession = sqlSessionFactory.openSession();
    YourMapper ym = sqlSession.getMapper(YourMapper.class);

    ym.getSqlCalcFoundRows();
    Integer count = pm.getFoundRows();

    sqlSession.commit();
    sqlSession.close();
...