精华内容
下载资源
问答
  • 数据库连接池图解原理
  • Weblogic数据库连接池配置图解

    千次阅读 2018-12-04 10:35:06
    1、建立连接池 2、填写连接属性 3、测试连接配置 4、创建、部署 ...5、在connections面板上进行高级测试属性的配置 ...9、选择数据库源放置与那个连接池 10、选择目标服务器 11、配置成...

    1、建立连接池
    在这里插入图片描述
    2、填写连接属性
    在这里插入图片描述
    3、测试连接配置
    在这里插入图片描述
    4、创建、部署
    在这里插入图片描述
    5、在connections面板上进行高级测试属性的配置
    在这里插入图片描述
    在这里插入图片描述
    选中三个test选项
    在这里插入图片描述
    6、到testing处进行测试
    在这里插入图片描述
    表示在服务器myserver上部署成功
    在这里插入图片描述
    7、到datasources处配置数据源(jndi设置)
    在这里插入图片描述
    8、设置jndi名(重要)
    在这里插入图片描述
    9、选择数据库源放置与那个连接池
    在这里插入图片描述
    10、选择目标服务器
    在这里插入图片描述
    11、配置成功
    在这里插入图片描述
    12、编写简单的web程序测试数据源
    (略)

    展开全文
  • 简单但是非常实用,让你在短时间内掌握数据库对象信息的查找命令,掌握数据库连接池的原理
  • 数据库连接池图解原理
  • 数据库连接池

    千次阅读 2020-03-20 21:32:56
    文章目录数据库连接池一、 如何在python中操作数据库?二、 在web中使用原生sql(pymysql)操作数据库?2.1 在web中通过原生sql操作数据库会出现的问题。示例1:示例2示例3小结:2.1 什么是数据库连接池呢?2.2 Python...

    数据库连接池

    一、 如何在python中操作数据库?

    在后端开发中免不掉与数据库打交道,无非是使用orm或者原生sql来操作数据库。

    在python中通过原生sql操作数据库,主流就两种。

    • 使用pymysql模块:pymysql支持python2.xpython3.x的版本
    • 使用mysqldb模块:mysqldb仅支持python2.x的版本

    orm的使用以flask和django为例。

    • flask使用的orm是基于SQLAlchemy(SQLAlchemy本就是orm),flask团队并在SQLAlchemy基础之上又封装了一个Flask-SQLchemy并予以应用 。
    • django使用的orm是django自带的orm。

    orm的操作数据库的方式我们已经熟知了,这里我们聊一聊如何在web中使用原生sql操作数据库,以及会出现的问题。

    二、 在web中使用原生sql(pymysql)操作数据库?

    2.1 在web中通过原生sql操作数据库会出现的问题。

    1554343834169

    示例1:

    把所有的数据库操作全部都放在了视图函数里面。

    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        import pymysql
        CONN = pymysql.connect(host='127.0.0.1',
                               port=3306,
                               user='root',
                               password='123',
                               database='pooldb',
                               charset='utf8')
    
        cursor = CONN.cursor()
        cursor.execute('select * from tb1')
        result = cursor.fetchall()
        cursor.close()
    
        print(result)
    
        return "Hello World"
    
    if __name__ == '__main__':
        app.run()
    

    会出现的问题

    • 很多个用户并发的来请求,一个用户可以理解为一个线程,每个线程都会跟数据库建立连接,数据库承受不了这种量级的连接数。

    示例2

    为了避免之前每个用户都建立连接,我们把数据库连接放到了全局变量里面,只会建立一次连接,但是依然会出现问题。

    from flask import Flask
    
    app = Flask(__name__)
    import pymysql
    CONN = pymysql.connect(host='127.0.0.1',
                               port=3306,
                               user='root',
                               password='123',
                               database='pooldb',
                               charset='utf8')
    
    @app.route("/")
    def hello():
        cursor = CONN.cursor()
        cursor.execute('select * from tb1')
        result = cursor.fetchall()
        cursor.close()
    
        print(result)
    
        return "Hello World"
    
    if __name__ == '__main__':
        app.run()
    

    会出现的问题:

    • 会出现线程安全问题,比如如果第一个用户拿到了连接给关闭了,而第二个用户正在进行查询,第二个用户查询的时候第一个用户把连接断了,会导致第二个用户出现问题。
    • 假设第一用户查询了一下表1,正准备获取查询的内容,这时第二个人查询了一下表2,由于cursor对象都是同一个,第一个人获取到的查询内容就是表2的内容了,所以也会出现线程安全问题

    示例3

    为了避免之前的线程不安全,在示例2的基础上加上一把线程锁

    from flask import Flask
    import threading
    app = Flask(__name__)
    import pymysql
    CONN = pymysql.connect(host='127.0.0.1',
                               port=3306,
                               user='root',
                               password='123',
                               database='pooldb',
                               charset='utf8')
    
    @app.route("/")
    def hello():
        with threading.Lock():
            cursor = CONN.cursor()
            cursor.execute('select * from tb1')
            result = cursor.fetchall()
            cursor.close()
    
            print(result)
    
        return "Hello World"
    
    if __name__ == '__main__':
        app.run()
    

    会出现的问题

    • 根据代码可以发现,只是在示例2的基础上加了一把线程锁,确实是保证了线程安全,但是所有关于数据库操作的请求变成了串行,无法实现并发了。

    小结:

    • 如果直接连接坐在视图函数中,会导致每个用户都要创建连接,数据库承受不了这种量级的连接数。
    • 如果连接数据库的内容做成全局变量的话,无法保证线程安全。
    • 如果定义全局变量用于连接数据库,并且在线程中操作数据库内容加线程锁头,就会变成串行,无法保证并发

    所以我们既要控制数据库的连接数,又要保证线程安全,又要保证web的并发,这个时候最终的解决方案是数据库连接池。

    2.1 什么是数据库连接池呢?

    数据库连接池概念:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,这项技术能明显提高对数据库操作的性能。

    图解

    1553241307822

    通俗的讲就是,假设数据库连接池中有5个连接对象,每个用户简单理解为一个线程,比如现在有6个用户同时来访问,6个线程去数据库连接池里面申请数据库的连接对象。前5个线程每个都申请到了连接对象去操作数据库,每个线程使用完了数据库连接对象会归还给数据库连接池,那么第6个线程会等待前5个线程归还连接对象给连接池,再具体一点是:假设第一个线程使用完了连接对象,那么此时6个线程才会结束等待,从而申请到连接对象,以此类推。

    1554343980889

    2.2 Python数据库连接池DBUtiles

    DBUtils 是Python的一个用于实现数据库连接池的模块。

    首先安装一下DBUtils模块。

    pip install DBUtils
    

    DBUtils连接池的两种连接模式:

    **模式一:**为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,仅供自己的线程再次使用,当线程终止时,连接会自动关闭。(不推荐使用,因为这样需要自己控制线程数量)

    import pymysql
    from DBUtils.PersistentDB import PersistentDB
    from threading import local
    
    POOL = PersistentDB(
        creator=pymysql,  # 使用链接数据库的模块
        maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
        setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
        ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
        closeable=False,
        # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)
        threadlocal=None,  # 如果为none,用默认的threading.Loacl对象,否则可以自己封装一个local对象进行替换
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='pooldb',
        charset='utf8'
    )
    
    def func():
        conn = POOL.connection(shareable=False)
        cursor = conn.cursor()
        cursor.execute('select * from tb1')
        result = cursor.fetchall()
        cursor.close()
        conn.close()
    
    func()
    

    **模式二:**创建一批连接到连接池,供所有线程共享使用。

    import time
    import pymysql
    import threading
    from DBUtils.PooledDB import PooledDB, SharedDBConnection
    POOL = PooledDB(
        creator=pymysql,  # 使用链接数据库的模块
        maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
        mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
        maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
        maxshared=3,  # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
        blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
        maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
        setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
        ping=0,
        # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='pooldb',
        charset='utf8'
    )
    
    
    def func():
        conn = POOL.connection()
        cursor = conn.cursor()
        cursor.execute('select * from tb1')
        result = cursor.fetchall()
        conn.close()
    
    
    func()
    

    1554344066760

    2.3 实际开发小应用案例:

    案例目录:

    - app.py
    - db_helper.py
    

    app.py

    from flask import Flask
    from db_helper import SQLHelper
    
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        result = SQLHelper.fetch_one('select * from t1',[])
        print(result)
        return "Hello World"
    
    if __name__ == '__main__':
        app.run()
    

    db_helper.py

    import pymysql
    from DBUtils.PooledDB import PooledDB
    POOL = PooledDB(
        creator=pymysql,  # 使用链接数据库的模块
        maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数
        mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
        maxcached=5,  # 链接池中最多闲置的链接,0和None不限制
        maxshared=3,  # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
        blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
        maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制
        setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]
        ping=0,
        # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always
        host='127.0.0.1',
        port=3306,
        user='root',
        password='123',
        database='pooldb',
        charset='utf8'
    )
    
    
    class SQLHelper(object):
    
        @staticmethod
        def fetch_one(sql,args):
            conn = POOL.connection()
            cursor = conn.cursor()
            cursor.execute(sql, args)
            result = cursor.fetchone()
            conn.close()
            return result
    
        @staticmethod
        def fetch_all(self,sql,args):
            conn = POOL.connection()
            cursor = conn.cursor()
            cursor.execute(sql, args)
            result = cursor.fetchall()
            conn.close()
            return result
    

    以后在开发的过程中我们可以基于数据库连接池,基于pymysql,来实现自己个性化操作数据库的需求。

    展开全文
  • 数据库连接池的原理

    2019-07-22 15:53:03
    数据库连接池原理: 图解: 连接池原理:

    数据库连接池原理:

    图解:
    在这里插入图片描述

    连接池原理:

    在这里插入图片描述

    展开全文
  • 据库连接池的图解原理 ...最近我作了数据库JSP的频繁连接,在此给出数据库连接池的必要性,对于JSP来说一个很好的J2EE服务器是很必要的,JBOOS,WebLogic都是很好的解决方案。 一般情况下,...

    转载自_百度空间 http://hi.baidu.com/576699909/item/04c80e9a5eabb419934f410a

    据库连接池的图解原理

          最近我作了数据库JSP的频繁连接,在此给出数据库连接池的必要性,对于JSP来说一个很好的J2EE服务器是很必要的,JBOOS,WebLogic都是很好的解决方案。

     

     

          一般情况下,在使用开发基于数据库的WEB程序时,传统的模式基本是按以下步骤:

            1.在主程序(如Servlet、Beans)中建立数据库连接。

            2.进行SQL操作,取出数据。

            3.断开数据库连接。

            使用这种模式开发,存在很多问题。首先,我们要为每一次WEB请求(例如察看某一篇文章的内容)建立一次数据库连接,对于一次或几次操作来讲,或许你觉察不到系统的开销,但是,对于WEB程序来讲,即使在某一较短的时间段内,其操作请求数也远远不是一两次,而是数十上百次(想想全世界的网友都有可能在您的网页上查找资料),在这种情况下,系统开销是相当大的。事实上,在一个基于数据库的WEB系统中,建立数据库连接的操作将是系统中代价最大的操作之一。很多时候,可能您的网站速度瓶颈就在于此。

            其次,使用传统的模式,你必须去管理每一个连接,确保他们能被正确关闭,如果出现程序异常而导致某些连接未能关闭,将导致数据库系统中的内存泄露,最终我们将不得不重启数据库。

            针对以上问题,我们首先想到可以采用一个全局的Connection对象,创建后就不关闭,以后程序一直使用它,这样就不存在每次创建、关闭连接的问题了。但是,同一个连接使用次数过多,将会导致连接的不稳定,进而会导致WEB   SERVER的频频重启。故而,这种方法也不可取。实际上,我们可以使用连接池技术来解决上述问题。首先,介绍一下连接池技术的基本原理。顾名思义,连接池最基本的思想就是预先建立一些连接放置于内存对象中以备使用:

     

          如图所示,当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。下面我们以一个名为ConnectionPool的连接池为例来看看连接池的实现。先看看ConnectionPool的基本属性:

            m_ConnectionPoolSize:连接池中连接数量下限

            m_ConnectionPoolMax:连接池中连接数量上限

            m_ConnectionUseCount:一个连接的最大使用次数

            m_ConnectionTimeout:一个连接的最长空闲时间

            m_MaxConnections = -1:同一时间的最大连接数

            m_timer:定时器

            这些属性定义了连接池与其中的每个连接的有效状态值。连接池的自我管理,实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。其管理流程如下:

     

     

     

          通过上图,我们可以定义出ConnectionPool要完成管理所需要的基本接口:

          public class ConnectionPool implements TimerListener{

            public boolean initialize() //连接池初始化

            public void destroy() //连接池的销毁

            public synchronized java.sql.Connection getConnection() //取一个连接

            public synchronized void close() //关闭一个连接

            private synchronized void removeFromPool() //把一个连接从连接池中删除

            private synchronized void fillPool() //维护连接池大小

            public synchronized void TimerEvent() //定时器事件处理函数

          } 

            通过这几个接口,已经可以完成连接池的基本管理。在TimeEvent()函数中完成连接池的状态检验工作,fillPool()时连接池至少保持最小连接数。因为我们要保存每一个连接的状态,所以还需要一个数据库连接对象:

     

          class ConnectionObject{

            public java.sql.Connection con; public boolean inUse; //是否被使用标志

            public long lastAccess; //最近一次开始使用时间

            public int useCount; //被使用次数

          }

          加入了ConnectionObject对象后,在ConnectionPool中操作的应该只是ConnectionObject,而其他进程需要的只是

          ConnectionObject的con属性,因此我们再加入一个类,作为其他进程获得与返回连接的接口:CLASS Conn{

            GetConnection(); //从连接池中取出一个有效连接

            CloseConnection(); //返回连接,此时并没有关闭连接,只是放回了连接池

            DestroyPool(); //销毁连接池

          }

            最后我们的整个系统总的架构如下:

     

          通过上面的介绍,我们可以看出,连接池技术的关键就是其自身的管理机制,以上的管理流程只是本人一点见解,关键是想向大家介绍一种思路,在此基础上,您可以进一步完善连接池技术为您所用。

    转载于:https://www.cnblogs.com/xiaolei1314/p/3675617.html

    展开全文
  • 数据库连接池的使用

    2019-09-15 16:02:37
    数据库连接池proxool的使用 浅析数据库连接池 什么是数据库连接池?为什么要使用数据库连接池?这是我们看到数据库连接池首先想到的问题。下面笔者将对数据库连接池以自己的理解进行简单的分析。 数据库连接池:...
  • Flask数据库连接池

    2021-06-10 17:44:06
    08.Flask数据库连接池 文章目录08.Flask数据库连接池一、flask-session作用安装基本使用问题:二、如何在python中操作数据库在web中使用原生sql(pymysql)操作数据库?在web中通过原生sql操作数据库会出现的问题示例...
  • 概念数据库连接是一种关键的有限的昂贵的资源 物理连接统一由连接池管理,减少数据库连接释放的压力 :) 每次请求每次新建一个逻辑连接,实际是复用连接池的物理...图解参考由数据库连接池引出的三种设计模式
  • 本文利用Tomcat5配置Mysql JDBC数据库连接池,并给出详细的测试用例。 @author:ZJ07-11-23 Blog:[url]http://zhangjunhd.blog.51cto.com/[/url] 1.配置说明 Tomcat5.0 Eclipse3.3+MyEclipse6.0 Mysql5 mysql-...
  • 数据库连接池知识

    2020-04-06 20:58:25
    数据库连接池 什么是数据库连接池? 在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在java程序与数据库之间建立链接时,数据库端要验证用户名和密码,并且要为这个链接分配...
  • mybatis数据库连接池分析介绍 一、数据库连接池 1、定义 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库...
  • 项目中用了GlassFish有一段日子了,GlassFish的Admin-GUI 做的还是不错的,比较直观,废话少说进入正题,配置GlassFish的连接池点了10几下鼠标就可搞定了,详见下图:注意:要做一项准备工作,copy你的JDBC 驱动到 ...
  • JDBC——(8)数据库连接池技术的概述——Druid数据库连接池技术的实现 JDBC——小知识:Druid连接池的详细配置参数 Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、Proxool等DB池的优点...
  • Java 数据库连接池详解 数据库连接池的原理是: 连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲...
  • 文章目录一,JDBC数据库连接池的必要性二, 数据库连接池技术三,工作原理四,数据库连接池技术的优点五,多种开源的数据库连接池 一,JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本...
  • 数据库连接池(DBCP和C3P0) 一.数据库连接池的概念  数据库连接池可以理解为是存放多个数据库连接的集合。  作用;解决建立数据库连接耗费很多资源和时间问题,提高性能 ... 连接池图解:...
  • 【Java进阶学习】JDBC数据库连接池
  •  2、使用数据库连接池优化程序性能(图解)    3、可扩展增强某个类方法的功能的三种方式    4、自定义数据库连接池——基于装饰设计模式    5、数据库连接池核心代码——基于动态代理技术    6、...
  • 数据之外(如redis),还可以增加数据库连接池,来提高MySQL Server的访问效率,在高并发的情况下, 大量的TCP三次握手、MySQL Server连接认证、MySQL Server关闭连接回收资源以及TCP四次挥手所耗费 的性能消耗是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,036
精华内容 1,214
关键字:

数据库连接池图解