连接池的实现方式是首先使用JNDI(JavaTM Naming and Directory Interface) 将数据源对象注册为一个命名服务,然后使用JNDI提供的服务接口,按照名称检索对应的数据源。
查找数据源的方法:
1、创建一个命名服务环境(Context)。
2、利用该环境对象的lookup方法按名查询,得到相应数据源对象。
3、调用数据源对象的getConnection方法获取与数据库的连接。
第一步:Tomcat 安装目录下的conf的context.xml 的<Context></Context>中添加代码:
修改context.xml文件加入如下代码:
<Context>
<Resource
name="jdbc/cartds"
type="javax.sql.DataSource"
password=""
driverClassName="com.mysql.jdbc.Driver"
maxIdle="20"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/logistic"
/>
</Context>
第二步:
将相关的数据库驱动程序放置在项目中的lib文件夹中。例如:库包中mysql包,并加入libraries
第三步
配置web.xml文件
<!-- JNDI -->
<resource-ref>
<description>MySQL DB Connection Pool</description>
<res-ref-name>jdbc/cartds</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
红色字体与Java文件中的必需一致,编译时时通过这些描述符来实现映射
java:comp/env/jdbc/DBPool(虚地址) ------> 映射描述符 ------> jdbc/DBPool(实际的地址)
第四步
创建DBcart.java
package zyw;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Vector;
public class DBcart
{
//定义每页显示商品的数量
private static int span=2;
public static int getSpan()
{
return span;
}
public static void setSpan(int i)
{
span = i;
}
public static Vector<String> getInfo(String sql)
{
Vector<String> vclass = new Vector<String>();
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
Connection con=ds.getConnection();
//声明语句
Statement st = con.createStatement();
//执行语句得到结果集
ResultSet rs = st.executeQuery(sql);
while(rs.next())
{
String str = rs.getString(1);
str = new String(str.getBytes("ISO-8859-1"),"gb2312");
vclass.add(str);
}
//关闭结果集,语句
rs.close();
st.close();
//归还连接
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return vclass;
}
public static boolean isLegal(String sql)
{
boolean flag = false;
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
Connection con=ds.getConnection();
//声明语句
Statement st = con.createStatement();
//执行语句得到结果集
ResultSet rs = st.executeQuery(sql);
if(rs.next())
{
flag = true;
}
rs.close();
st.close();
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return flag;
}
public static int getID(String tname,String colname)
{
int id = 0;
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
Connection con=ds.getConnection();
//声明语句
Statement st = con.createStatement();
String sql = "select Max("+colname+") from "+tname;
//执行语句得到结果集
ResultSet rs = st.executeQuery(sql);
if(rs.next())
{
id = rs.getInt(1);
}
id++;
rs.close();
st.close();
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return id;
}
public static int updateTable(String sql)
{
int i = 0;
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
Connection con=ds.getConnection();
//声明语句
Statement st = con.createStatement();
//更新表
i = st.executeUpdate(sql);
//关闭语句
st.close();
//归还连接
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return i;
}
public static Vector<String[]> getInfoArr(String sql)
{
Vector<String[]> vtemp = new Vector<String[]>();
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
Connection con=ds.getConnection();
//声明语句
Statement st = con.createStatement();
//执行语句得到结果集
ResultSet rs = st.executeQuery(sql);
//获取结果集的元数据
ResultSetMetaData rsmt = rs.getMetaData();
//得到结果集中的总列数
int count = rsmt.getColumnCount();
while(rs.next())
{
String[] str = new String[count];
for(int i=0;i<count;i++)
{
str[i] = rs.getString(i+1);
str[i] = new String(str[i].getBytes("ISO-8859-1"),"gb2312");
}
vtemp.add(str);
}
rs.close();
st.close();
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return vtemp;
}
public static int getTotalPage(String sql)
{
int totalpage = 1;
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
Connection con=ds.getConnection();
//声明语句
Statement st = con.createStatement();
//执行语句得到结果集
ResultSet rs = st.executeQuery(sql);
rs.next();
//得到总记录条数
int rows = rs.getInt(1);
totalpage = rows/span;
if(rows%span!=0)
{
totalpage++;
}
//关闭结果集,语句
rs.close();
st.close();
//归还连接
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return totalpage;
}
public static Vector<String[]> getPageContent(int page,String sql)
{
Vector<String[]> vcon = new Vector<String[]>();
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
Connection con=ds.getConnection();
//声明语句
Statement st = con.createStatement();
//执行语句得到结果集
ResultSet rs = st.executeQuery(sql);
//获取结果集的元数据
ResultSetMetaData rsmt = rs.getMetaData();
//得到结果集中的总列数
int count = rsmt.getColumnCount();
int start = (page-1)*span;
if(start!=0)
{
rs.absolute(start);
}
int temp=0;
while(rs.next()&&temp<span)
{
temp++;
String[] str = new String[count];
for(int i=0;i<str.length;i++)
{
str[i] = rs.getString(i+1);
//转码
str[i] = new String(str[i].getBytes("ISO-8859-1"),"gb2312");
}
vcon.add(str);
}
//关闭结果集,语句
rs.close();
st.close();
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return vcon;
}
public static int getSelectId(String sql)
{
int id = 0;
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
Connection con=ds.getConnection();
//声明语句
Statement st = con.createStatement();
sql = new String(sql.getBytes(),"ISO-8859-1");
//执行语句得到结果集
ResultSet rs = st.executeQuery(sql);
rs.next();
id = rs.getInt(1);
rs.close();
st.close();
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return id;
}
public static boolean batchSql(String[] sql)
{
boolean flag = true;
Connection con = null;
try
{
//初始化上下文
Context initial = new InitialContext();
//其中mysql为数据源jndi名称
DataSource ds = (DataSource)initial.lookup("java:comp/env/jdbc/cartds");
//得到连接
con=ds.getConnection();
//禁用自动提交模式,并开始一个事务
con.setAutoCommit(false);
//声明语句
Statement st = con.createStatement();
for(String str:sql)
{
str = new String(str.getBytes(),"ISO-8859-1");
//添加批处理中的sql
st.addBatch(str);
}
//执行批处理
st.executeBatch();
//将事物提交
con.commit();
//恢复自动提交模式
con.setAutoCommit(true);
st.close();
}
catch(Exception e)
{
flag = false;
try
{
//事务回滚
con.rollback();
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
finally
{
try
{
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
return flag;
}
}
第五步
测试,核心代码
//插入用户注册信息
String temp = "insert into UserInfo(Uid,Uname,Upwd,Uemail) "+
"values("+uid+",'"+uname+"','"+fpwd+"','"+email+"')";
int i = DBcart.updateTable(temp);
if(i==0)
{//没有插入数据库
String msg = "对不起,注册失败,请重新注册!!!";
pageForward(msg,request,response);
}
else
{
String msg = "恭喜您,注册成功!!!";
pageForward(msg,request,response);
}
结果: