连接池的实现方式是首先使用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=""
maxWait=""
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=; 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();
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 = ;
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();
}
id++;
rs.close();
st.close();
con.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return id;
} public static int updateTable(String sql)
{
int i = ;
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=;i<count;i++)
{
str[i] = rs.getString(i+);
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 = ;
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();
totalpage = rows/span;
if(rows%span!=)
{
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-)*span;
if(start!=)
{
rs.absolute(start);
}
int temp=;
while(rs.next()&&temp<span)
{
temp++;
String[] str = new String[count];
for(int i=;i<str.length;i++)
{
str[i] = rs.getString(i+);
//转码
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 = ;
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();
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==)
{//没有插入数据库
String msg = "对不起,注册失败,请重新注册!!!";
pageForward(msg,request,response);
}
else
{
String msg = "恭喜您,注册成功!!!";
pageForward(msg,request,response);
}

结果:

java使用数据库连接池的更多相关文章

  1. java配置数据库连接池的方法步骤

    java配置数据库连接池的方法步骤 java配置数据库连接池的方法步骤,需要的朋友可以参考一下   先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vecto ...

  2. Java第三方数据库连接池库-DBCP-C3P0-Tomcat内置连接池

    连接池原理 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去.我们可以通过设定连接池 ...

  3. Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...

  4. java实现数据库连接池

    package com.kyo.connection; import java.sql.Connection; import java.sql.DatabaseMetaData; import jav ...

  5. Java jdbc数据库连接池总结!(转)

    1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...

  6. 【Java】数据库连接池技术

    JDBC的问题 在程序中,我们经常要建立与数据库的连接,之后再关闭这个连接.我们知道,数据库连接对象的创建是比较消耗系统性能的,这些频繁的操作势必会消耗大量的系统资源.因此我们需要采用更高效的数据库访 ...

  7. java通过数据库连接池链接oracle

    开发工具:Eclipse J2EE 3.6 运行环境:jdk1.6 部署环境:Tomcat7 数据库连接池用的是dbcp,网上download下来的三个jar包. 把数据库连接池包和jdbc的包放到t ...

  8. java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...

  9. java之数据库连接池-dbcp&c3p0&dbutils

    介绍 因为数据库连接对象的创建比较消耗性能,所以可以在应用程序启动时就在内存中开辟一片空间(集合)存放多个数据库连接对象,后面需要连接时直接从该空间中取而不用新创建:使用完毕后归还连接(将连接重新放回 ...

  10. Java中数据库连接池原理机制的详细讲解

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...

随机推荐

  1. 任务43:Identity MVC:UI

    基于原来做的cookie认证的代码:MvcCookieAuthSample 增加登陆和退出的方法: 增加Login和SignIn这两个Action方法. 在Views下面创建Account文件夹,然后 ...

  2. HDU 1207 汉诺塔II (简单DP)

    题意:中文题. 析:在没有第四个柱子时,把 n 个盘子搬到第 3 个柱子时,那么2 ^ n -1次,由于多了一根,不知道搬到第四个柱子多少根时是最优的, 所以 dp[i] 表示搬到第4个柱子 i 个盘 ...

  3. 枚举与#define 宏的区别

    1),#define 宏常量是在预编译阶段进行简单替换.枚举常量则是在编译的时候确定其值.2),一般在编译器里,可以调试枚举常量,但是不能调试宏常量.3),枚举可以一次定义大量相关的常量,而#defi ...

  4. bzoj 3230: 相似子串【SA+st表+二分】

    总是犯低级错误,st表都能写错-- 正反分别做一遍SA,预处理st表方便查询lcp,然后处理a[i]表示前i个后缀一共有多少个本质不同的子串,这里的子串是按字典序的,所以询问的时候直接在a上二分排名就 ...

  5. TCP协议 三次握手四次挥手

    当某个应用端想基于TCP协议与另一个应用端通信时,它会发送一个通信请求. 这个请求必须被送到一个确切的地址.在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) ...

  6. git 项目切换分支 命令

    在项目开发总,一般都会用到git管理工具,有的公司可能还是用的svn:不管怎么样.用的顺手就行: 来说下git 的基本使用 git clone + 项目地址链接: 可以把项目克隆到本地: 然后一般顺序 ...

  7. C#语言开发规范-ching版

    拙劣之处请大家斧正,愚某虚心接受,如有雷同,不胜荣幸 C#语言开发规范 作者ching 1.  命名规范 a) 类 [规则1-1]使用Pascal规则命名类名,即首字母要大写. eg: Class T ...

  8. 「开源」目前见过的最好的开源OA产品

    这是我目前见过的最好的开源OA产品.功能完整,代码结构清晰.值得推荐. 1.项目介绍 oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目,mysql ...

  9. 力荐!35 个最好用的 Vue 开源库!

    无论是开发新手还是经验丰富的老手,我们都喜欢开源软件包.对于开发者来说,如果没有这些开源软件包,很难想象我们的生活会变得多么疲惫不堪,而且靠咖啡度日也会成为家常便饭.所幸的是,随着 Vue.js 和 ...

  10. scanf()和scanf_s()

    在最初的C语言中,原版的输入就是scanf("<格式化字符串>",<地址表>) ANSI C中没有scanf_s(),只有scanf(),scanf()在读 ...