Spring管理的数据源中的connection.createStatement永远不会返回

时间:2014-05-22 17:44:19

标签: mysql spring jersey tomcat7 jndi

这在我的RESTful WS开发中非常奇怪。我正在使用Tomcat 7和Jersey 1.8,Spring 2.5和MySQL数据库。

我定义了两个这样的数据源:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
  <property name="jndiName" value="jdbc/MAINDB" />
  <property name="resourceRef" value="true" />
</bean>
<bean id="orderDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
  <property name="jndiName" value="jdbc/ORDERS" />
  <property name="resourceRef" value="true" />
</bean>

并将一个数据源注入servlet上下文,如下所示:

<bean class="org.springframework.web.context.support.ServletContextAttributeExporter">
  <property name="attributes">
    <map>
      <entry key="orderData">
        <ref bean="orderDataSource" />
      </entry>
    </map>
  </property>
</bean>

和这段代码:

orderDataSource = (DataSource) sc.getServletContext().getAttribute("orderData");
Order ord = new Order();
Statement stmt = null;
try {
    stmt = orderDataSource.getConnection().createStatement();
} catch (SQLException ex) {
    Logger.getLogger(OrdersResource.class.getName()).log(Level.SEVERE, null, ex);
}

执行6或7次完美无缺,并且从第8个请求开始,它在createStatement()行停止并且永远不会返回或抛出任何异常!

但是,MAINDB中的所有其他资源API仍能正常运行。

任何人都知道发生了什么?

1 个答案:

答案 0 :(得分:0)

你为什么要自己打扰这些代码?如果您已经使用Spring,请改用JdbcTemplate。它可以使用您的DataSource进行初始化,并为您管理所有这些内容。

您需要从池中进行连接,但是您从不关闭它(实际上对于语句也是如此)。使用JdbcTemplate可以防止您首先遇到这些问题。

这样的东西
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute(...)

有关详细信息,请参阅the javadoc