我这里以druid数据连接池作为案例,其他的连接池也差不多
1.首先去maven仓库下载 druid 和 log4j 的jar包,添加到项目的WEB-INF目录下的lib包中并手动右键点击添加到库
2.进入自己的 Tomcat的conf目录下的context.xml和web.xml 进行如下配置:
context.xml配置如下:
<!-- 使用阿里巴巴的DruidDataSource配置针对Oracle数据库的JNDI数据源 --> <Resource name="jdbc/OracleDataSource" factory="com.alibaba.druid.pool.DruidDataSourceFactory" auth="Container" type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:xe" username="JH" password="123456" maxActive="50" maxWait="10000" removeabandoned="true" removeabandonedtimeout="60" logabandoned="false" filters="stat"/>
web.xml配置如下:
<!-- druid监控配置 --> <servlet> <servlet-name>DruidStatView</servlet-name> <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> <init-param> <!-- 允许清空统计数据 --> <param-name>resetEnable</param-name> <param-value>true</param-value> </init-param> <init-param> <!-- 用户名 --> <param-name>loginUsername</param-name> <param-value>admin</param-value> </init-param> <init-param> <!-- 密码 --> <param-name>loginPassword</param-name> <param-value>123456</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DruidStatView</servlet-name> <url-pattern>/druid/*</url-pattern> </servlet-mapping>
3.进入自己的web项目下找到 WEB-INF目录下的web.xml 进行配置:
<!-- JNDI配置的资源引用: res-ref-name:表示引用资源的名称,和前面tomcat连接池配置那保持一致 res-type:此资源对应的类型为javax.sql.DataSource res-auth:容器授权管理 --> <resource-ref> <description>Oracle DB Connection</description> <res-ref-name>jdbc/OracleDataSource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
4.编写连接池工具类
import com.alibaba.druid.pool.DruidDataSource; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @author JH_Y * @version 1.0 * 从JNDI容器中获取DataSource,再通过DataSource获取数据库连接 */ public class ConnectPoolUtil { /* web.xml文件中的JNDI数据源引用配置 <resource-ref> <description>Oracle DB Connection</description> <res-ref-name>jdbc/OracleDataSource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> */ /** * Oracle数据库配置的JNDI数据源连接名,后面跟的是DataSource名, DataSource名在web.xml文件中的<res-ref-name></res-ref-name>进行了配置 */ private static final String ORACLE_DB_JNDINAME = "java:comp/env/jdbc/OracleDataSource"; private static DruidDataSource dsOracle = null; static{ try { //1、初始化名称查找上下文 Context ctx = new InitialContext(); //2、通过JNDI名称找到DataSource dsOracle = (DruidDataSource) ctx.lookup(ORACLE_DB_JNDINAME); } catch (NamingException e) { e.printStackTrace(); } } /** * Description: 获取Oracle数据库连接 */ public static Connection getOracleConnection() throws SQLException { return dsOracle.getConnection(); } /** * 要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象 */ public static void release(ResultSet rs, Statement st,Connection conn){ if(rs!=null){ try{ rs.close(); }catch (Exception e) { e.printStackTrace(); } rs = null; } if(st!=null){ try{ st.close(); }catch (Exception e) { e.printStackTrace(); } } if(conn!=null){ try{ conn.close(); }catch (Exception e) { e.printStackTrace(); } } } public static void release(Statement st,Connection conn){ release(null,st,conn); } }
附带提一下:
在用JNDI连接数据库时用main函数测试时总报错,是因为 InitialContext 是要在应用服务器的上下文里才有的。所以不能用main函数直接测试,只能放到tomcat或者servlet、jsp进行测试。