当前位置: 首页 > news >正文

2017.02.15

1.mysql长连接和短连接:
2.省市区联动查询

3.mysql长连接和短连接:
短链接的缺点:创建一个连接,程序执行完毕后,就会自动断掉与mysqlserver的链接。于是多少次php执行,就会多少次这样的创建和释放过程。频繁地创建和释放连接,比较
耗费cpu资源。

长连接就可以避免每次请求都创建连接的开销,节省了时间和IO消耗。

长连接是提高了性能。不过还有一些细节的问题需要解决,即mysql发现一个链接长时间没有执行查询请求,就会自动断掉这个连接。

具体多长时间后断掉,有个timeout设置时间。通过sql:"show global variables like '%timeout';" 查看。

4.每次执行查询前,先使用mysql_ping()去检测一下连接有没有断掉。如果断掉了。重新建立一次链接。

具体代码为:

if(mysql_ping()!=0){

//链接已经断开,需要重新建立链接

$this->conn = mysql_connect($ip,$user_name,$password);

}
5.当链接已经失效了,仍然去执行查询操作,一个明显的表现形式就是提示:MySQL server has gone away

启发:MySQL server has gone away这个信息是mysql服务器提示出来的呢?还是php的mysql扩展提示出来的呢?

据判断,肯定是应用程序服务器报出来的(php)。想一想,如果mysql都已经接到请求了,那么还出现什么链接不上。明明都已经链接上了。

既然mysql服务器都能够接受请求,那么还怎么处理不过来呢。

我们去百度搜索:MySQL server has gone away。从来没有看到java链接mysql出现这样的情况。如果是mysql 服务器报出来的。那么应该与应用程序无关。所以应该也会搜索到
相关信息的。

据此判断,这是php抛出来的信息。php链接不上mysql了。

6.数据库连接池:
使用jdbc创建的connection时间久了会自动断开连接吗?
打算用java写一个建议的数据库连接池,其实就是将各数据库的connection存到数据组,要查询或更新时直接从数组中取出,这样就不用每次都创建连接了。但是我有一个疑问
,就是connection创建好了之后可能很久之后才会用到,这个时候用这个连接去查询或更新会抛出异常吗?会的话抛出什么异常呢?顺便说一句,客户端到各数据库服务器端口
都是短连接。
7.可以发送空操作,也就是不耗时的操作

<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<property name="idleConnectionTestPeriod">60</property>

8.这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了
9.什么时候用长连接,短连接?
长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费。
但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。
总之,长连接和短连接的选择要视情况而定。
10.首先,如果使用了长连接而长期没有对数据库进行任何操作,那么在timeout值后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL
server has gone away“这样的错误。
在使用mysql_real_connect连接数据库之后,再使用mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) 来设置为自动重连。这样当mysql连接丢失的时候,使用mysql_ping
能够自动重连数据库。如果是在mysql 5.1.6之前,那么则应在每次执行完real_connect 之后执行mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) ,如果是mysql 5.1.6+
,则在connect之前执行一次就够了。
11.查看mysql连接数
mysqladmin -uroot -p processlist
实际的测试中我发现,当设置了MYSQL_OPT_RECONNECT为1时,超时后再查看processlist,则自动建立的连接不在列表中,但事实上连接确实建立并被使用了。

在MYSQL的默认设置中,如果一个数据库连接超过8小时没有使用(闲置8小时),服务器将断开这条连接,后续在该连接上进行的查询操作都将失败。网络上对该问题的描述非常多
。也提供了相应的解决办法。我在这里提一些我自己的看法。
解决办法一:修改MYSQL服务器的配置参数
道理非常简单,MYSQL的默认设置是在数据库连接超过8小时没有使用后将其断开,如果我们将这个时间改成更大的数值,那么连接超时所需的时间就会更长,也就意味着更不容
易超时。网络上提供的修改方法一般是修改/etc/my.cnf,在这个文件中添加一行wait_timeout=你需要设置的超时时间 。实际上有一种比较简单的方法来修改这个参数:
首先作为超级用户登录到MYSQL,注意必须是超级用户,否则后面会提示没有修改权限。然后输入
show global variables like 'wait_timeout';
回车执行后显示目前的超时时间:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
上面显示的是默认的超时时间,即8个小时(单位是秒)。现在重新设置该参数,例如我们要将超时时间设置成10个小时,可以输入:
set global wait_timeout=36000;
回车执行,显示:
Query OK, 0 rows affected (0.00 sec)
表示设置成功,可以重新使用show global variables like 'wait_timeout'来验证。
这种方法比较直观,而且设置的参数立即生效。但如果/etc/my.cnf中没有配置,则重启服务后,global变量会从/etc/my.cnf中读取新的变量值。

11.假如一个网站,从生命周期开始到结束,都只用了一个连接,和每次刷新都重新去连接,他们的区别在哪里?真的只是节省了连接的资源么?
我试做了一个实验,时间上的差别不会很大,内存开销肯定有一定区别,短连接每次需要释放掉类,初始化会有影响。
12.用户少,使用长连接,减少web端与数据库的逻辑连接数,可以让连接保持久一点,不用频繁建立连接。
用户多,使用短链接,这样用于使用完后就释放连接了。但是消耗系统资源多一点。

web端默认连接池缓存100个连接,超过100个用户同时连接,若使用长连接占用久,物理连接和逻辑连接都需要等待以至超时。使用短连接频繁断开和连接,消耗CPU、内存等

13.对于你说,从生命周期开始到结束,都只用了一个连接,考虑到并发的一些问题,会影响你程序的用户体验。

14.长连接:TCO建军立之后就是长连接了,只要你不断开可以一直进行数据的伟输。
长连接适用于要进行大量数据传输的情况,如:数据库,redis,memcached等要求快速,数据量大的情况下。
长连接通过心跳机制(通信数据很少)来进行连接状态的监测,断后重新进行连接。
15.HTTP连接:HTTP连接是短连接,每发起一次请求都建立TCP连接,响应请求后就断开连接,这样防止客户端长期占用服务器的资源,维持连接是要占用线程的。

20.个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,
可以保证较快的数据库读写速度,还更加安全可靠。

21.静态static方法,是不会自动执行的。也是在调用方法时才去执行。
22.静态代码块是可以执行和调用静态方法的。这样就可以用静态代码块来执行一些程序初始化完成的一些初始化对象,比如数据库连接池。
最好专门写一个类来进行一些程序需要开机执行的初始化。转么定义一个类,里面包括一些初始操作,可以用static代码块包装起来。也可以通过方法调用的形式。来完成初始

23.main方法所在的类的静态变量,静态代码块会在main方法前执行。
24.一个方法的注释,应该写哪些
/**
* 设置cell的值
* @param excelDTO 数据对象
* @param dataRow excel的行
* @param cellSize 每行的cell的数量
* @throws Exception
*/
private void setCellVal(ExportExcelPropertyDTO exportExcelPropertyDTO,XSSFRow dataRow,Integer cellSize)

25.常亮类,static final变量类的正确写法:以constant类命名结尾。可以添加static final list<>常量数组。并以static代码块初始化运行。
/** 导出会员表头信息 */
public static final List<String> memberInfoHeaders = new ArrayList<String>();
static {

accountHeaders.add("业务机构代码");
accountHeaders.add("业务机构名称");
accountHeaders.add("保险人");
accountHeaders.add("出单时间");
accountHeaders.add("保单号");
accountHeaders.add("批单号");
accountHeaders.add("投保人");
accountHeaders.add("被保人");
accountHeaders.add("代理保险产品代码");
accountHeaders.add("代理保险产品名称");
accountHeaders.add("保险金额");
accountHeaders.add("保额币种");
accountHeaders.add("保险费");
accountHeaders.add("保费币种");
accountHeaders.add("业务员");


26.测试结果表明,在使用连接池时,只在第一次初始化时,比较耗时,完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

相关文章:

  • linux中的awk用法入门详解(二)
  • javascript事件失效l
  • 【Spark Summit East 2017】Spark,类型函数式编程的引诱者
  • linux命令大全之watch命令详解(监测命令运行结果)
  • Elasticsearch之更新(全部更新和局部更新)
  • mysql查看表结构
  • 使用Hilo.JS快速开发Flappy Bird
  • STAR法则
  • Openlayer4 - 最好最强大的开源地图引擎
  • shell中${}的妙用
  • 重定向监听端口并持久化路由配置
  • apiCloud结合layer实现动态数据弹出层
  • Win7 VS2015编译wxWidgets-3.1.0
  • html5 class
  • 2008 R2 Remote Desktop Server driver RDPDR.sys cannot be started, error 577
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Angular 响应式表单 基础例子
  • C++11: atomic 头文件
  • es6--symbol
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • httpie使用详解
  • IDEA常用插件整理
  • k8s 面向应用开发者的基础命令
  • Lucene解析 - 基本概念
  • Magento 1.x 中文订单打印乱码
  • MySQL QA
  • PHP变量
  • php的插入排序,通过双层for循环
  • rabbitmq延迟消息示例
  • React-生命周期杂记
  • uni-app项目数字滚动
  • 关于使用markdown的方法(引自CSDN教程)
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何使用 JavaScript 解析 URL
  • 进程与线程(三)——进程/线程间通信
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • !!Dom4j 学习笔记
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • %@ page import=%的用法
  • (AngularJS)Angular 控制器之间通信初探
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (排序详解之 堆排序)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET 使用 XPath 来读写 XML 文件
  • @RequestMapping用法详解
  • [20180129]bash显示path环境变量.txt
  • [22]. 括号生成
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [C++]拼图游戏