0

我编写了一个使用 Spring MVC 库和 Spring JDBC 连接到 Oracle DB 的 Web 应用程序。(我不使用任何 ORM 类型库,因为我在 Oracle 上创建存储过程来完成我的工作,我对此非常满意。)我使用由 Tomcat 容器管理的 Oracle 连接池

顺便说一句,该应用程序通常工作得很好!

但是...我注意到前几天我尝试在另一个 Tomcat 实例上设置应用程序时忘记配置连接池,显然应用程序无法获取 org.apache.commons.dbcp.BasicDataSource 对象,所以它崩溃了。

我在 tomcat“ context.conf ”中定义了池参数

在我的“ web.xml ”中,我有:

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/Spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <!-- Map *everything* to appServlet -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

<resource-ref>
    <description>Oracle Datasource example</description>
    <res-ref-name>jdbc/ora1</res-ref-name>
    <res-type>org.apache.commons.dbcp.BasicDataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

我有一个 Spring“ servlet-context.xml ”,其中 JNDI 用于将连接池提供的数据源对象映射到 ID 为“dataSource”的 Spring bean:

<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ora1"
    resource-ref="true" />

问题来了:我在哪里捕获由于某种原因无法访问数据库的情况?

我不希望用户在他们的浏览器中看到一码半的 Java 堆栈跟踪,而是一条更好的消息,告诉他们存在数据库问题等。似乎我的应用程序试图配置“dataSource” “ bean(在“servlet-context.xml”中)在任何代码测试之前它实际上可以从池中提供一个 dataSource 对象?!

也许我没有完全理解应用程序启动的这些阶段到底发生了什么......

感谢您的任何建议!

更新:已修复!让 Spring 配置 MVC 的东西,但通过 Controller 获取数据源

我从文件中取出这一jndi-lookupservlet-context.xml,并在下面添加了另一个类。当我想连接数据库并需要数据源时,我从我的 Controller 中调用了 getJndiDataSource 方法,捕获了在获取和使用数据源对象时出现的所有错误。

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.sql.DataSource;

public class DataSrcConfig {

   public static DataSource getJndiDataSource() throws NamingException{

       Context initialContext = new InitialContext();
       DataSource ds = (DataSource)initialContext.lookup("java:comp/env/jdbc/ora1");

       return ds;
   }
}
4

1 回答 1

0

我有一些建议:

  1. 您是否尝试过在 Spring 而不是在 Tomcat 中定义数据源对象?这样您就可以将所有配置参数放在一个地方。

  2. 您是否使用 DBCP 上的validationQuery来测试连接?

  3. 如果有 StackTrace,你能抓住它并显示更友好的消息吗?

(另外,看看BoneCP,它是一种更快的池实现)。

于 2012-04-02T14:04:24.223 回答