创建预准备语句时导致Spring 1.2 NullPointerException的原因是什么?

时间:2009-10-08 19:59:37

标签: java spring jdbc

使用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 个答案:

答案 0 :(得分:3)

这与Spring无关。

DataSource.getConnection()永远不应该返回null;它应返回有效连接或抛出SQLException。该错误是由oracle.jdbc.pool.OracleDataSource行为不端引起的。

<强>更新

根据Oracke documentation,这发生在:

  • 已在池中分配了最大连接数;
  • ConnectionWaitTimeout已设置为非零值
  • 您一直在等待getConnection()这段时间,并且没有任何连接返回到池中。

所以考虑到这一点,你可以:

  1. 检查您的代码以确保没有连接泄漏
  2. 增加泳池大小
  3. 增加连接等待超时
  4. 使用不同的池:-)或在OracleDataSource周围编写一个简单的包装器,它将检查返回的'null'并改为抛出SqlException。
  5. 在最后一个场景中,你只会为另一个例外交易一个例外(NPE - > SqlException)。当然,它会更合适,但它并不能解决问题。

答案 1 :(得分:0)

public PreparedStatement createPreparedStatement(Connection con) throws SQLException {

正如您所看到的,签名采用了像ChssPly76这样的Connection对象,并且无法找到它。