现在Spring+Hibernate这对组合已经成为J2EE事实上的开发标准,而且J2EE程序一般都需要运行在J2EE应用服务器容器中。虽然我们可以使用Apache组织提供的DBCP数据库连接池访问数据库,但是一个更好的选择是使用应用服务器本身提供的数据库连接池。在开发环境中,我们使用Tomcat,生产环境中,则使用Weblogic、WebSphere等应用服务器。我的配置环境中,应用服务器的版本分别是Tomcat6.0,Weblogic9.2以及WebSphere6.1,数据库使用了derby。无论对于哪一种应用服务器,使用Spring+Hibernate连接JNDI数据源的配置步骤都是类似的,大致分为4步。
1、拷贝数据库驱动包到应用服务器的lib目录下。对于Tomcat,拷贝到tomcat\lib;对于Weblogic,拷贝到bea\user_projects\domains\base_domain\lib;对于WebSphere,拷贝到IBM\WebSphere\AppServer\lib。
2、配置数据源。对于Weblogic和WebSphere这两个商业应用服务器,它们都提供了交互方便的配置界面,网上这方面的资料也很多,按步骤配置就可以了。对于Tomcat,只要修改tomcat\conf\context.xml,增加以下内容即可。
- <Resource name="jdbc/testDS" auth="Container"
- type="javax.sql.DataSource" driverClassName="org.apache.derby.jdbc.ClientDriver"
- url="jdbc:derby://localhost:1527/testdb;create=true"
- username="user" password="pwd" maxActive="20" maxIdle="10"/>
<Resource name="jdbc/testDS" auth="Container" type="javax.sql.DataSource" driverClassName="org.apache.derby.jdbc.ClientDriver" url="jdbc:derby://localhost:1527/testdb;create=true" username="user" password="pwd" maxActive="20" maxIdle="10"/>
3、修改web.xml。实际上该步骤是可有可无的,但是J2EE标准建议开发者进行修改,对资源进行引用,增加以下内容即可。
- <resource-ref>
- <description>Test DataSource</description>
- <res-ref-name>jdbc/testDS</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
<resource-ref> <description>Test DataSource</description> <res-ref-name>jdbc/testDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
4、修改applicationContext.xml。对于Spring1.x版本,这样定义:
- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName">
- <value>java:comp/env/jdbc/testDS</value>
- </property>
- </bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/testDS</value> </property> </bean>
对于Spring2.x,Spring增加了一种新的定义方法:
- <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/testDS" />
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/testDS" />
再对Spring中的Hibernate配置进行修改,引用刚刚定义的dataSource。
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <!-- 其他参数省略 -->
- </bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 其他参数省略 --> </bean>
前面谈到第3步是可有可无的,以上是有第3步的配置。如果第3步未执行,那么对于Tomcat,仍然按照第4步一样的配置就可以。但是对于Weblogic和WebSphere,需要将java:comp/env/jdbc/testDS修改成jdbc/testDS。
在配置过程中,还发现一个问题:Spring如果需要两个或两个以上的配置文件,在Tomcat中的web.xml可以使用通配符,即
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath*:/appContext*.xml</param-value>
- </context-param>
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/appContext*.xml</param-value> </context-param>
但是在Weblogic和WebSphere中,不能使用通配符,只能一个个列举,待研究。
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath*:/appContext1.xml,classpath*:/appContext2.xml</param-value>
- </context-param>