如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?

【脑电信号处理与特征提取】P2-夏晓磊:脑电的神经起源与测量 ElectroEncephaloGraphyTherefore, EEG produces a graphed representation of the electrical activity occurring in a person’s brain.(把一个人的大脑中的电活动画出来)脑电头皮表面记录到的大脑活动产生的电信号(微伏)。(记录位置:硬脑膜/大脑皮层表面- ECoG,神经元群- LFP与MUR/MUA:活动位置:心电、眼电、肌电等)脑电图电压随时间变化的波形图。 阅读详情

DBCP是tomcat中的一个工具类。

DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。

DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?

 

DBCP数据库连接池操作如下:

1、导入驱动jar包(dbcp连接池jar包通常依赖于pool包一起使用)

原理:dbcp包会产生许多个连接对象,这些对象供pool包进行统一管理。

如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?

 

如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?

 

2、创建数据库工具类:DBUtils.java

工具类优点:

  • 1、提高性能

告别传统方式每次连接数据库都要进行创建并关闭,严重影响性能,使用数据库连接池DBCP技术实现连接池中存放多个连接对象供使用。当不需要连接时,将连接对象存放到池中即可,提高性能!

  • 2、避免多线程访问连接对象混乱问题

将连接保存在ThreadLocal类中,相当于map结构,它是将当前线程对象作为key,保存连接conn对象,避免多线程访问业务层和dao层导致使用的conn连接对象不一致问题。先从threadLocal中获取连接,如果连接为null,从连接池获取连接,设置到threadLocal中。

  • 3、将提交和回滚事务统一处理

先从ThreadLocal类中获取连接,如果连接不为null,提交或者回滚事务,然后关闭连接,清理当前线程所绑定的连接。

  • 4、方便关闭连接

关闭除过conn连接对象的其他对象statement、resultset等。

DBCP核心设置代码如下:

	// 创建数据库连接池
		ds = new BasicDataSource();
		// 设置连接信息
		ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
		ds.setUrl(URL);
		ds.setUsername(USERNAME);
		ds.setPassword(PASSWORD);

		// 设置连接池信息
		// 最大空闲连接数
		ds.setMaxIdle(30);
		// 最小空闲连接数
		ds.setMinIdle(2);
		// 设置初始连接数
		ds.setInitialSize(2);
		// 创建连接时最大等待时间
		ds.setMaxWaitMillis(4000);// 毫秒
		// 从数据源中拿到的连接,关闭其自动提交的事务
		ds.setDefaultAutoCommit(false);

完整代码如下:

package com.yueqian.store.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;

public class DBUtils {
	private static final String URL = "jdbc:mysql://127.0.0.1:3306/store?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
	private static final String USERNAME = "root";
	private static final String PASSWORD = "root";
	private static final BasicDataSource ds;
	static {
		// 加载驱动
		try {
			// 方式一
			DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
			// 方式二 根据传入字符串形式的类名加载该类 (加载类时调用静态代码块加载驱动)
			// Class.forName("com.mysql.cj.jdbc.Driver()");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 创建数据库连接池
		ds = new BasicDataSource();
		// 设置连接信息
		ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
		ds.setUrl(URL);
		ds.setUsername(USERNAME);
		ds.setPassword(PASSWORD);

		// 设置连接池信息
		// 最大空闲连接数
		ds.setMaxIdle(30);
		// 最小空闲连接数
		ds.setMinIdle(2);
		// 设置初始连接数
		ds.setInitialSize(2);
		// 创建连接时最大等待时间
		ds.setMaxWaitMillis(4000);// 毫秒
		// 从数据源中拿到的连接,关闭其自动提交的事务
		ds.setDefaultAutoCommit(false);
	}

	// 定义连接保存在ThreadLocal类中,将当前线程对象作为key,保存连接conn对象,避免多线程访问业务层和dao层导致使用的conn连接不一致问题
	// service里绑定每个线程对象的连接,调用的dao层获取该处理线程对象的连接
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();

	/**
	 * 连接数据库
	 * 
	 * @return
	 */
	public static Connection getConnection() {
		//先从threadLocal中获得连接,threadLocal类似map存放,ThreadLocal中是以键为当前线程对象,值为conn连接存放的。
		Connection conn = threadLocal.get();
		//如果连接为null,从连接池中获取连接
		if (conn == null) {
			try {
				conn = ds.getConnection();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//将得到的连接设置到threadLocal中
			threadLocal.set(conn);
		}
		return conn;
	}

	/**
	 * 关闭连接
	 * 
	 * @param rs
	 * @param stmt
	 * @param conn
	 */
	public static void close(ResultSet rs, Statement stmt) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				if (stmt != null) {
					try {
						stmt.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}

	// 提交事务
	public static void commit() {
		Connection conn = threadLocal.get();
		if(conn != null){
			try {
				conn.commit();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally {
				//关闭连接
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//清理当前线程所绑定的连接
				threadLocal.remove();
			}
		}
	}

	// 回滚事务
	public static void rollback() {
		Connection conn = threadLocal.get();
		if(conn != null){
			try {
				conn.rollback();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally {
				//关闭连接
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//清理当前线程所绑定的连接
				threadLocal.remove();
			}
		}
	}
}

如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?

 

3、业务层

使用同一个连接对象,调用多个Dao层处理。所有事务处理完成之后,统一操作成功,调用DBUtils.commit()方法提交事务,一个失败,全部回滚。

package com.yueqian.store.service;

import java.util.List;

import com.yueqian.store.common.DBUtils;
import com.yueqian.store.dao.ProductTypeDao;
import com.yueqian.store.domain.ProductType;

/**
 * 商品类别业务层
 * 
 * @author LinChi
 *
 */
public class ProductTypeService {
	private ProductTypeDao typeDao = new ProductTypeDao();

	/**
	 * 查询所有商品类目
	 * 
	 * @return
	 */
	public List<ProductType> findAllProType() {
		List<ProductType> list = null;
		try {
			//调用多个Dao对象处理,最后统一事务提交
			list = typeDao.findAllProType();
			//使用同一个连接对象,执行后续的DAO方法
			//提交事务
			DBUtils.commit();
		} catch (Exception e) {
			//执行失败回滚事务
			DBUtils.rollback();
		}
		return list;
	}

}

4、dao层

dao层直接调用DBUtils.getConnection()方法获得连接,将dao层所有出现的异常向上抛到业务层,业务层统一处理,最后统一提交并回滚事务,dao层不处理异常,一直声明抛出即可,

package com.yueqian.store.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.yueqian.store.common.DBUtils;
import com.yueqian.store.domain.ProductType;

public class ProductTypeDao {
	/**
	 * 查询所有商品类目表
	 * @return
	 * @throws SQLException  将dao层所有出现的异常向上抛到业务层,业务层统一处理,最后统一提交并回滚事务
	 */
	public List<ProductType> findAllProType()throws SQLException{
		Connection conn = null;
		PreparedStatement pstm = null;
		List<ProductType> list = new ArrayList<ProductType>();
		ResultSet rs = null;
		ProductType proType = null;
		conn = DBUtils.getConnection();
		String sql = "SELECT p.product_type_id,p.name FROM product_types p";
		try {
			pstm = conn.prepareStatement(sql);
			rs = pstm.executeQuery();
			while(rs.next()) {
				proType = new ProductType();
				proType.setTypeId(rs.getInt(1));
				proType.setTypeName(rs.getString(2));
				list.add(proType);
			}
		} finally {
			DBUtils.close(rs, pstm);
		}
		return list;
	}
}

5、controller层

调用业务层,处理相应的逻辑

  • BaseServlet.java

这是个通过反射机制,将前端传入String的参数类型转换为对应的类型。其他servlet集成该类即可方便转换类型。参数如下(前端name名称,请求对象req,要转化类型的字节码Integer.class)

package com.yueqian.store.controller;

import java.sql.Date;
import java.text.SimpleDateFormat;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

public class BaseServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

	// 获取请求的参数,根据请求的参数转化为特定的类型
	public <T> T paseParamter(String parseName, HttpServletRequest req, Class<T> clz) {
		// 获取请求参数
		String parmValue = req.getParameter(parseName);
		// 定义返回类型的对象
		T result = null;
		// clz类型 Integer.class String.class Double.class,Float.class,Date.class
		try {
			if (parmValue != null || parmValue.length() > 0) {
				// 因为Float类型没有String参数的构造方法,所以只能传入long参数的构造方法
				if (clz == Date.class) {
					// 将paramValue转换成long类型的值
					long longValue = sdf.parse(parmValue).getTime();
					// 创建指定类型的String参数构造方法
					result = clz.getDeclaredConstructor(long.class).newInstance(longValue);
				} else {
					// 将paramValue作为指定类型构造方法的参数
					result = clz.getDeclaredConstructor(String.class).newInstance(parmValue);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

}
  • ProductServlet

具体使用如下:

package com.yueqian.store.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.yueqian.store.dao.ProductDAO;
import com.yueqian.store.dao.ProductTypeDao;
import com.yueqian.store.domain.ProductInfo;
import com.yueqian.store.domain.ProductType;
import com.yueqian.store.service.ProductService;
import com.yueqian.store.service.ProductTypeService;

public class ProductServlet extends BaseServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private ProductService productService = new ProductService();
	private ProductTypeService typeService = new ProductTypeService();

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String uri = req.getRequestURI();
		if (uri.indexOf("/prd/list") >= 0) {
			// 商品列表
			List<ProductInfo> findAllProduct = productService.findAllProduct();
			// 设置列表到请求页面
			req.setAttribute("findAllProduct", findAllProduct);
			// 请求转发到目标页面
			req.getRequestDispatcher("/product/product_list.jsp").forward(req, resp);
		} else if (uri.indexOf("/prd/add") >= 0) {
			// 查看所有类目
			List<ProductType> findAllProType = typeService.findAllProType();
			// 存放到请求域中转发到其他页面
			req.setAttribute("findAllProType", findAllProType);
			req.getRequestDispatcher("/product/product_add.jsp").forward(req, resp);
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		String uri = req.getRequestURI();
		if (uri.indexOf("/prd/add") > 0) {
			// 获取请求的参数
			Integer typeId = super.paseParamter("typeId", req, Integer.class);
			String productName = super.paseParamter("productName", req, String.class);
			String desc = super.paseParamter("desc", req, String.class);
			Float price = super.paseParamter("price", req, Float.class);
			System.out.println("productName:"+productName+"-------------------------");
			System.out.println("price:"+price+"-------------------------");
			//输入校验
			//数据库中商品名称不能为null,如果为null,将返回消息和用户填写的其他数据
			if(productName == null || productName.equals("")) {
				req.setAttribute("msg", "商品名称不能为空!");
				req.setAttribute("typeId", typeId);
				req.setAttribute("desc", desc);
				req.setAttribute("price", price);
				req.setAttribute("findAllProType", this.typeService.findAllProType());
				//请求转发到添加页面
				req.getRequestDispatcher("/product/product_add.jsp").forward(req, resp);
				return;
			}
			// 添加新商品
			ProductInfo info = new ProductInfo();
			if (typeId != null && typeId > 0) {
				info.setProductTypeId(typeId);
			}
			info.setProductName(productName);
			info.setDesc(desc);
			info.setPrice(price);
			int count = productService.saveInfo(info);
			System.out.println(info.getProductName()+"========================");
			// 重定向到添加请求url (此处不能使用请求转发,因为表单刷新会发送第二次请求,导致添加两次商品)
			resp.sendRedirect(
					req.getContextPath() + "/prd/add?count=" + count + "&from=add&proId=" + info.getProductId());
		}
	}
}

6、view层

将servlet传入的数据,通过jsp展示到页面给用户

<%@page import="com.yueqian.store.domain.ProductType"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>商品添加页面</title>
<script type="text/javascript">
	window.onload = function() {
		var returnNode = document.getElementById('returnBtn');
		returnNode.onclick = function() {
			location.href = "<%=request.getContextPath()%>/main.jsp";
		}
	}
</script>
</head>

<body>
	<%
		List<ProductType> typeList = (List<ProductType>) request.getAttribute("findAllProType");
		//获取传递的url参数
		String count = request.getParameter("count");
		String from = request.getParameter("from");
		String proId = request.getParameter("proId");
	%>
	<button id="returnBtn" type="button">返回主页</button>
	<form action='<%=request.getContextPath()%>/prd/add' method="post">
		商品类别:<select name="typeId">
			<option value="0">请选择商品类别</option>
			<%
				if (typeList != null && typeList.size() > 0) {
					for (ProductType types : typeList) {
			%>
			<option value='<%=types.getTypeId()%>'<%=request.getAttribute("findAllProType").equals(types.getTypeId())? "selected=selected":"selected=0"%>><%=types.getTypeName()%></option>
			<%
				}
				}
			%>
		</select><br /> 
		商品名称:<input type="text" name="productName" maxlength="30" /><br />
		商品描述:
		<textarea rows="7" cols="30" name="desc"><% Object desc = request.getParameter("desc"); if(desc != null) out.print(desc);%></textarea>
		<br /> 商品价格:<input type="text" name="price" maxlength="10" <% Object price = request.getParameter("price"); if(price != null) out.print(price);%>/><br />
		 <input type="submit" value="添加">
	</form>
	<%
		if (count != null && from != null) {
			int intCount = Integer.parseInt(count);
			String f = ("add".equals(from) ? "录入" : "");
			if (intCount > 0) {
				out.print(f + "了" + count + "件商品,刚刚录入的商品编号为:" + proId);
			}else{
				out.print(f+"失败!");
			}
		}
		Object msg = request.getAttribute("msg");
		if(msg!=null){
			out.print(msg);
		}
	%>
</body>
</html>

好了,该项目的部分代码如上所示,这节你将学到如何优化数据库连接、mvc分层创建web项目流程 、反射机制转换前端传递的类型。

这就是DBCP连接池的使用,可以大大提供系统的性能,可能现在我们的项目比较小,还没有真正体会到效率提高的到底有多少,相信在今后接触到更大的项目,我们会经常使用连接池的,继续前行……

OMNeT++入门指南:从tictoc1到tictoc18的实例解析与实战演练 本文是OMNeT++网络仿真框架的入门实战指南,详细解析了从tictoc1到tictoc18的经典示例。内容涵盖OMNeT++的下载安装、核心三文件(.ned, .cc, .ini)的编写、模块化建模、自定义消息、数据统计与可视化,以及参数化批量仿真等核心技能,帮助读者从零开始掌握这一强大的网络仿真工具 阅读详情

相关推荐

台达PLC DIAdesigner-AX 编程笔记

1、登陆台达思图软件网站,选择Download,登陆注册好的账号,下载DIAInstaller,下载后安装(安装目录不要修改);

weixin_45823621的博客 6590

数据库连接池DBCP,C3P0,Druid),DBUtils工具类

为什么要有连接池? 建立数据库连接是一种非常耗时、耗资源的行为,所以通过数据库预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接库中申请一个就行,使用完毕再归还到连接池中。 1、数据库连接池的作用 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,**当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后...

weixin_44324174的博客 390

基于 Langchain 开发一个完整的支持多轮数据分析(直连 mysql 数据,多表综合分析 SQL 取数,数据分析,报表生成)ChatBI 系统(前后端完整实现源代码)

ChatBI系统开发摘要 本文介绍了基于Langchain的多轮数据分析ChatBI系统开发方案。该系统支持MySQL数据库连接,提供多表分析、SQL查询、数据分析和报表生成功能。系统采用前后端分离架构:前端使用React+Ant Design+ECharts实现交互界面;后端基于FastAPI搭建服务,集成Langchain处理自然语言到SQL的转换;核心技术栈还包括SQLAlchemy、Pandas和Matplotlib。 系统核心模块包括: 数据库连接层:使用SQLAlchemy管理MySQL连接 L

AI天才研究院 789

连接池-DBCPUtils工具类dbcp

一、合建properties文件在src目录下创建一个名为“dbcpconfig.properties”的文件,里面的内容为:#连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/数据库名 username=root password=#<!-- 初始化连接 --> initialSize=10#最大连

GitLqr的博客 5135

DBCP连接池及其工具类的使用

准备工作: 1.导包 2.数据库建表 3.dbconfig.properties文件的准备 开始使用: 一.使用dbcp连接池,进行数据的查询 package com.henu.dbcp; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import jav...

码放南山 335

dbcp浅析

1.目的 DBCP主要是为jdbc提供连接池服务。   2.实现 2.1 Jakarta Commons Pool DBCP利用了Jakarta Commons Pool来实现连接池管理。下面回顾一下Commons Pool的基本概念 PoolableObject

6624

DBCP数据源使用

DBCP:DataBase Connection Pool 1、需要的jar:commons-dbcp.jar  commons-pool.jar 2、把DBCP的配置文件(dbcpconfig.properties)拷贝到构建路径中 3、创建类:DBCPUtil dbcpconfig.properties: mysql设置内容如下: #连接设置 driverClassName=c

宏亮的专栏 5747

apache httpclient 连接池 工具_如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作

DBCP是tomcat中的一个工具类DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池件。单独使用dbc...

weixin_40002224的博客 177

dao层如何调用对象_如何实现DBCP数据库连接池工具类&mvc分层开发web流程操作?...

DBCP是tomcat中的一个工具类DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池件。单独使用dbc...

weixin_39876514的博客 153

DBCP数据库连接池笔记-基本使用

初次学习DBCP数据库连接池的使用,所以写个博客作为笔记… DBCP数据库连接池需要commons-dbcp和commons-pool jar包支持 下载地址:http://download.csdn.net/detail/mass_effect/9841656配置文件:#连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://lo

msidolphin的博客 741

数据库连接池DBCP、C3P0、Druid); Commons DbUtils工具类

文章目录数据库连接池一、DBCP连接池使用步骤:1、导入 jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)2、配置信息采用硬编码方式采用配置文件方式Java代码配置文件3、获取连接对象二、C3P0连接池使用步骤:1、导入jar包(c3p0-0.9.1.2.jar)2、配置信息采用硬编码方式采用配置文件方式c3p0.propertiesc3p0-co...

y_Engineer的博客 1154

int(11)和int(21)的区别

int(11)和int(21)的区别,没什么区别,只是显示的位数不一样

weixin_45010894的博客 279

java web 数据库连接工具类

说明:utils在web项目中一般是存放辅助类的(比方说辅助的时间日期处理,字符处理,加解密等等),故建议将数据库连接操作放在该文件夹下。 注意:记得先要装好数据库,这是前提。还有数据库需要的jar包,去官网下载。我用的jar包是这个 每次使用数据库可以直接调用该类的数据库连接方法,类似: Connection conn=null; conn= DBUtils.getConnect...

quhongjuan12的博客 773

JAVADBCP(连接池)

一:连接池技术现在JDBC操作过程中,最浪费资源的步骤是创建数据库连接。但是在操作完成数据库之后又必须关闭数据库连接。在使用JDBC时关闭数据库连接就是销毁数据库连接。连接池:存放连接的一个容器。使用连接池容器可以实现数据库连接对象的创建,维护和管理。当我们再进行数据库操作时,可以从连接池获得一个数据库连接对象 ,进行与数据库之间的CRUD操作操作完成之后释放数据库连接。可以有效的减少创建数据...

蓝莓味的鱼 2723

c3p0,DBCP连接池 和DBUtils工具类 使用介绍

c3p0的使用 == c3p0使用xml配置问文件 配置文件,配置文件一定到放置到src下,命名为:c3p0-config.xml == <c3p0-config> <!-- This app is massive! --> <named-config name="mvcapp"> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <proper

weixin_43979902的博客 279

DBCP-DBUtil

DBCP-DBUtil 一、创建DBCP连接池 1、创建DBCP链接池配置文件:名称为 dbcp.properties      内容如下: driverClassName=com.mysql.jdbc.Driver username=root password=123456 url=jdbc:mysql://127.0.0.1:3306/long1?characterEncodin

Bruce小鬼 934

数据库连接池(Druid、DBCP、C3P0)和Apache织DBUtils工具类使用

数据库连接池(Druid、DBCP、C3P0)和Apache织DBUtils工具类使用 第一节:自定义连接池 使用JDBC操作数据库,需要建立Connection,使用传统的JDBC操作需要每次创建Connection,创建Connection是一个非常性能和消耗时间的过程,我们需要在提高程序性能,那么就需要减少每次创建创建连接带来的负面影响,解决这个问题我们将利用池子概念,预先创建一些链接放入池子中,如果需要操作数据,不用创建新的Connection,只需要在池子中获取即可,使用完毕放入池子!这样就形

qq_37867421的博客 378

DBCP连接池

DBCP连接池 DBCP也是一个开源的连接池,是Apache成员之一,在企业开发中也比较常见,tomcat内置的连接池 1.创建项目 导入 jar包 将这两个 jar包添加到 myJar文件夹中 (jar包在资料里的软件文件夹中) 2.添加myJar库 到项目的依赖中 3.常见配置项 属性 描述 driverClassName 数据库驱动名称 url 数据库地址 ...

舞鹤白沙编码日志 643

oracle的dbcp工具类,[转]DBCP连接池的最简单应用(用于ORACLE数据库)

鉴于有人问起DBCP直接用于JDBC连接的问题,我做了一个最简单的示例。所有资源来源于网上。它不需要什么Web容器,就是一简单的控制台应用。资源:http://apache.etoak.com//commons/pool/binaries/commons-pool-1.5.6-bin.ziphttp://labs.renren.com/apache-mirror//commons/dbcp/bin...

weixin_34544513的博客 211

java使用DBCP连接池创建工具类

@java中有个扩展包 javax下面有个DataResource的接口 javax.sql.DataResource 该接口定义了连接池的方法规范 而DBCP框架有apache公司开发,他实现了接口DataResource定义的方法 他的实现类是BasicDataResorce org.apache.commons.dbcp.BasicDataSource; 2.写定义连接池的类 pac...

CLAYql的博客 508

DBCP连接池工具类

public class DBCPUtil { private static DataSource dataSource; static { InputStream is = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties"); Properties p = new Properties(); try ...

syy363250763的博客 422

数据库连接池与DBUtils工具、DataSource接口、 DBCP数据库连接池、C3P0数据库连接池、DBUtils类、QueryRunner类、ResultSetHandler实现类、增删改查

数据库连接池与DBUtils工具 ​ JDBC的基本用法和操作,每操作一次数据库,都会执行一次创建和断开Connection对象的操作,频繁的操作Connection对象十分影响数据库的访问效率,并且增加了代码量,所以在实际开发中,开发人员通常会使用数据库连接池来解决这些问题。Apache织提供了一个DBUtils工具类库,该类库实现了对JDBC的简单封装,能在不影响数据库访问性能的情况下,极大地简化JDBC的编码工作。 01. 数据库连接池 ​ 在JDBC编程中,每次创建和断开Connection对

Lvruoyu的博客 2182

内存泄漏漏洞报告数据集(21列,1000条结构化内存泄漏错误报告)CSV

该数据集包含1000条结构化内存泄漏错误报告,采用生产格式收集。每个条目都包含关键的软件工程领域,如bug_id、标题、描述、product_module、环境、operating_system、浏览器、严重程度、优先级和状态。报告模拟了真实的技术场景,包括压力测试失败、内存增长问题、OOM错误以及跨多个模块(如Data-Pipeline、ML-Service和WebApp-Core)的性能下降。该数据集反映了多样化的部署环境,如开发和生产环境,以及多种作系统和浏览器上下文。该数据集专为机器学习和分析应用设计,非常适合错误分类、严重度预测、自动分流、根本原因建模和软件可靠性研究等任务。数据完全合成且隐私安全,确保真实用户信息不被泄露,同时保持适合AI训练和实验的真实软件工程模式。

基于MATLAB与CCS的FIR滤波器的C语言实现.pdf

基于MATLAB与CCS的FIR滤波器的C语言实现.pdf

上一篇: 阿里菜鸟物流五面,血与泪的经验总结(附面试答案)
下一篇: 普本毕业三年,四面华为,因精通这6大知识点拿到25*16薪offer
爱玛士
博客等级 码龄6年 719粉丝 253原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值