我编写了一个使用 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-lookup
行servlet-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;
}
}