精华内容
下载资源
问答
  • Python建立SSH连接与使用方法
    千次阅读
    2021-01-13 05:05:15

    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接

    安装过程也比较简单,先安装pycrypto后安装paramiko,解压后在命令提示符下切换到解压后的目录,输入python setup.py install就可以了。另外安装pycrypto前需要先安装mingw,不然会因为缺少编译器而提示缺少一个BAT文件。安装好mingw后,需要在Python安装目录下的Lib\distutils\文件夹里建立一个distutils.cfg文件,文件内容为:

    [build]

    compiler=mingw32

    由于windows下安装pycrypto 经常出现,如果出错,本处笔者,提供一个快捷方法:

    pycrypto下载稳定已编译版本:http://www.voidspace.org.uk/python/modules.shtml#pycrypto   (到这个位置下载对应的版本:pycrypto-2.6.win32-py2.7)

    安装好后,再通过pip install paramiko来安装paramiko模块

    当paramiko模块安装好后,可通过import paramiko进行测试验证。

    安装好以后就可以编写写代码了。由于我的SSH服务器只需要用户名和密码就可以连接,应该说属于最简单的一种了。

    stdout.readlines()返回一个列表,一般来说,Linux命令的每行输出存储为一个元素,且已经带了换行符。

    import paramiko

    client = paramiko.SSHClient()

    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    client.connect('192.168.118.x', 22, username='xx', password='xx', timeout=10)

    cmd = ['ls -l','echo hello!']#你要执行的命令列表

    for m in cmd:

    stdin, stdout, stderr = client.exec_command(m)

    for std in stdout.readlines():

    print std

    client.close()

    使用SSHClient对象的这个方法执行例如ls,pwd等命令的时候,都执行的还不错。

    但是cd /path这个命令就有点问题了,发现cd到其他路径下,但是使用pwd发现还是在登录的时候的默认路径,/home/

    相当于没有执行cd命令,这个时候就要把后续的想要执行的命令和cd放在同一个字符串中传入exec_command方法中才会生效。

    例如:

    client = paramiko.SSHClient()

    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    client.connect('IP', username='username', password='password', timeout=5)

    client.exec_command('cd /home//xxx/yyy; ls -al')

    这时会列出yyy的文件列表

    【linux】——FreeBSD 建立 SSH 连接慢的解决方法

    一般在编写 linux 程序的时候,会使用 SecureCRT 或者 xshell 等工具远程登录到 linux 服务器上.最近发现在建立 SSH 连接的时候,非常慢,但是建立连接成功之后可以正常使用 ...

    更改计算机名及使用Secure CRT ssh连接用户添加方法汇总

    修改计算机名 更改/etc/sysconfig下的network文件,在提示符下输入vi /etc/sysconfig/network,然后将HOSTNAME后面的值改为想要设置的主机名.  开启SS ...

    ssh 连接缓慢解决方法

    ssh 连接缓慢解决方法 摘自:https://blog.csdn.net/qq_14821541/article/details/61915589 2017年03月13日 12:00:38 所以怎样 ...

    诊断并解决CentOS SSH连接慢的方法

    诊断并解决CentOS SSH连接慢的方法: http://os.51cto.com/art/201507/484743.htm

    Python实现SSH连接远程服务器

    首先需要安装paramiko模块 #-*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import paramiko ssh = p ...

    【Python】 SSH连接的paramiko

    paramiko *paramiko需要PyCrypto模块的支持 paramiko支持通过SSH协议进行一些操作,比如远程执行命令,上下传文件等等 用法: ① 远程命令 ssh = paramiko ...

    Python通过ssh连接服务器并执行命令

    [本文出自天外归云的博客园] 脚本示例如下: # coding:utf-8 import time,paramiko,re,StringIO def exec_shell(command): ''' ...

    Termux和Ubuntu建立ssh连接

    1 本机环境 Android:Termux v0.77 作为客户端 Linux:Ubuntu 19.10 作为服务器 两者处于同一局域网下 2 ssh安装 2.1 Termux pkg install ...

    ssh连接失败解决方法

    执行如下命令: ssh-keygen -t dsa -P '' -f /etc/ssh/ssh_host_dsa_key ssh-keygen -t rsa -P '' -f /etc/ssh/ssh ...

    随机推荐

    spring统一日志管理,切面(@Aspect),注解式日志管理

    step1 开启切面编程

    mysql主从配置(基于mysql5.5.x)

    安装mysql数据库主从复制,步骤如下:1.主从服务器分别作以下准备:    1.1.数据库版本完全一致    1.2.修改root的密码, 不改也可以 2.修改主服务器master #vi /etc ...

    [转]安装openoffice,并且配置为windows服务

    [转]安装openoffice,并且配置为windows服务 http://blog.csdn.net/zzzz3621/article/details/18400277 下载windows reso ...

    Medium上关于git的文章

    rebase和merge的正确使用时机 https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa ...

    jquery的事件绑定

    暂时有 bind(),live(),delegate(),on() 这四个事件监听函数 对应的4个事件解除函数分别是: unbind(),die(),undelegate(),off() bind:向 ...

    DOM方法

    DOM常用方法: 方法 描述 getElementById() 返回带有指定 ID 的元素. getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组 ...

    位运算 (&|)与--或 一位数组表示多种意思~~ 与--或

    var arr:Array = [0,1,2,4,8,16] var gate:int = 0; gate |= arr[1] gate |= arr[2] gate |= arr[3] trace( ...

    EVM项目管理

    详细参照:https://zhuanlan.zhihu.com/p/33925657 报告日实际: 按预算完成 按原始cpi完成 按时完成

    【HNOI2018】排列

    [HNOI2018]排列 神仙贪心题. 题目说这么大堆东西就是想告诉你这是个森林,选了\(v\)的父亲后才能选\(v\). 我们设\(w_v\)为\(v\)所在联通块权值和,\(size_v\)表示\ ...

    module模块和包(十七)

    在前面的几个章节中我们脚本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python 提供了一个办法,把这些定义存放在文 ...

    更多相关内容
  • TCP socket 中的长连接与连接的区别

    千次阅读 2020-07-02 14:54:04
    当网络通信时采用TCP协议时,在真正的读写操作之前,serverclient之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接连接的建立是需要三次握手的,而释放则需要4次握手,所以...

    1. TCP连接

    当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的

    经典的三次握手示意图:

    经典的四次握手关闭图:

    2. TCP短连接

    首先模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。从上面的描述看,短连接一般只会在client/server间传递一次读写操作。

    连接→数据传输→关闭连接

    短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段

    3.TCP长连接

    接下来再模拟一下长连接的情况,client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

     连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信) 
          这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态

    首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的连接。

    如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:

    1. 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
    2. 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
    3. 客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
    4. 客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。

    从上面可以看出,TCP保活功能主要为探测长连接的存活状况,不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。

    在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

    长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。

    3. 应用场景:

         长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

         而像WEB网站的http服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的长连接),因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好;

         在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

    4. 报文格式:

    通信报文格式多样性更多,相应地就必须设计对应的读写报文的接 收和发送报文函数。

    阻塞与非阻塞方式

    非阻塞方式:读函数不停的进行读动作,如果没有报文接收到,等待一段时间后超时返回,

    这种情况一般需要指定超时时间。

    阻塞方式:如果没有接收到报文,则读函数一直处于等待状态,知道报文到达。

    循环读写方式

    1. 一次直接读写报文:在一次接收或发送报文动作中一次性不加分别地全部读取或全部发送报文字节。

    2. 不指定长度循环读写:这一版发生在短连接进程中,受网络路由等限制,一次较长的报文可能在网络传输过程中被分解成很多个包,一次读取可能不能全部读完一次报文,这就需要循环读取报文,直到读完为止。

    3. 带长度报文头循环读写:这种情况一般在长连接中,由于在长连接中没有条件能够判断循环读写什么时候结束。

         必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读报文,实际情况中,报头码制格式还经常不一样,

    如果是非ASCII的报文头,还必须转换成ASCII常见的报文头编制有:

    1. n个字节的ASCII码。

    2. n个字节的BCD码。

    3. n个字节的网络整型码。

    以上是几种比较典型的读写报文方式,可以与通信方式模板一起 预先提供一些典型的API读写函数。

    当然在实际问题中,可能还必须编写与对方报文格式配套的读写API. 在实际情况中,往往需要把我们自己的系统与别人的系统进行连接, 有了以上模板与API,可以说连接任何方式的通信程序都不存在问题。

     

    参考链接:

     http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html 

    https://www.cnblogs.com/qqzy168/p/3141703.html

    展开全文
  • JDBC数据库连接

    万次阅读 多人点赞 2018-10-24 23:58:23
    JDBC简介,driver类型,JDBC连接,使用技巧; 连接,短连接,长连接连接池; 池化思想; 配置,基本配置,关键配置,性能配置; 连接池工具; druid; HikariCP; flexy-pool;

    JDBC

    简介

    JDBC 是Java应用程序用来连接关系型数据库的标准API,为多种关系型数据库提供一个统一的访问接口。Sun公司一共定义4种 JDBC 驱动类型,一般使用第4种,该类型的Driver完全由Java代码实现,通过使用socket与数据库进行通信。

    1. JDBC-ODBC Bridge driver (bridge driver),JDBC-ODBC桥驱动程序;
    2. Native-API/partly Java driver (native driver),JDBC本地API;
    3. All Java/Net-protocol driver (middleware driver),JDBC-Net纯Java;
    4. All Java/Native-protocol driver (Pure java driver),100%纯Java。

    常规数据库连接一般由以下六个步骤构成:

    • 装载数据库驱动程序;
    • 建立数据库连接;
    • 创建数据库操作对象;
    • 访问数据库,执行sql语句;
    • 处理返回结果集;
    • 断开数据库连接。

    此处省略常规 JDBC 获取连接、执行SQL、获取结果集代码,一般严格遵守上面的流程,网上一大堆;

    连接角度看 JDBC

    在这里插入图片描述
    上图大致画出以访问MySQL为例,执行一条 SQL 命令,不使用连接池的情况下,需要经过哪些流程。

    1. TCP建立连接的三次握手;
    2. MySQL认证的三次握手;
    3. 真正的SQL执行;
    4. MySQL的关闭;
    5. TCP的四次握手关闭;

    为了执行一条SQL,有很多网络交互。
    优点:实现简单。
    缺点:

    1. 网络IO较多;
    2. 数据库的负载较高;
    3. 响应时间较长及QPS较低;
    4. 应用频繁的创建连接和关闭连接,导致临时对象较多,GC频繁;
    5. 在关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)。

    JDBC技巧

    1. 使用PrearedStatement,可以通过预编译的方式避免在拼接SQL时造成SQL注入。
    2. 使用ConnectionPool
    3. 禁用自动提交
      这个最佳实践在我们使用JDBC的批量提交的时候显得非常有用,将自动提交禁用后,你可以将一组数据库操作放在一个事务中,而自动提交模式每次执行SQL语句都将执行自己的事务,并且在执行结束提交。
    4. 使用Batch Update:批量更新/删除,比单个更新/删除,能显著减少数据传输的往返次数,提高性能。
    5. 使用列名获取ResultSet中的数据,从而避免invalidColumIndexError
      JDBC中的查询结果封装在ResultSet中,我们可以通过列名和列序号两种方式获取查询的数据,当我们传入的列序号不正确的时候,就会抛出invalidColumIndexException,例如你传入了0,就会出错,因为ResultSet中的列序号是从1开始的。另外,如果你更改了数据表中列的顺序,你也不必更改JDBC代码,保持了程序的健壮性。有一些Java程序员可能会说通过序号访问列要比列名访问快一些,确实是这样,但是为了程序的健壮性、可读性,我还是更推荐你使用列名来访问。
    6. 使用变量绑定而不是字符串拼接
      使用PreparedStatment可以防止注入,而使用?或者其他占位符也会提升性能,因为这样数据库就可以使用不同的参数执行相同的查询,提示性能,也防止SQL注入。
    7. 关闭Connection 等资源,确保资源被释放;
    8. 选择合适的JDBC驱动,参考前文,选择第四种;
    9. 尽量使用标准的SQL语句,从而在某种程度上避免数据库对SQL支持的差异
      不同的数据库厂商的数据库产品支持的SQL的语法会有一定的出入,为了方便移植,推荐使用标准的ANSI SQL标准写SQL语句。
    10. 使用正确的getXXX()方法
      当从ResultSet中读取数据的时候,虽然JDBC允许你使用getString()和getObject()方法获取任何数据类型,推荐使用正确的getter方法,这样可以避免数据类型转换。

    连接池

    先看看连接的简介。

    连接

    当数据库服务器和客户端位于不同的主机时,就需要建立网络连接来进行通信。客户端必须使用数据库连接来发送命令和接收应答、数据。通过提供给客户端数据库的驱动指定连接字符串后,客户端就可以和数据库建立连接。查阅程序语言手册来获知通过何种方式使用短连接、长连接。

    1. 短连接
      短连接是指程序和数据库通信时需要建立连接,执行操作后,连接关闭。短连接简单来说就是每一次操作数据库,都要打开和关闭数据库连接,基本步骤是:连接 -> 数据传输 -> 关闭连接

    在慢速网络下使用短连接,连接的开销会很大;在生产繁忙的系统中,连接也可能会受到系统端口数的限制,如果要每秒建立几千个连接,那么连接断开后,端口不会被马上回收利用,必须经历一个FIN阶段等待,直到可被回收利用为止,这样就可能会导致端口资源不够用。在Linux上,可以通过调整/proc/sys/net/ipv4/ip_local_port_range来扩大端口的使用范围;调整/proc/sys/net/ipv4/tcp_fin_timeout来减少回收延期(如果想在应用服务器上调整这个参数,一定要慎重!)。
    另外一个办法是主机使用多个IP地址。端口数的限制其实是基于同一个IP:PORT的,如果主机增加IP,MySQL就可以监听多个IP地址,客户端也可以选择连接某个IP:PORT,这样就增加端口资源。

    1. 长连接
      长连接是指程序之间的连接在建立之后,就一直打开,被后续程序重用。使用长连接的初衷是减少连接的开销。当收到一个永久连接的请求时,检查是否已经存在一个相同的永久连接。存在则复用;不存在则重新建立一个新的连接。所谓相同的连接是指基本连接信息,即用户名、密码、主机及端口都相同。

    从客户端的角度来说,使用长连接有一个好处,可以不用每次创建新连接,若客户端对MySQL服务器的连接请求很频繁,永久连接将更加高效。对于高并发业务,如果可能会碰到连接的冲击,推荐使用长连接或连接池。

    从服务器的角度来看,它可以节省创建连接的开销,但维持连接也是需要内存的。如果滥用长连接的话,可能会使用过多的MySQL服务器连接。现代的操作系统可以拥有几千个MySQL连接,但很有可能绝大部分都是睡眠状态的,这样的工作方式不够高效,而且连接占据内存,也会导致内存的浪费。

    对于扩展性好的站点来说,其实大部分的访问并不需要连接数据库。如果用户需要频繁访问数据库,那么可能会在流量增大的时候产生性能问题,此时长短连接都是无法解决问题的,所以应该进行合理的设计和优化来避免性能问题。

    如果客户端和MySQL数据库之间有连接池或Proxy代理,一般在客户端推荐使用短连接。对于长连接的使用一定要慎重,不可滥用。如果没有每秒几百、上千的新连接请求,就不一定需要长连接,也无法从长连接中得到太多好处。在Java语言中,由于有连接池,如果控制得当,则不会对数据库有较大的冲击,但PHP的长连接可能导致数据库的连接数超过限制,或者占用过多的内存。

    1. 连接池
      数据库连接池是一些网络代理服务或应用服务器实现的特性,实现一个持久连接的“池”,允许其他程序、客户端来连接,这个连接池将被所有连接的客户端共享使用,连接池可以加速连接,也可以减少数据库连接,降低数据库服务器的负载。

    2. 持久连接和连接池的区别
      长连接是一些驱动、驱动框架、ORM工具的特性,由驱动来保持连接句柄的打开,以便后续的数据库操作可以重用连接,从而减少数据库的连接开销。而连接池是应用服务器的组件,它可以通过参数来配置连接数、连接检测、连接的生命周期等。

    如果连接池或长连接使用的连接数很多,有可能会超过数据库实例的限制,那么就需要留意连接相关的设置,比如连接池的最小、最大连接数设置,以及php-fpm的进程个数等,否则程序将不能申请新的连接。

    最小连接数和最大连接数的设置要考虑到以下几个因素:
    最小连接数:连接池一直保持的数据库连接,如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
    最大连接数:连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作;
    如果最小连接数与最大连接数相差很大:那么最先连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过这些大于最小连接数的数据库连接在使用完不会马上被释放,将被放到连接池中等待重复使用或是空间超时后被释放。

    池化

    连接池类似于线程池或者对象池,数据库连接池为系统的运行带来以下优势:

    • 昂贵的数据库连接资源得到重用;
    • 减少数据库连接建立和释放的时间开销,提高系统响应速度;
    • 统一的数据库连接管理,避免连接资源的泄露。

    连接池负责:连接建立、连接释放、连接管理、连接分配。

    数据库连接池运行机制:
    系统初始化时创建连接池,程序操作数据库时从连接池中获取空闲连接,程序使用完毕将连接归还到连接池中,系统退出时,断开所有数据库连接并释放内存资源。

    数据库连接池生命周期
    数据库每个读写操作需要一个连接。数据库连接调用流如下图:
    在这里插入图片描述
    调用流程为:

    • 应用数据层向DataSource请求数据库连接
    • DataSource使用数据库Driver打开数据库连接
    • 创建数据库连接,打开TCP socket
    • 应用读/写数据库
    • 如果该连接不再需要就关闭连接
    • 关闭socket

    为什么连接池快很多?
    分析池连接管理的调用流程:
    在这里插入图片描述
    无论何时请求一个连接,池数据源会从可用的连接池获取新连接。仅当没有可用的连接而且未达到最大的连接数时连接池将创建新的连接。close()方法把连接返回到连接池而不是真正地关闭它。
    在这里插入图片描述
    重用数据库连接最明显的原因:

    • 减少应用程序和数据库管理系统创建/销毁TCP连接的OS I/O开销
    • 减少JVM对象垃圾
    • 缓冲安全:连接池是即将到来的连接请求的有界缓冲区。如果出现瞬间流量尖峰,连接池会平缓这一变化,而不是使所有可用数据库资源趋于饱和。
    • 等待步骤和超时机制,可有效防止数据库服务器过载。如果一个应用消耗太多数据库流量,为防止它将数据库服务器压垮,连接池将减少它对数据库的使用。

    配置

    连接池配置大体可以分为基本配置、关键配置、性能配置等主要配置。

    基本配置

    基本配置是指连接池进行数据库连接的四个基本必需配置:传递给JDBC驱动的用于连接数据库的用户名、密码、URL以及驱动类名。
    在Druid连接池的配置中,driverClassName可配可不配,如果不配置会根据url自动识别dbType(数据库类型),然后选择相应的driverClassName。

    关键配置

    为了发挥数据库连接池的作用,在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
    最小连接数:是数据库一直保持的数据库连接数,所以如果应用程序对数据库连接的使用量不大,将有大量的数据库资源被浪费。
    初始化连接数:连接池启动时创建的初始化数据库连接数量。
    最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求被加入到等待队列中。
    最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间,超过时间则抛出异常,可设置参数为0或者负数使得无限等待(根据不同连接池配置)。

    数据库连接池在初始化的时候会创建initialSize个连接,当有数据库操作时,会从池中取出一个连接。如果当前池中正在使用的连接数等于maxActive,则会等待一段时间,等待其他操作释放掉某一个连接,如果这个等待时间超过maxWait,则会报错;如果当前正在使用的连接数没有达到maxActive,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。

    性能配置

    预缓存设置:PSCache,对支持游标的数据库性能提升巨大,比如说oracle。JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池,所以设置这个参数需要考虑到多方面的因素。
    单个连接拥有的最大缓存数:要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

    连接有效性检测设置:连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。如果当前连接池中某个连接在空闲timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。当然,为了保证绝对的可用性,你也可以使用testOnBorrow为true(即在获取Connection对象时检测其可用性),不过这样会影响性能。

    超时连接关闭设置:removeAbandoned参数,用来检测当前使用的连接是否发生连接泄露,所以在代码内部就假定如果建立连接的时间很长,则将其认定为泄露,继而强制将其关闭掉。

    工具

    • C3P0:开源JDBC连接池,实现数据源和JNDI绑定,包括实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。单线程,性能较差,适用于小型系统,代码600KB左右。
    • BoneCP:开源的快速的 JDBC 连接池。只有四十几K(运行时需要log4j和Google Collections的支持)。另外个人觉得 BoneCP 有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。官方说法BoneCP是一个高效、免费、开源的Java数据库连接池实现库。设计初衷就是为了提高数据库连接池性能,完美集成到一些持久化产品如Hibernate和DataNucleus中。特色:高度可扩展,快速;连接状态切换的回调机制;允许直接访问连接;自动化重置能力;JMX支持;懒加载能力;支持XML和属性文件配置方式;较好的Java代码组织。
    • DBCP:Database Connection Pool,一个依赖Jakarta commons-pool对象池机制的数据库连接池,单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。
    • Tomcat Jdbc Pool:Tomcat在7.0以前都是使用common-dbcp做为连接池组件,但是dbcp是单线程,为保证线程安全会锁整个连接池,性能较差,dbcp有超过60个类,也相对复杂。Tomcat从7.0开始引入新增连接池模块叫做Tomcat jdbc pool,基于Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通过异步方式获取连接,支持高并发应用环境,超简单,核心文件只有8个,支持JMX,支持XA Connection。
    • Druid:下面详细讲解;
    • HikariCP:下面详细讲解;

    本文不会详细介绍前面几种连接池工具,基本上过时;

    Druid

    简介

    阿里出品,淘宝和支付宝专用数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。支持所有JDBC兼容的数据库。Druid针对Oracle和MySQL特别优化,比如Oracle的PS Cache内存占用优化,MySQL的ping检测优化。Druid提供SQL-92的SQL的完整支持,这是一个手写的高性能SQL Parser,支持Visitor模式,使得分析SQL的抽象语法树很方便。Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;
    简单SQL语句用时10微秒以内,复杂SQL用时30微秒。
    通过Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析语义实现的。

    • Proxool:一个Java SQL Driver驱动程序,完全可配置。

    todo

    spring boot with druid

    以目前也是以后的 Java EE 发展方向的spring boot 为例,说明如何集成druid。其他传统 SSH & SSM应用架构大致类似,但是配置会复杂一些;

    HikariCP

    简介

    新一代数据库连接池,性能相当优异,spring boot 2 默认使用的 dbcp 从之前的 tomcat-pool 换成HikariCP 。
    在 druid 以及 HikariCP 出现之前,BoneCP 可以说是性能最好的 dbcp 之一,https://jolbox.com/index.html?page=https://jolbox.com/benchmarks.html
    官网:http://www.jolbox.com/

    可是现在,BoneCP 的GitHub 的截图。
    在这里插入图片描述
    GitHub

    优势

    Springboot 2.0 默认使用的连接池换成HikariCP,因为其性能格外优异。而其性能来源于HikariCP的在以下几个方面的优化:

    1. 字节码精简 :优化代码,直到编译后的字节码最少,这样CPU缓存可以加载更多的程序代码;
    2. 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
    3. 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描;
    4. 自定义集合类型,使用ConcurrentBag提高并发读写的效率;
    5. 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究。

    JDBC连接池的实现,主要是对JDBC中几个核心对象Connection、Statement、PreparedStatement、CallableStatement以及ResultSet的封装与动态代理。

    参考:GitHub-HikariCP-wiki

    常用配置项

    • dataSourceClassName
      接收字符串值,默认为空。JDBC driver 提供的 DataSource 类名。不同的 JDBC driver 会有其相对应的类名(不支持 XA data sources)。如果使用了 jdbcUrl 配置项则不需要配置此项。
    • jdbcUrl
      接收字符串值,默认为空。此属性将使 HikariCP 使用“基于驱动管理器”(DriverManager-based)的配置。由于多种原因,我们认为基于数据源(DataSource-based)的配置是更好的选择。但对许多部署实例来讲却也区别不大。当使用此属性来配置“旧”的 JDBC 驱动时,你可能也需要设置 driverClassName 属性,但可以试一试不设置是否能行得通。
    • username / password
      接收字符串值,默认为空。对 DataSource 来讲,username和password仅会在调用 DataSource.getConnection(username, password) 时用到。但在使用基于驱动(Driver-based)配置时,HikariCP 会使用 username 的值去设置调用 DriverManager.getConnection(jdbcUrl, props) 方法时传入的 Properties 中的 user 属性。如果并不是你想要的,你需要避免执行这个方法。
    • autoCommit
      布尔值,默认为 true。控制从连接池中返回的连接的 auto-commit 行为。通常情况下会设置为 false。比如使用Spring 统一管理数据库事务,这时就需要禁用 auot-commit。
    • connectionTimeout
      接收数值,默认为30000(30秒),最小可接收值为250ms。设置客户端获取连接前等待的最大毫秒数,即超时时间。如果超过了这个时间后仍然没有可用的数据库连接返回,SqlException 则会被抛出。
    • idleTimeout
      接收数值,默认为600000(10分),最小可接收值为10000(10秒)。此属性控制一个连接保持空闲状态的最大超时时间。只有当 minimumIdle 小于 maximumPoolSize 时此属性才会生效。一个数据库连接是否退化为空闲状态需要平均15秒+,最多30秒+。设置0表示空闲的连接永远不会从连接池中销毁。
    • maxLifetime
      接收数值,默认为1800000(30分)。此属性为单个连接在连接池中的最长生命周期时间。连接只有在被关闭后才会被移除。强烈建议设置此属性,并且至少应该比任何数据库或组件强制要求的连接时间少30秒。此属性设置为0表示没有最长生命周期时间。
    • connectionTestQuery
      接收字符串值,默认为空。如果数据库驱动支持 JDBC4,则强烈建议不要设置此属性。此属性是为那些不支持 JDBC4 Connection.isValid() API 的老旧数据库准备的。这条查询语句会在连接从连接池返回给客户端之前执行,用以验证返回的数据库连接仍然可用。再次重申,在不设置此属性时尝试启动数据库连接池,如果你的数据库驱动不支持 JDBC4,HikariCP 会记录下错误信息。
      在 c3p0 中,这个属性的名称是 preferredTestQuery;在 tmocat-jdbc 中,这个属性的名称叫做 validationQuery。属性值一般设置为 “Select 1”。
    • minimumIdle
      接收数值,默认和 maximumPoolSize 相同。设置 HikariCP 在连接池中保存的最少空闲连接数。如果空闲连接数少于此属性值,HikariCP 会尽力快速高效的增加连接。不过,为了最高性能和峰值弹性需求,我们建议不要设置此属性,而是让 HikariCP 作为一个固定大小的连接池。
    • maximumPoolSize
      接收数值,默认为10。设置 HikariCP 在连接池中保存的最多连接数,包括空闲的和正在使用的连接。此属性的合理值应该由程序的运行环境决定。当连接池中没有空闲连接,调用 getConnection() 会一直阻塞直到超过 connectionTimeout 设置的超时时间。
    • poolName
      接收字符串值,默认值为自动生成。此属性为连接池设置用户自定义的名称,并会在日志中显示。设置连接池名称主要是为了配合 JMX 在控制台日志中区分不同的连接池和连接池配置。注意,通过我们实践发现,如果需要配合使用 JMX,最好设置自定义的连接池名称。使用默认的自动生成的连接池名称有可能会出现意想不到的问题。
    • prepStmtCacheSize
      接收数值,默认为25。此属性设置 MySQL 驱动在每个连接会缓存的 Prepared Statement 数量。推荐设为250到500之间。
    • prepStmtCacheSqlLimit
      接收数值。此属性为 MySQL 驱动缓存的 Prepared SQL statement 的最大长度。MySQL 默认为256。此默认值远远小于生成的语句长度,推荐将其设置为2048。
    • cachePrepStmts
      布尔值,默认为 false。打开预处理语句缓存。如果为 false,prepStmtCacheSize 和 prepStmtCacheSqlLimit 都不会起作用。
    • useServerPrepStmts
      布尔值。新版的 MySQL 支持服务端预处理语句,这可以极大的提高性能。新版MySQL建议设置为 true。

    spring boot with HikariCP

    initialSize:默认值是 0,连接池创建连接的初始连接数目。
    minIdle : 默认是 0,连接数中最小空闲连接数。
    maxIdle : 默认是 8,连接池中最大空闲连接数。
    maxActive : 默认值是 8, 连接池中同时可以分派的最大活跃连接数。
    maxWait : 默认值是无限大,当连接池中连接已经用完,等待建立一个新连接的最大毫秒数 ( 在抛异常之前 )。
    validationQuery : 一条 sql 语句,用来验证数据库连接是否正常。这条语句必须是一个查询模式,并至少返回一条数据。一般用“ select 1 ”。
    minEvictableIdleTimeMilis : 默认值是 1000 * 60 * 30(30 分钟 ) 单位毫秒,连接池中连接可空闲的时间。
    timeBetweenEvictionRunsMilis : 默认值是 -1 ,每隔一段多少毫秒跑一次回收空闲线程的线程。
    对于minEvictableIdleTimeMilis、timeBetweenEvictionRunsMilis这两个参数,timeBetweenEvictionRunsMilis必须大于1且小于minEvictableIdleTimeMilis,建议是minEvictableIdleTimeMilis的五分之一或十分之一。

    HikariCP v.s. Druid

    不具有可比性,HikariCP 追求性能,Druid 偏向监控;druid 默认开启公平锁导致性能下降,有阿里生产环境大数据验证。
    参考:issue

    其他工具

    flexy-pool

    GitHub
    GitHub-wiki
    tutorials

    FlexyPool adds metrics and fail-over strategies to a given Connection Pool, allowing it to resize on demand.
    大意:增加监控,容错,和自适应调整参数功能。

    从其GitHub源码组织结构,即可得知,根据不同的连接池工具,引用不同的依赖。

    优化

    数据库连接池本质上是一种缓存,它是一种抗高并发的手段。数据库连接池优化主要是对参数进行优化,DBCP连接池的具体参数如下(其他各种连接池的配置参数大同小异,需要区别对待):

    • initialSize:初始连接数,第一次getConnection的,而不是应用启动时。初始值可以设置为并发量的历史平均值;
    • minIdle:最小保留的空闲连接数。DBCP会在后台开启一个回收空闲连接的线程,当该线程进行空闲连接回收的时候,会保留minIdle个连接数。一般设置为5,并发量实在很小可以设置为1.
    • maxIdle:最大保留的空闲连接数,按照业务并发高峰设置。比如并发高峰为20,那么当高峰过去后,这些连接不会马上被回收,如果过一小段时间又来一个高峰,那么连接池就可以复用这些空闲连接而不需要频繁创建和关闭连接。
    • maxActive:最大活跃连接数,按照可以接受的并发极值设置。比如单机并发量可接受的极值是100,那么这个maxActive设置成100后,就只能同时为100个请求服务,多余的请求会在最大等待时间之后被抛弃。这个值必须设置,可以防止恶意的并发攻击,保护数据库。
    • maxWait:获取连接的最大等待时间,建议设置的短一点,比如3s,这样可以让请求快速失败,因为一个请求在等待获取连接的时候,线程是不可以被释放的,而单机的线程并发量是有限的,如果这个时间设置的过长,比如网上建议的60s,那么这个线程在这60s内是无法被释放的,只要这种请求一多,应用的可用线程就少了,服务就变得不可用了。
    • minEvictableIdleTimeMillis:连接保持空闲而不被回收的时间,默认30分钟。
    • validationQuery:检测连接是否有效的sql语句,建议设置;
    • testOnBorrow:申请连接的时候对连接进行检测,不建议开启,严重影响性能;
    • testOnReturn:归还连接的时候对连接进行检测,不建议开启,严重影响性能;
    • testWhileIdle:开启以后,后台清理连接的线程会没隔一段时间对空闲连接进行validateObject,如果连接失效则会进行清除,不影响性能,建议开启;
    • numTestsPerEvictionRun:代表每次检查链接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的链接;
    • 预热连接池:对于连接池,建议在启动应用的时候进行预热,在还未对外提供访问之前进行简单的sql查询,让连接池充满必要的连接数。

    参考:
    JDBC驱动程序类型
    MySQL之长连接、短连接、连接池
    the-anatomy-of-connection-pooling
    数据库连接池极简教程
    高性能数据库连接池的内幕
    五大理由分析Springboot 2.0为什么选择HikariCP

    展开全文
  • 深入分析内连接、外连接、左连接、右连接、等值连接、自然连接和自连接之间的区别,看这篇就够了!

    多表查询经常用到连接,各种连接之间的区别应该注意总结。

    首先大概认识各种连接的关系和由来:

    表之间的连接常有以下两种:
    一、:在SELECT语句的WHERE子句中使用比较运算符给出连接条件,对表进行连接,将这种表示形式称为连接谓词表示形式。连接谓词中的比较符可以是<、<=、=、>、>=、!=、<>、!< 和 !>,当比较符为“=”时,就是等值连接,等值连接的结果中有重复列,在目标列中去除相同的字段名就是自然连接。
    二、.以JOIN关键字指定的连接,T-SQL扩展了以JOIN关键字指定连接的表示方式,使表的连接运算能力有所增强,以JOIN关键字指定的连接有三种类型:内连接、外连接、交叉连接(笛卡尔积)。

    下面详细分析各种连接方式的特点:

    1.等值连接(相等连接):

       USE  PXSCJ
    GO
    SELECT XSB.* , CJB.*
    	FROM  XSB , CJB
    	WHERE XSB.学号 = CJB.学号
    

    使用”=”关系将表连接起来的查询,其查询结果中列出被连接表中的所有列,包括其中的重复列。

    2.自然连接:

    数据库应用中最常用的是“自然连接”,它在目标列中去除相同的字段名。

      SELECT XSB.* , CJB.课程号, CJB.成绩
    	FROM XSB , CJB
    	WHERE XSB.学号= CJB.学号
    

    进行自然连接运算要求两个表有共同属性(列),自然连接运算的结果表是在参与操作的两个表的共同属性上进行等值连接后,再去除重复的属性后所得的新表。

    等值连接和自然连接的区别:

    1)等值连接中不要求相等属性值的属性名相同,而自然连接要求相等属性值的属性名必须相同,即两关系只有在同名属性才能进行自然连接。
    2)等值连接不将重复属性去掉,而自然连接去掉重复属性,也可以说,自然连接是去掉重复列的等值连接。

    3.内连接

    指定了INNER关键字的连接是内连接,内连接按照ON所指定的连接条件合并两个表,返回满足条件的行。内连接是系统默认的,可以省略INNER关键字。使用内连接后仍可使用WHERE子句指定条件。

    例1   SELECT  *
    	FROM  XSB  INNER  JOIN  CJB 
    			ON  XSB.学号 =CJB.学号
    

      例2  SELECT 姓名, 成绩
            	FROM XSB JOIN CJB 
            			ON XSB.学号 = CJB.学号 
            	WHERE 课程号 = '206'  AND 成绩>=80
    

    4.自连接

    自连接作为一种特例,可以将一个表与它自身进行连接,称为自连接。若要在一个表中查找具有相同列值的行,则可以使用自连接。使用自连接时需为表指定两个别名,且对所有列的引用均要用别名限定。

    SELECT a.学号, a.课程号, b.课程号, a.成绩
    	FROM CJB a  JOIN  CJB b 
    			ON  a.成绩=b.成绩 AND  a.学号=b.学号 AND  a.课程号!=b.课程号
    

    结果

    5.外连接(左外连接,右外连接、全外连接)

    指定了OUTER关键字的为外连接,外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接包括以下三种:

    左外连接(LEFT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行。
    【例】 查找所有学生情况,以及他们选修的课程号,若学生未选修任何课,也要包括其情况

     SELECT XSB.* , 课程号
       	FROM  XSB  LEFT OUTER JOIN CJB 
    			ON  XSB.学号 = CJB.学号
    

    本例执行时,若有学生未选任何课程,则结果表中相应行的课程号字段值为NULL。

    右外连接(RIGHT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行。

    完全外连接(FULL OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。
    其中的OUTER关键字均可省略**

    6.交叉连接(又名笛卡尔积)

    首先,先简单解释一下笛卡尔积。
    有两个集合A和B,A = {0,1} B = {2,3,4}
    集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:

    A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
    B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
    

    以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’
    从以上的数据分析我们可以得出以下两点结论:
    1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;
    2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性,即两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数。

    交叉连接:       SELECT  *    from   表1   JOIN    表2;
    

    交叉连接实际上是将两个表进行笛卡尔积运算,结果表是由第一个表的每一行与第二个表的每一行拼接后形成的表,称为‘笛卡尔积表’,结果表的行数等于两个表的行数之积。

    如果两张表的数据量都比较大的话,那样就会占用很大的内存空间这显然是不合理的。所以,我们在进行表连接查询的时候一般都会使用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,也就是说两张表数据行之间进行匹配的时候,会先判断数据行是否符合ON语句后面的条件,再决定是否JOIN。

    因此,有一个显而易见的SQL优化的方案是,当两张表的数据量比较大,又需要连接查询时,应该使用 FROM table1 JOIN table2 ON xxx的语法,避免使用 FROM table1,table2 WHERE xxx 的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,增加了内存的开销。
      
      技术交流微信:intboy520

    展开全文
  • ktv设备显示屏怎么连接

    千次阅读 2021-08-06 00:18:45
    我们去ktv看到的一般都是点歌机和显示器相连接,只要在点歌机上点出歌曲,显示器上就会显示出来,那么ktv设备显示屏怎么连接的呢?接下来我们到佰佰安全网中找寻一下答案。硬件的配置:在双屏的操作上(KTV包间里面...
  • ASP连接Oracle数据库简易DEMO完全案例

    千次阅读 2019-04-03 21:57:57
    ASP连接Oracle数据库简易DEMO案例 以下演示使用ASP如何连接Oracle数据库。 我是部署在本机上,自己做的测试。 ASP网站操作系统:Windows7 64位, 数据库服务器系统:Windows 2008R2 (或Windows 7也可以) 64位。 1. ...
  • 连接:查询出来的结果肯定会满足所有的条件 select columns from table1 [inner] join table2 on table1.column = table2.cloumn;左/右外连接:查询出来的结果存在不满足条件的可能 select columns from table1...
  • TCP长连接实践挑战

    千次阅读 2022-01-27 15:39:05
    本文介绍了tcp长连接在实际工程中的实践过程,并总结了tcp连接保活遇到的挑战以及对应的解决方案。
  • python字符串连接的方法,一般有以下三种:方法1:直接通过加号(+)操作符连接website = 'python' + 'tab' + '.com'方法2:join方法listStr = ['python', 'tab', '.com']website = ''.join(listStr)方法3:替换website...
  • oracle远程连接(简单版)

    千次阅读 2019-05-08 20:51:51
    oracle远程连接 详细版看我这篇文章 /*oracle远程连接 oracle安装完成之后,在管理中可以看到几个服务,我就不一一列出了,只 列出其中几个 OracleDBConsoleorcl (oracle的企业管理器服务) OracleJobSchedulerORCL...
  • tcp长连接与连接

    2020-08-07 18:04:38
    当网络通信采用tcp协议时,在真正的读写操作之前,severclient之间必须建立一个连接,当读写操作完成之后,对方不再需要这个连接时他们可以释放这个链接,连接连接需要三次握手,释放需要四次握手,也就是说每个...
  • HTTP长连接与短链接以及推送技术原理

    千次阅读 多人点赞 2017-04-04 15:33:51
    HTTP长连接和短连接以及推送服务原理 HTTP长连接和短连接1 ...IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序
  • 大家可能会有这样疑问:连接池类似于线程池或者对象池,就是一个放连接的池子,使用的时候从里面拿一个,用完了再归还,功能非常简单,有什么可讲的。可能还会有这样的疑问:高性能这么高大上,一个小小的连接池,...
  • 来源:blog.csdn.net/qq_44756792/article/details/95503303多表查询经常用到连接,各种连接之间的区别应该注意总结。首先大概认识各种连接的关系和...
  • 连接(inner join)连接(outer join)小结

    万次阅读 多人点赞 2017-10-14 15:42:05
    1. 内连接首先说明内连接的一个重要性质:内连接查询结果表的顺序无关 (当然顺序可能会发生变化,但是对应关系绝对不会错乱!!!)1.1 交叉连接(cross join)当然,他还有其他的名字,比如:笛卡尔积,交叉积...
  • MySQL INNER JOIN:内连接查询

    千次阅读 2021-01-27 20:07:41
    连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。...如果没有任何条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。语法格式如下:SELECT FROM INNER JO...
  • 一、背景介绍 1.1 什么是连接池 数据库连接池负责分配、管理和释放... 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解...
  • 断开连接则需要四次握手(客户端和服务端都可以发起,FIN-ACK-FIN-ACK)。 1、为什么连接的时候是三次握手,关闭的时候却是四次握手? 答: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为当...
  • 什么是连接池 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。 为什么要使用连接池  数据库连接是一种关键的有限的昂贵的资源,这一点在多...
  • 当网络通信时采用TCP协议时,在真正的读写操作之前,serverclient之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接连接的建立是需要三次握手的,而释放则需要4次挥手,所以...
  • cf连接服务器失败怎么办

    千次阅读 2021-08-04 01:54:42
    cf连接服务器失败的简单解决方法教程自己检查下网络连接,看看是不是网络延时太高照成的。可以在网上下载加速软件或者找宽带客服申请宽带加速解决。也可以在登陆游戏前把没用的程序关掉,来增强游戏的读...
  • TCP建立连接和关闭连接的过程

    千次阅读 2018-03-07 18:11:56
    先来一张图看看整个连接和关闭的过程: 各个状态的意义如下: LISTEN:侦听来自远方TCP端口...ESTABLISHED:代表一个打开的连接,数据可以传送给用户; FIN-WAIT-1:等待远程TCP的连接中断请求,或先前的连接中...
  • 拥塞控制 TCP通信的每一方需要执行的一系列行为。这些行为由特定算法规定,用于防止网络因为大...当网络中大量的发送方和接收方被要求承担超负荷的通信任务时,可以考虑采取降低发送速率或者最终丢弃部分数据(也可将
  • TCP/IP,http,RPC、SOA、长连接连接

    千次阅读 2018-03-16 17:48:28
    TCP/IP建立TCP需要三次握手才能建立(客户端发起SYN,服务端SYN+ACK,客户端ACK),断开连接则需要四次握手(客户端和服务端都可以发起,FIN-ACK-FIN-ACK)。为什么连接的时候是三次握手,关闭的时候却是四次握手?答...
  • 简单的初级知识,也有深度经验分享。 问题: C4D模型塌陷可以取消或者复原吗 答案: 如果模型本身就是塌陷的,那么没有办法复原,如果是你手动塌陷的,可以ctrl+Z后退还原你之前做的步骤, 不过网上下的模型...
  • 文章目录Golang 侧数据库连接池原理和参数调优数据库连接池数据库连接池的设计Go 的数据库连接池Go 数据库连接池的设计建立连接释放连接清理连接配置 sql.DB 以获得更好的性能maxOpenmaxIdlemaxLifeTime在实践和压测...
  • Python3连接Mysql8.0遇到的问题及处理步骤最近在使用Python开发系统,需连接mysql...最简单的方法是更换了root密码的认证方式解决的,新版mysql使用的caching_sha2_password,成mysql_native_password我就可以连上...
  • 第8章 数据规整:连接、联合重塑 8.1 分层索引 分层索引是pandas的重要特性,允许你在一个轴向上拥有多个(两个或两个以上)索引层级。 笼统地说,分层索引提供了一种在更低维度的形式中处理更高维度数据的方式...
  • TCP连接与断开详解(socket通信)

    千次阅读 2020-12-23 04:50:35
    http://blog.csdn.net/Ctrl_qun/article/details/52518479一、TCP数据报结构以及三次握手TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立...
  • 电脑宽带连接651错误的解决方法

    千次阅读 2021-07-09 03:07:39
    出现651是由于用户终端电脑网通局端设备连接不通所导致的,有可能是外部断线或者设备出了问题,我们可以联系运营商解决,或者检查一下设备,具体的教程一起来看看吧。解决电脑宽带连接651错误的详细教程方法1:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 518,004
精华内容 207,201
关键字:

简单连接与完全连接可以互换吗