问题描述
根据网上资料成功配置了tomcat的数据库连接池具体方法:1.把数据库JDBC驱动拷贝到%TOMCAT_HOME%/common/lib和%TOMCAT_HOME%/webapps/yourweb/WEB-INF/lib下2.%TOMCAT_HOME%/conf/catalina/localhost/yxkh.xml如下<Context path="/yxkh" docBase="d:projectjspAssessSysWebContent" reloadable="true"> <Resource name="jdbc/teradataDB" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="10" maxWait="1000" username="xx" password="xx" driverClassName="com.ncr.teradata.TeraDriver" url="jdbc:teradata://xx.xx.xx.xx/CLIENT_CHARSET=cp936,TMODE=TERA,CHARSET=ASCII,database=DW_PTEMP" /></Context>3.web.xml添加<resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/teradataDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth></resource-ref>4. 然后在jsp调用javax.naming.Context context = new javax.naming.InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource)context.lookup("java:comp/env/jdbc/teradataDB"); java.sql.Connection conn = ds.getConnection(); 能够成功打开数据库连接。现在我的想法spring注入,避免在程序中出现javax.naming.Context context = new javax.naming.InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource)context.lookup("java:comp/env/jdbc/teradataDB"); 不知应该怎么配置,怎么使用,由于对spring不太熟悉,还望指教。谢谢!补充:再次查找了网上资料,应该如下来配置bean xml<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName"> <value>java:comp/env/jdbc/TeradataDB</value> </property> </bean>如果是正确的,在jsp中应该如何调用呢?问题补充:to zhai puhong (高级程序员)感谢你的回复。你的意思spring配置一个bean就是数据库连接池了吗?<bean id="dbConn" class="yxkh.common.TeradataConnection"><property name="dataSource" ref="dataSource" /></bean>package yxkh.common;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class TeradataConnection {private static Log log = LogFactory.getLog(TeradataConnection.class); private DataSource dataSource; public TeradataConnection() {}public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}public DataSource getDataSource() {return dataSource;} public Connection getConnection() {Connection conn = null;try {conn = dataSource.getConnection();} catch (SQLException e) {log.error("连接数据库失败", e);} return conn;}}然后在jsp中,如下使用吗?ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");TeradataConnection db = (TeradataConnection ) ctx.getBean("dbConn");db.getConnection();
解决方案
你这样配置应该是没有问题的。但是你是想jsp中或许数据源取得连接(Connection)吗,如果是这样,你就是绕开Spring和Hibernate直接和数据库打交道了,如果这样你可以自己写个jta来管理数据库事务。不过这种做法本身就是有问题的,既然用了Spring,有何苦在jsp搞那么“丑陋”的代码呢;还有,使用Spring,完全可以这么配置数据源:<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="xx.xx.xx.DBDriver"/> <property name="url" value="xxxxxxx"/> <property name="username" value="xxxxx"/> <property name="password" value="xxxxx"/> <property name="maxActive" value="100"/> <property name="maxIdle" value="30"/> <property name="maxWait" value="1000"/> <property name="defaultAutoCommit" value="true"/> <property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" value="60"/> <property name="logAbandoned" value="true"/> </bean>把一切都交给Spring,这样移植也方便的多。我只是提个建议。
解决方案二:
再补一个上面的,你要自己写个ContextLoaderListener如下: public class SpringContextLoaderListener extends ContextLoaderListener { public static ApplicationContext applicationContext=null; public static ApplicationContext applicationContext=null;@Overridepublic void contextInitialized(ServletContextEvent event) {super.contextInitialized(event);//你applicationContext就是spring ioc容器了applicationContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()).getBean(name);}}
解决方案三:
你的dataSource已经在spring ioc容器里了,如果你要调要jdbc的话,继承JdbcDaoSupport写一个类,然后配置到spring ico容器里面如: <bean id="testJdbcDAO" class="com.test.TestJdbcDAO" > <property name="dataSource" ref="dataSource" /> </bean> 在JSP中用spring提供的WebApplicationContextUtils类调用ioc 容器里的对像如: TestJdbcDAO testDAO= WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()).getBean("testJdbcDAO") testDAO.test();当然如果你的DAO要支持事务的话,还要配置一下事务管理器