zoukankan      html  css  js  c++  java
  • 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.测试结果表明,在使用连接池时,只在第一次初始化时,比较耗时,完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

  • 相关阅读:
    Django视图
    Django模板系统
    错误:java.sql.SQLException: Access denied for user 'xxx'@'localhost' (using password: YES)
    关于Spring使用XML配置AOP时pointcut位置的一个小问题
    在jsp页面中将Java对象转换位JS对象的一个思路
    关于artifact XXXX:war exploded: Error during artifact deployment. See server log for details.错误
    框架集合——Java面向对象基础(33)
    使用Socket简单模拟C/S消息传递(UDP)——Java面向对象基础(32)
    使用Socket简单模拟C/S消息传递(TCP)——Java面向对象基础(31)
    对象序列化——Java面向对象基础(30)
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6402736.html
Copyright © 2011-2022 走看看