定义数据源的可移植方法是使用资源引用。资源引用使您能够定义相对于应用程序命名上下文 () 的数据源的 JNDI 名称,然后将该逻辑引用映射到应用程序服务器中定义的物理资源,其 JNDI 名称是应用程序服务器供应商专有的。此方法使您的代码和程序集能够移植到任何兼容的应用程序服务器。java:comp/env
步骤 1:声明和查找资源引用
备选案文1
这可以通过在 Web 部署描述符中声明一个 () 来完成:resource-ref
WEB-INF/web.xml
<resource-ref>
<description>My Data Source.</description>
<res-ref-name>jdbc/MyDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
在您的代码中,您可以使用 JNDI 名称查找此资源:java:comp/env/jdbc/MyDataSource
dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDataSource");
无论应用程序部署在哪个服务器,此 JNDI 名称都不会更改。
备选案文2
或者,从 Java EE 5 (Servlet 2.5) 开始,使用@Resource
注释,可以在代码中更轻松地完成此操作。这消除了在 Web 部署描述符 (web.xml) 中配置 resource-ref 的需要,并且不需要执行显式 JNDI 查找:
public class MyServlet extends HttpServlet {
@Resource(name = "jdbc/MyDataSource")
private DataSource dataSource;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// dataSource may be accessed directly here since the container will automatically
// inject an instance of the data source when the servlet is initialized
}
此方法具有与上一个选项相同的结果,但减少了程序集中的样板代码和配置。
步骤 2:将资源引用映射到数据源
然后,您需要使用应用程序服务器的专有方法将资源引用映射到您在服务器上创建的物理数据源,例如,使用 JBoss 的自定义部署描述符 ():WEB-INF/jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<resource-ref>
<res-ref-name>jdbc/MyDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<jndi-name>java:/MyDataSource</jndi-name>
</resource-ref>
</jboss-web>
或者,例如,使用Tomcat的:context.xml
<Resource name="jdbc/MyDataSource" . . . />