数据库连接方式改进

ArcMap对遥感图像进行语义分割标注 使用arcmap对遥感图像进行语义分割标注 阅读详情

描述:

现有的数据库连接方式是每次调用MySQL.getConnection均会从连接池获取一个真实的连接,如下图所示。



此种数据库连接方式,假设action中使用循环调用service的方法,或者同一个action的种方法中调用了多个service, 则每个service中的connection均是从连接池获取的连接,如此种方式消耗的数据库连接太多,很容易爆满。上面的链接方式是//方式一


方式二

在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程, 从action中调用下面的service均是顺序调用的,即不会存在并发访问,一个sesion请求,web服务器会开启一个线程进行处理,即从拦截器开始可以认为是单线程下运行的,这样来看实际只需要一个数据库连接即可。

使用线程局部变量在保存首次获取的连接,在下次请求是再此返回同一个连接,直到方法执行完毕在释放次连接,看下面的应用本地线程变量写的程序

public class ConnectionManager{    
	private static Log log = LogFactory.getLog(ConnectionManager.class);
	private static final ThreadLocal threadConection = new ThreadLocal();
    
	public static Connection getConnection() throws SQLException {

		//方式二
		/**
		 * 优点: 基于线程sesion管理连接,同一个线程由于是顺序操作,只用一个数据库连接即可,无需手动关闭,可统一关闭连接,大大降低数据库连接池资源的消耗,增加数据库并发连接
		 * 缺点: 对于service调用service的代码部分,如果子service关闭了连接,主service方法需要再次获取连接,对现有代码需要改动
		 * 弥补: 自定义一个Connection的实现,拦截close方法,统一使用拦截器自动管理连接
		 */
		Connection conn = (Connection) threadConection.get();
		try {
			if (conn == null || conn.isClosed()) {
				conn = dataSources.getConnection();
				conn.setAutoCommit(false);
				if (conn != null) {
					connectionCountOpened++;
					threadConection.set(conn);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		getConectionString();
		return conn;
        
	}

    public static void closeConection(){
        Connection conn = (Connection)threadConection.get();
        try {
            if (conn != null && !conn.isClosed()) {
                conn.close();
                log.info(Thread.currentThread()+"  close database connection.");
            }
        }catch(Exception e){
            e.printStackTrace();
            log.error(e);
        }
    }
}

在给出service方法的拦截器,在service的方法执行完毕后再关闭连接

public class ServiceMethodInterceptor implements MethodInterceptor {

    private static Log log = LogFactory.getLog(ServiceMethodInterceptor.class);

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {

        String info = invocation.getMethod().getDeclaringClass()+ "." +  invocation.getMethod().getName() + "()";

        Object[] ars = invocation.getArguments();
        log.warn("service method "+invocation.getMethod()+"");

        // 判断该方法是否加了@LoginRequired 注解
//        if(invocation.getMethod().isAnnotationPresent(LoginRequired.class)){
//            System.out.println("----------this method is added @LoginRequired-------------------------");
//        }

        try{
            Object result = invocation.proceed();
            ConnectionManager.closeConection();
            return result;
        }catch(Exception e){
            e.printStackTrace();
            log.error(e);
        }finally{
            log.info(info);
        }
        return null;
    }
}
  * 优点: 基于线程sesion管理连接,同一个线程由于是顺序操作,只用一个数据库连接即可,无需手动关闭,可统一关闭连接,大大降低数据库连接池资源的消耗,增加数据库并发连接
 * 缺点: 对于service调用service的此种结构部分,如果子service关闭了连接,主service方法需要再次获取连接,对现有代码需要改动
 * 改进: 自定义一个Connection的实现,拦截close方法,统一使用拦截器自动管理连接


本文原址: 

Python 爬虫实战:爬取电商平台商品信息(价格 / 销量 / 评价) 摘要:本文详细介绍基于Python的电商商品信息爬取技术方案,以京东商品详情页为例,对比分析静态(BeautifulSoup)和动态(Selenium)两种爬取方式的实现逻辑。静态爬取适合获取基础信息,而动态爬取可解决JS渲染数据的获取问题。文章包含完整的代码实现、反爬规避策略及数据存储方案,涵盖商品名称、价格、销量、评价等核心数据提取。同时强调爬虫的合规使用,提供扩展方向建议,为电商数据采集提供实用技术参考。 阅读详情

相关推荐

OPC与AI智能体集成实战:一人公司的技术栈构建与避坑指南

1. 先搞清楚“一人公司”和“AI工具”到底在解决什么问题 最近看到不少关于“裸辞搞OPC一人公司”和“AI时代骗局”的讨论,结合搜索热词里高频出现的 openclaw 、 AI编程 、 OPC ,我觉得有必要把这里面的水搅一搅,说点实在的。 首先得拆开看。标题里混了三个东西: 一人公司 、 OPC/OpenClaw 、 AI培训 。它们被放在一起讨论“骗局”,但本质上解决的是不同层面的问题。 一人公司 ,或者说个人工作室、独立开发者模式,核心是 用最小化团队(甚至一个人)去承接项目、开发产品或提供服务 。

weixin_29038345的博客 320

struts2 action连接mysql数据库和操作数据库

这里介绍的是如何在.java文件中连接mysql,进行数据的存储和提取的操作; 首先获取你的mysq的地址和用户名,密码,定义如下 String url = "jdbc:mysql://w.rdc.sae.sina.com.cn:3307/app_libraryofdgh?characterEncoding=UTF-8"; Stringusername = "jmzk5z4213

dgh1996的博客 1万+

告别‘线束丛林’:手把手拆解车身域控制器(BCM/PEPS/网关)的硬件选型与PCB布局要点

本文深入解析车身域控制器的硬件选型与PCB布局要点,涵盖主控MCU选择、通信接口设计、电源架构优化及EMC设计等关键环节。通过实战案例分享,帮助工程师解决高密度集成带来的电源完整性、热管理和信号隔离挑战,实现更稳定高效的汽车电子系统设计。

weixin_42567279的博客 394

SpringCloud

SpringCloud 是微服务技术落地的一种实现和体现 SpringCloud 微服务概述 什么是微服务 目前的微服务并没有一个统一的标准,一般是以业务来划分 将传统的一站式应用,拆分成一个个的服务,彻底去耦合,一个微服务就是单功能业务,只做一件事。 与微服务相对的叫巨石 微服务与微服务架构 微服务是一种架构模式或者一种架构风格,提倡将单一应用程序划分成一组小的服务独立部署,服务之间相互配...

西门飘雪,东门飞︿( ̄︶ ̄)︿的博客 728

PaddleOCRv5训练自己的模型-微调文字识别模型

本文介绍了使用PaddleOCR微调文字识别模型的具体步骤。首先需要按照官方格式准备数据集,包括图片和标注文件。然后进行模型训练,包括环境安装、预训练模型下载、配置文件修改等关键环节,特别针对训练中可能出现的类别数不匹配问题提供了三种解决方案。文章还详细说明了模型导出为静态图格式的方法,以及如何调用训练好的模型进行推理。整个过程涉及多个技术细节,如早停机制设置、断点续训方法等,为需要提升OCR识别精度的开发者提供了实用指导。

weixin_43827982的博客 3176

Windows 11 上 WSL2 安装 Ubuntu 22.04 保姆级教程(含桌面环境配置)

本文提供在Windows 11上通过WSL2安装Ubuntu 22.04并配置桌面环境的详细教程。涵盖WSL2核心安装、性能调优、Xfce桌面环境部署以及开发环境集成,帮助开发者构建高效、无缝的Windows-Linux混合开发工作站。

Jerry的专栏 633

数据库优化的措施有哪些

2. 优化索引:索引是提高 MySQL 查询性能的关键,可以通过创建适当的索引来优化查询性能。需要注意的是,过多的索引会影响写入性能,因此需要根据实际情况来确定需要创建的索引。需要注意的是,以上仅是一些常见的优化措施,具体的优化措施需要根据实际情况来确定。此外,MySQL 数据库的优化还需要定期进行性能监控和调整,以确保数据库的最佳性能。1. 优化查询语句:优化查询语句是提高 MySQL 数据库性能的基础,可以通过添加索引、避免使用 LIKE 操作符、使用 JOIN 语句等方式来优化查询语句。

Nick的博客 973

别再为跨页读写发愁了!STM32F407模拟I2C驱动24C256/512的避坑指南

本文详细解析了STM32F407模拟I2C驱动24C256/512的跨页写入问题,揭示了24C系列存储器'写满一页不会自动翻页'的关键机制,并提供了经过验证的分页写入算法和优化方案。通过GPIO时序优化、地址计算和错误处理等技巧,帮助开发者解决数据错乱、覆盖等常见问题,实现稳定可靠的EEPROM读写操作。

weixin_42631411的博客 377

数据库的8种优化方式

本文通过8个方法优化Mysql数据库:创建索引、复合索引、索引不会包含有NULL值的列、使用短索引、排序的索引问题、like语句操作、不要在列上进行运算、不使用NOT IN和操作

soulworld的博客 1万+

Prompt提示优化工具

在大模型使用过程中,Prompt尤为重要。一个好的Prompt可以解决很多的问题。那么如何撰写一个完美的Prompt?下面汇总了一些Prompt工具,可以辅助日常Prompt的编写。

HJ_blog 3108

AI Agent开发第82课-手把手教你把paddleocr-vl做成mcp使其在DIFY里运行

本文详解如何将国产顶尖多模态 OCR 模型 PaddleOCR-VL 封装为标准 MCP(Model Calling Protocol)服务,并通过自研的 HTTP-based MCP Client 接入 Dify 1.10,实现 AI Agent 在对话中自动识别并调用 OCR 能力。该方案已在某头部保险公司真实业务流程中落地,使用了当前最先进的“Agentic AI 原生”设计思想。

打造全国最全的AI Agent开发知识领域的博客 1625

MaxScale2.0.1结合Java Druid连接池实现读写分离注意事项

现象:程序会不定时的出现连接错误,问题bug的异常信息如下:The last packet successfully received from the server was 116 milliseconds ago.  The last packet sent successfully to the server was 115 milliseconds ago.java.sql.SQLExce...

weixin_34194359的博客 347

电源防反接保护电路全攻略实战A04

本文深入剖析了硬件设计中电源保护电路的关键技术与实战经验。文章指出,保护电路虽小但至关重要,通过对比分析二极管与MOSFET防反接方案,揭示了MOSFET在效率、温控方面的优势。针对过压保护,重点讲解了TVS二极管选型要点,强调钳位电压而非击穿电压才是保护核心。文章结合工业案例(如48V通信模块烧毁、5V系统MOSFET过热等),详细阐述了PCB布局规范、热设计路径等工程细节,并提供了USB接口ESD防护的完整选型方案。最后强调硬件设计必须考虑最坏工况,在成本与性能间找到平衡点,避免因小失大。

启芯硬件的博客 777

通达OA 新旧两种数据库连接方式

老的连接方式: include_once("/inc/conn.php"); $cursor = exequery($connection,$query); 新的连接方式: include_once("/inc/utility_all.php"); $cursor = exequery(TD::conn(),$query); 转载于:https:...

weixin_30859423的博客 162

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

DBHelper封装过程

缺点:现在可以通过Dbproperties读取文件连接数据库,但是还有sql语句执行起来麻烦。缺点:如果这样进行封装的话,需要编写一个 setup的程序,不方便。缺点:这种情况数据库是写死的,只能用这一个,而且改着麻烦。

SHihao200003的博客 583

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Mysql之5和6+的连接方式整理

Thttps://blog.youkuaiyun.com/fuleidemo/article/details/82722155OC Mysql之5和6+的连接方式整理

A997150986的博客 332

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

挽救数据库性能的30条黄金法则

还不知道如何提升数据库的性能吗?你的数据库系统允许缓慢吗?优化数据库系统有什么具体方法呢?想知道详情,请点击这里学习,别忘了分享哦

一个被知识诅咒的人 1032

Java Web项目中连接Access数据库的配置方法

本文是对前几天的“JDBC连接Access数据库的几种方式”这篇的升级。由于在做一些小项目的时候遇到的问题,因此才决定写这篇博客的。昨天已经将博客发布了,但是后来经过一些验证有点问题,所以今天改了一下重新的发布了 老师决定期末考试采用access数据库实现增删改查,我认为现在的我已经没有问题了,但是以前都是在JSP页面中连接access数据库,无论是以下的那种方式都进行了连接的练习,但是现在我想

吧主 2865

java数据跑不出来,6000条数据,java下跑了20多分钟了还没跑完,求教怎么改进

当前位置:我的异常网» Java Web开发»6000条数据,java下跑了20多分钟了还没跑完,求教怎6000条数据,java下跑了20多分钟了还没跑完,求教怎么改进www.myexceptions.net网友分享于:2013-04-23浏览:11次6000条数据,java下跑了20多分钟了还没跑完,求教如何改进。String sql = "select c.BRANCH_CODE ...

weixin_39622988的博客 149

JumpServer的变革之路-数据库篇

JumpServer堡垒机目前是可以纳管windows、Linux、数据库、B/S架构浏览器,并且在3.5版本的时候,操作数据库的方式也发生了变化,这源于JumpServer团队重构了管理数据库的组件,从之前的命令行模式,变成了图形化的操作。介绍了这么多连接数据库的方式,还有一个小功能需要说明一下,如果需要限制给不同人员使用不同的连接方式,就可以使用一下这个连接方式的功能,限制不同人员只能用的工具,话不多说,上图。第二种操作方式是客户端工具,里面包含了两种连接方式,有一种需要安装客户端在电脑上。

weixin_38612318的博客 2271

Java读取properties文件连接数据库

先说为什么要有这种东西,或者我们为什么要用这种方式来写,先看经常用的方法,我们经常写的 package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionManager { public static ...

weixin_34367845的博客 286

【java】对数据库操作的那些事(包括数据库中的预处理)

一、连接问题 前面刚介绍了怎么连接数据库,也写了相应的模板,但是它的可维护性非常差,那么怎么解决这个问题呢? 首先写一个配置文件jdbc.properties ## MySQL driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/hncu?useUnicode=true&characterEncoding=UTF-8 us

寻找、发现、追求、获得———这就是狼的生活要素 3260

ADO.NET连接数据库总结

一、用SqlConnection连接SQL Server 1、引入命名空间using System.Data.SqlClient;2|、连接数据库SqlConnection myConnection = new SqlConnection();myConnection.ConnectionString = "user id=sa;password=sinofindb;initial catalo...

weixin_33919941的博客 103

php pdo mysql哪个好_php_mysql、php_mysqli 与 pdo_mysql 的区别与选择

PHP的MySQL扩展(优缺点)设计开发允许PHP应用与MySQL数据库交互的早期扩展。mysql扩展提供了一个面向过程 的接口;并且是针对MySQL4.1.3或更早版本设计的。因此,这个扩展虽然可以与MySQL4.1.3或更新的数 ;据库服务端 进行交互,但并不支持后期MySQL服务端提供的一些特性。PHP的mysqli扩展mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MyS...

weixin_35363322的博客 356

SQL基础理论篇(六):多表的连接方式

介绍了SQL92标准和SQL99标准中的各种表连接方式,如笛卡尔积、外连接、自连接等,并简单介绍了两种标准在表连接方式上的区别

经年藏殊的博客 1099

SQL Anywhere 1

shell 的学习还有很多空间,下回再说,先把这几天的东西讲讲吧。 终于告别了单线程工作,现在开始管理多个方面,SWT的java的GUI编程和SQLAnywhere的学习。 tarball在sc...

189
上一篇: 如何判断一个请求是否为AJAX请求
下一篇: ThreadLocal与Synchronized(线程安全与数据共享)
ShadowWalker
博客等级 码龄16年 78粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值