又折腾了一上午,记得当初折腾过很久很久不知道多少次,上次在媳妇的提醒下成功了,却没有记录,这次一定要记录好了。嘿嘿。
如果数据库连接池仅仅是对特定的项目作用,则可以采用如下配置方案:
1、在自己的项目中的 META-INF 文件夹下面新建 context.xml,贴入类似如下代码:
<?xml version='1.0' encoding='utf-8'?>
<Context path="/tuanplus" docBase="tuanplus" debug="5"
reloadable="true" crossContext="true">
<Resource name="jdbc/tuanplus" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="root" password="fkeuggwn"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/tuanplus" />
</Context>
解释一下:
path:指定此数据源的作用地址,一般是自己项目的path
docBase:项目名称
name:此数据源的名称,以后java代码中获取数据源依据此名称
auth:未知作用,一般都指定Container,是容器的意思
type:无疑,javax.sql.DataSource
maxActive:最大活跃连接数,最多保持这么多连接
maxIdle:最大空闲连接数目,空闲连接大于此值的时候都会被close
maxWait:请求的最大等待时间
2、在 web.xml 中加入如下代码:
<resource-ref>
<description>Tuanplus JDBC</description>
<res-ref-name>jdbc/tuanplus</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
解释一下:
description:描述信息,相当于注释
res-ref-name:需要引入的连接池的名称,即 context.xml 中的 name.
res-type:依旧无疑,javax.sql.DataSource
res-auth:Container,容器
3、编写 java 代码,这里顺便引入一个我觉得比较不错的数据库操作的 Helper 类
Db.java
package com.tuanplus.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class Db {
private Connection conn;
/**
* 初始化操作,得到connection..
*/
public Db() {
try {
InitialContext ictx = new InitialContext();
Context envContext = (Context) ictx.lookup("java:/comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/tuanplus");
conn = ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 执行插入、更新、删除操作
*
* @param sql
* @param args
* @return
*/
public boolean update(String sql, Object... args) {
try {
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
if (ps.executeUpdate() < 1) {
return false;
}
} catch (SQLException e) {
e.printStackTrace();
}
return true;
}
/**
* 执行查询
*
* @param sql
* @param args
* @return
*/
public ResultSet query(String sql, Object... args) {
try {
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
return ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
构造函数中的内容即使通过连接池获取 connection 连接。
4、编写测试 JSP,需要注意的是,测试必须在服务器下进行。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.tuanplus.util.Db"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
Db db = new Db();
boolean i = db.update("INSERT INTO user VALUES(null,?,?,?)",
"mzule", "123456", "888888@qq.com");
%>
<%=i%>
</body>
</html>