java使用数据库连接池
连接池的实现方式是首先使用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); }
结果:
分类:
开发语言 / Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
2017-08-01 php更改wampserver的站点目录