Что вызывает исключение Spring 1.2 NullPointerException при создании подготовленного оператора? - PullRequest
2 голосов
/ 08 октября 2009

Использование Spring 1.2.1 и oracle.jdbc.pool.OracleDataSource 10.2.0.3.0 Иногда я получаю трассировку стека, как показано ниже. Я думаю, что это вызвано тем, что пул соединений переполнен. Кто-нибудь знает причину наверняка? Кроме того, более новые версии Spring или Oracle JDBC справляются с этим лучше?

java.lang.NullPointerException
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:213)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:444)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:491)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:522)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:543)
    at org.springframework.jdbc.object.SqlQuery.execute(SqlQuery.java:114)
    at org.springframework.jdbc.object.SqlQuery.execute(SqlQuery.java:124)
    at sps.wfds.biz.glacier.MemberDAO.create(MemberDAO.java:44)
    at sps.wfds.biz.glacier.MemberDAO.create(MemberDAO.java:23)
    at sps.wfds.biz.glacier.AbstractDAO.createAndValidate(AbstractDAO.java:22)
    at sps.wfds.web.interceptor.AbstractPrincipal.init(AbstractPrincipal.java:87)
    at sps.wfds.web.interceptor.AbstractPrincipal.getAttributes(AbstractPrincipal.java:66)
    at sps.wfds.web.interceptor.AbstractPrincipal.getAttribute(AbstractPrincipal.java:60)
    at sps.wfds.web.interceptor.AbstractPrincipal.setLocale(AbstractPrincipal.java:38)
    at sps.wfds.web.util.LocaleUtil.setLocale(LocaleUtil.java:24)
    at sps.wfds.web.interceptor.SSOPrincipal.(SSOPrincipal.java:22)
    at sps.wfds.web.interceptor.SSOAuthority.getPrincipal(SSOAuthority.java:18)
    at sps.wfds.web.interceptor.Authorization.preHandle(Authorization.java:44)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:674)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625)
    at org.springframework.web.servlet.FrameworkServlet.serviceWrapper(FrameworkServlet.java:386)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:346)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)

Ответы [ 2 ]

3 голосов
/ 09 октября 2009

Это не имеет ничего общего с Spring.

DataSource.getConnection() никогда не должен возвращать ноль; он должен либо вернуть действительное соединение, либо выдать SQLException. Ошибка вызвана неправильным поведением oracle.jdbc.pool.OracleDataSource.

Обновление

Согласно документации Oracke это происходит, когда:

  • максимальное количество соединений уже выделено в пуле;
  • ConnectionWaitTimeout установлено в ненулевое значение
  • вы ожидали getConnection () в течение этого времени, и в пул не было возвращено ни одного соединения.

Итак, помня об этом, вы можете:

  1. Проверьте код, чтобы убедиться в отсутствии утечки соединения
  2. Увеличение размера пула
  3. Увеличьте время ожидания соединения
  4. Используйте другой пул :-) или напишите простую оболочку вокруг OracleDataSource, которая проверит возвращаемое значение 'null' и выдаст вместо этого SqlException.

В этом последнем сценарии вы будете обменивать только одно исключение на другое (NPE -> SqlException). Конечно, это будет более уместно, но на самом деле это не решит проблему.

0 голосов
/ 09 октября 2009
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {

Как видите, подпись берет объект Connection, как сказал ChssPly76, и не может его найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...