精华内容
下载资源
问答
  • C# 数据库连接池 C# 数据库连接

    热门讨论 2010-10-27 17:48:32
    C# 数据库连接池 C# 数据库连接池 C# 数据库连接池 C# 数据库连接
  • 数据库连接

    万次阅读 2019-12-16 17:38:24
    基本思想: 就是为数据库连接建立一个“缓冲池”。...数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是...
    基本思想:

    就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

    数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

    多种开源的数据库连接池
    • DBCP
      是Apache提供的数据库连接池。tomcat 服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。
    • C3P0
      是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以。hibernate官方推荐使用。
    • Proxool
      是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点。
    • BoneCP
      是一个开源组织提供的数据库连接池,速度快。
    • Druid
      是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池,但是速度不确定是否有BoneCP快。
    • DataSource
      通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池,DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度。

    特别注意

    • 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
    • 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但conn.close()并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。

    一、C3P0数据库连接池

    1. 导入C3P0驱动jar包
    2. 声明配置文件
    c3p0-config.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
        <named-config name="helloc3p0">
            <!-- 提供获取连接的4个基本信息 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql:///test</property>
            <property name="user">root</property>
            <property name="password">00000000</property>
            <!-- 进行数据库连接池管理的基本信息 -->
            <!-- 当数据库连接池中的连接数不够时,c3p0一次性向数据库服务器申请的连接数 -->
            <property name="acquireIncrement">5</property>
            <!-- c3p0数据库连接池中初始化时的连接数 -->
            <property name="initialPoolSize">10</property>
            <!-- c3p0数据库连接池维护的最少连接数 -->
            <property name="minPoolSize">10</property>
            <!-- c3p0数据库连接池维护的最多的连接数 -->
            <property name="maxPoolSize">100</property>
            <!-- c3p0数据库连接池最多维护的Statement的个数 -->
            <property name="maxStatements">50</property>
            <!-- 每个连接中可以最多使用的Statement的个数 -->
            <property name="maxStatementsPerConnection">2</property>
        </named-config>
    </c3p0-config>
    
    3. 测试连接
    @Test
    public void testGetConnection() throws SQLException {
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("helloc3p0");
        Connection connection = comboPooledDataSource.getConnection();
        System.out.println(connection); //com.mchange.v2.c3p0.impl.NewProxyConnection@4567f35d
    }
    
    4. 应用至工具类
    //获取数据库的连接
    public static Connection getConnection() throws Exception {
        //1.读取配置文件中的4个基本信息
        InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driverClass = properties.getProperty("driverClass");
        //2.加载驱动
        Class.forName(driverClass);
        //3.获取连接
        return DriverManager.getConnection(url, user, password);
    }
    

    替换为

    //数据库连接池只需提供一个即可
    private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("helloc3p0");
    public static Connection getConnection() throws SQLException{
        return comboPooledDataSource.getConnection();
    }
    

    二、DBCP数据库连接池

    1.导入dbcp驱动jar包和pool驱动jar包
    2. 声明配置文件
    dbcp.properties
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///test
    username=root
    password=00000000
    
    initialSize=10
    
    3. 测试连接
    @Test
    public void testGetConnection1() throws Exception {
        Properties properties = new Properties();
        FileInputStream inputStream = new FileInputStream(new File("src/dbcp.properties"));
        properties.load(inputStream);
        DataSource source = BasicDataSourceFactory.createDataSource(properties);
        Connection connection = source.getConnection();
        System.out.println(connection); //jdbc:mysql:///test, UserName=root@localhost, MySQL Connector Java
    }
    
    4. 应用至工具类
    //创建一个DBCP数据库连接池
    private static DataSource source;
    static {
        try {
            Properties properties = new Properties();
            FileInputStream inputStream = new FileInputStream(new File("src/dbcp.properties"));
            properties.load(inputStream);
            source = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws Exception {
        return source.getConnection();
    }
    

    三、Druid数据库连接池

    1.导入druid驱动jar包
    2. 声明配置文件
    druid.properties
    url=jdbc:mysql:///test
    username=root
    password=00000000
    driverClassName=com.mysql.jdbc.Driver
    
    initialSize=10
    maxActive=10
    
    3. 测试连接
    @Test
    public void getConnection() throws Exception {
        Properties properties = new Properties();
        InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
        properties.load(inputStream);
        DataSource source = DruidDataSourceFactory.createDataSource(properties);
        Connection connection = source.getConnection();
        System.out.println(connection); //com.mysql.jdbc.JDBC4Connection@76908cc0
    }
    
    4. 应用至工具类
    //创建一个Druid数据库连接池
    private static DataSource source;
    static {
        try {
            Properties properties = new Properties();
            InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
            properties.load(inputStream);
            source = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws SQLException {
        return source.getConnection();
    }
    
    展开全文
  • C#窗体-数据库连接及登录功能的实现

    万次阅读 多人点赞 2017-11-14 16:15:56
    本篇文章介绍了C#窗体的数据库连接及登录功能的实现 工具或平台:VS2010、sqlserver2012 1.创建完窗体后,点击数据,选择添加新数据源 2.选择数据库 3.选择数据集 4.新建连接-Microsoft SQL Server,添加完...

    本篇文章介绍了C#窗体的数据库连接登录功能的实现

    工具或平台:VS2010、sqlserver2012

    1.创建完窗体后,点击数据,选择添加新数据源

    2.选择数据库

    3.选择数据集

    4.新建连接-Microsoft SQL Server,添加完测试一下

    5.添加数据库-注意把连接字符串部分复制一下,一会儿要用的

    6.保存连接字符串到配置文件中

    7.选择需要用数据库的那些部分,由于我的工程较小,仅选择了表,读者根据需要自行添加

    8.引入与数据库相关的命名空间(using System.Data.SqlClient;//加入数据库命名空间)

    9.添加两个文本框、标签及一个按钮、一个pannel容器,修改属性

    10.添加密码的填充字符

     private void textBox2_TextChanged(object sender, EventArgs e)
            {
                this.textBox2.PasswordChar = '*';
            }

    11.添加按钮点击事件

            private void button1_Click(object sender, EventArgs e) //登录按钮点击事件
            {
                //获取文本框中的值
                string userid = this.textBox1.Text;
                string password = this.textBox2.Text;
                if (userid.Equals("") || password.Equals(""))//用户名或密码为空
                {
                    MessageBox.Show("用户名或密码不能为空");
                }
                else//用户名或密码不为空
                {
                    string connectionString = "Data Source=SC-201609191651;Initial Catalog=BigWork;Persist Security Info=True;User ID=sa;Password=qwe1314521";
                    SqlConnection SqlCon = new SqlConnection(connectionString); //数据库连接
                    SqlCon.Open(); //打开数据库
                    string sql = "Select * from users where userid='" + userid + "' and userpwd='" + password + "'";//查找用户sql语句
                    SqlCommand cmd = new SqlCommand(sql,SqlCon);
                    cmd.CommandType = CommandType.Text;
                    SqlDataReader sdr;
                    sdr = cmd.ExecuteReader();
                    if (sdr.Read())         //从结果中找到
                    {
                        MessageBox.Show("登录成功", "提示");
                    }
                    else
                    {
                        MessageBox.Show("用户名或密码错误", "提示");
                        return;
                    }
                }
                panel1.Visible = false;
            }

    12.运行结果

    本人b站账号:lady_killer9

    更多数据结构与算法的实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

    喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

    展开全文
  • 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。 为什么要使用连接池  数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用...

    什么是连接池

    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

    为什么要使用连接池

     数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。  一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。 

    传统的连接机制与数据库连接池的运行机制区别

    不使用连接池流程

    下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程。

    不使用数据库连接池的步骤:

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

    可以看到,为了执行一条SQL,却多了非常多我们不关心的网络交互。

    优点:

    1. 实现简单

    缺点:

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

    使用连接池流程

    使用数据库连接池的步骤:

    第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。

    优点:

    1. 较少了网络开销
    2. 系统的性能会有一个实质的提升
    3. 没了麻烦的TIME_WAIT状态

    数据库连接池的工作原理

    连接池的工作原理主要由三部分组成,分别为

    1. 连接池的建立
    2. 连接池中连接的使用管理
    3. 连接池的关闭

            第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。

            第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:

            当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。

            当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。

            该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。

            第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。

    连接池主要参数

    使用连接池时,要配置一下参数

    1. 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.
    2. 最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作
    3. 最大空闲时间
    4. 获取连接超时时间
    5. 超时重试连接次数

    连接池需要注意的点

    1、并发问题

      为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为各个语言自身提供了对并发管理的支持像java,c#等等,使用synchronized(java)lock(C#)关键字即可确保线程是同步的。使用方法可以参考,相关文献。

    2、事务处理

      我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。 
      我们知道当2个线程共用一个连接Connection对象,而且各自都有自己的事务要处理时候,对于连接池是一个很头疼的问题,因为即使Connection类提供了相应的事务支持,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个线程都在进行事务操作而引起的。为此我们可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源但是可以大大降低事务管理的复杂性。 

    3、连接池的分配与释放

      连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。 
      对于连接的管理可使用一个List。即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他(如何能找到最合适的连接文章将在关键议题中指出);如果没有就抛出一个异常给用户,List中连接是否可以被分配由一个线程来专门管理捎后我会介绍这个线程的具体实现。

    4、连接池的配置与维护

      连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConnection)和最大连接数(maxConnection)等参数来控制连接池中的连接。比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过软件需求上得到。 
      如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。

    数据库对比

    第一、二代连接池

    区分一个数据库连接池是属于第一代产品还是代二代产品有一个最重要的特征就是看它在架构和设计时采用的线程模型,因为这直接影响的是并发环境下存取数据库连接的性能。

    一般来讲采用单线程同步的架构设计都属于第一代连接池,二采用多线程异步架构的则属于第二代。比较有代表性的就是Apache Commons DBCP,在1.x版本中,一直延续着单线程设计模式,到2.x才采用多线程模型。

    用版本发布时间来辨别区分两代产品,则一个偷懒的好方法。以下是这些常见数据库连接池最新版本的发布时间:

    数据库连接池

    最新版本

    发布时间

    C3P0

    c3p0-0.9.5.2

    on 9 Dec 2015

    DBCP

    2.2.0

    27 December 2017

    Druid

    0.11.0

    Dec 4 2017

    HikariCP

    2.7.6

    2018-01-14

    从表中可以看出,C3P0已经很久没有更新了。DBCP更新速度很慢,基本处于不活跃状态,而Druid和HikariCP处于活跃状态的更新中,这就是我们说的二代产品了。

    二代产品对一代产品的超越是颠覆性的,除了一些“历史原因”,你很难再找到第二条理由说服自己不选择二代产品,但任何成功都不是偶然的,二代产品的成功很大程度上得益于前代产品们打下的基础,站在巨人的肩膀上,新一代的连接池的设计师们将这一项“工具化”的产品,推向了极致。其中,最具代表性的两款产品是:

    • HikariCP
    • Druid

    彻底死掉的C3P0

    C3P0是我使用的第一款数据库连接池,在很长一段时间内,它一直是Java领域内数据库连接池的代名词,当年盛极一时的Hibernate都将其作为内置的数据库连接池,可以业内对它的稳定性还是认可的。C3P0功能简单易用,稳定性好这是它的优点,但是性能上的缺点却让它彻底被打入冷宫。C3P0的性能很差,差到即便是同时代的产品相比它也是垫底的,更不用和Druid、HikariCP等相比了。正常来讲,有问题很正常,改就是了,但c3p0最致命的问题就是架构设计过于复杂,让重构变成了一项不可能完成的任务。随着国内互联网大潮的涌起,性能有硬伤的c3p0彻底的退出了历史舞台。

    咸鱼翻身的DBCP

    DBCP(DataBase Connection Pool)属于Apache顶级项目Commons中的核心子项目(最早在Jakarta Commons里就有),在Apache的生态圈中的影响里十分广泛,比如最为大家所熟知的Tomcat就在内部集成了DBCP,实现JPA规范的OpenJPA,也是默认集成DBCP的。但DBCP并不是独立实现连接池功能的,它内部依赖于Commons中的另一个子项目Pool,连接池最核心的“池”,就是由Pool组件提供的,因此,DBCP的性能实际上就是Pool的性能,DBCP和Pool的依赖关系如下表:

    Apache Commons DBCP

    Apache Commons Pool

    v1.2.2

    v1.3

    v1.3

    v1.5.4

    v1.4

    v1.5.4

    v2.0.x

    v2.2

    v2.1.x

    v2.4.2

    v2.2.x

    v2.5.0

    可以看到,因为核心功能依赖于Pool,所以DBCP本身只能做小版本的更新,真正大版本的更迭则完全依托于pool。有很长一段时间,pool都还是停留在1.x版本,这直接导致DBCP也更新乏力。很多依赖DBCP的应用在遇到性能瓶颈之后,别无选择,只能将其替换掉,DBCP忠实的拥趸tomcat就在其tomcat 7.0版本中,自己重新设计开发出了一套连接池(Tomcat JDBC Pool)。好在,在2013年事情终于迎来转机,13年9月Commons-Pool 2.0版本发布,14年2月份,DBCP也终于迎来了自己的2.0版本,基于新的线程模型全新设计的“池”让DBCP重焕青春,虽然和新一代的连接池相比仍有一定差距,但差距并不大,DBCP2.x版本已经稳稳达到了和新一代产品同级别的性能指标(见下图)。

    DBCP终于靠Pool咸鱼翻身,打了一个漂亮的翻身仗,但长时间的等待已经完全消磨了用户的耐心,与新一代的产品项目相比,DBCP没有任何优势,试问,谁会在有选择的前提下,去选择那个并不优秀的呢?也许,现在还选择DBCP2的唯一理由,就是情怀吧。

    性能无敌的HikariCP

    HikariCP号称“性能杀手”(It’s Faster),它的表现究竟如何呢,先来看下官网提供的数据:

    不光性能强劲,稳定性也不差:

    那它是怎么做到如此强劲的呢?官网给出的说明如下:

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

    可以看到,上述这几点优化,和现在能找到的资料来看,HakariCP在性能上的优势应该是得到共识的,再加上它自身小巧的身形,在当前的“云时代、微服务”的背景下,HakariCP一定会得到更多人的青睐。

    功能全面的Druid

    近几年,阿里在开源项目上动作频频,除了有像fastJson、dubbo这类项目,更有像AliSQL这类的大型软件,今天说的Druid,就是阿里众多优秀开源项目中的一个。它除了提供性能卓越的连接池功能外,还集成了SQL监控,黑名单拦截等功能,用它自己的话说,Druid是“为监控而生”。借助于阿里这个平台的号召力,产品一经发布就赢得了大批用户的拥趸,从用户使用的反馈来看,Druid也确实没让用户失望。

    相较于其他产品,Druid另一个比较大的优势,就是中文文档比较全面(毕竟是国人的项目么),在github的wiki页面,列举了日常使用中可能遇到的问题,对一个新用户来讲,上面提供的内容已经足够指导它完成产品的配置和使用了。

    下图为Druid自己提供的性能测试数据:

    现在项目开发中,我还是比较倾向于使用Durid,它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser。

    Druid 相对于其他数据库连接池的优点

    1. 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQL的工作情况。

    a. 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息;

    b. SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0~1毫秒区间50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况;

    c. 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。

    1. 方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。
    2. Druid集合了开源和商业数据库连接池的优秀特性,并结合阿里巴巴大规模苛刻生产环境的使用经验进行优化。

    总结

    时至今日,虽然每个应用(需要RDBMS的)都离不开连接池,但在实际使用的时候,连接池已经可以做到“隐形”了。也就是说在通常情况下,连接池完成项目初始化配置之后,就再不需要再做任何改动了。不论你是选择Druid或是HikariCP,甚至是DBCP,它们都足够稳定且高效!之前讨论了很多关于连接池的性能的问题,但这些性能上的差异,是相较于其他连接池而言的,对整个系统应用来说,第二代连接池在使用过程中体会到的差别是微乎其微的,基本上不存在因为连接池的自身的配饰和使用导致系统性能下降的情况,除非是在单点应用的数据库负载足够高的时候(压力测试的时候),但即便是如此,通用的优化的方式也是单点改集群,而不是在单点的连接池上死扣。

     

    参考:

    http://rainbowhorse.site/2018/02/06/%E5%A4%A7%E8%AF%9D%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0/

    https://blog.csdn.net/frightingforambition/article/details/25464129

    https://juejin.im/entry/58fb03220ce4630061233c98

    展开全文
  • 频繁的创建和销毁数据库连接即消耗系统资源又使得程序效率低下,在这种情况下,出现了使用数据库连接池的方法,类似于线程池,初期创建一定数量的连接供应用程序使用,当使用完成后将其归还给连接池而不是销毁,这样...

            频繁的创建和销毁数据库连接即消耗系统资源又使得程序效率低下,在这种情况下,出现了使用数据库连接池的方法,类似于线程池,初期创建一定数量的连接供应用程序使用,当使用完成后将其归还给连接池而不是销毁,这样有效的提高了资源利用率,下面分享一种简单的创建连接池的方法:

    1.首先,我们新建一个maven工程,并且导入ojdbc  , dbcp  , junit三个包待用

    创建工程并导包

    2.然后,我们在src/main/resources目录下创建一个文件db,properties用以存放一些配置参数等,以后更换数据库密码什么的只需要改此文件而不是改动代码。

    db.properties文件代码如下

    # connection parameters
    driver=oracle.jdbc.driver.OracleDriver    (数据库驱动类)

     

    url=jdbc:oracle:thin:@localhost:1521:xe 

    //jdbc协议:数据库子协议:主机:端口/连接的数据库


    user=system
    pwd=root

    #这个没什么说的,用户名密码,自己创建数据库的时候都设置过

    # datasouce parameters
    initSize=1
    maxSize=2

    #最大连接数,这个不用管

     

    driver的选取:

     

    以上就算是准备工作

    下面开始敲代码了

    在src/main/java 下创建一个包,再创建一个类,名字自己取

     

    补充两点1.Properties类专门用来读取properties文件
                   2.Properties类本质上就是Map

     

    编写如下图代码读取我们在db.properties文件中设置的参数,注意,这里我们创建的是连接池,这些内容

    我们只需要加载一次,所以写在static代码块中

     

    代码:

    package util;

    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;

    import org.apache.tomcat.dbcp.dbcp.BasicDataSource;

    public class DBUtil {
        //连接池对象
        private static BasicDataSource ds;
        //加载参数
        static{
            Properties p = new Properties();
            try {
                p.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));
                String driver = p.getProperty("driver");
                String url = p.getProperty("url");
                String user = p.getProperty("user");
                String pwd = p.getProperty("pwd");
                String initSize = p.getProperty("initSize");
                String maxSize = p.getProperty("maxSize");
                //创建连接池
                ds = new BasicDataSource();
                //设置参数
                ds.setDriverClassName(driver);
                ds.setUrl(url);
                ds.setUsername(user);
                ds.setPassword(pwd);
                ds.setInitialSize(new Integer(initSize));
                ds.setMaxActive(new Integer(maxSize));
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("加载配置文件失败",e);
            }
        }
        /*
         * 以上就是将配置文件里的参数全部读取出来,接下来就是要
         * 写两个方法,一个是用来创建连接的,一个关闭连接
         * */
        public static Connection getConnection() throws SQLException{
            return ds.getConnection();
        }
        
        public static void close(Connection conn){
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    throw new RuntimeException("关闭连接失败",e);
                }
            }
        }
    }


    写完之后,基本工作就完成了,下面我们在src/test/resources下创建一个测试类来检测我们的代码

     

    这里我们使用的是Junit做单元测试

    代码:

    package test;

    import java.sql.Connection;
    import java.sql.SQLException;

    import org.junit.Test;

    import util.DBUtil;

    public class Testdb {
        @Test
        public void test01(){
            Connection conn = null;
            try {
                conn = DBUtil.getConnection();
                System.out.println("OK!");
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                DBUtil.close(conn);
            }
            
        }
    }

    运行上述代码得到如图所示的结果说明我们的代码是正确的




    并且控制台输出OK!

     

    如果出现错误请检查数据库驱动类是否填写正确,数据库服务是否正常启动,

    第一次写文章,纯手打,不喜勿喷谢谢,请各位大神多多指教

     

     

     

    展开全文
  • 数据库连接池 1、什么是数据库连接池? 数据库连接池(Database Connection Pooling)在程序初始化时创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许应用程序重复使用一个现有的数据库连接,而...
  • Navicat 数据库连接工具连接oracle数据库提示cannot create oci handles问题解决方法。 Navicat 连接 oracle 数据库需要本地有 oracle 环境。 oracle 客户端太大了,我们只需装个 oracle install client 就好了。 ...
  • Java-数据库连接池技术

    千次阅读 多人点赞 2021-02-06 10:43:57
    池(Pool)技术在一定程度上可以明显优化服务器应用程序的...数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;常见的数据库连接池技术有C3P0,Druid
  • 本篇内容综合广大网友提供内容,笔者经过整理,对数据库连接池原理和实现过程做个很系统的并且通俗易懂的分析讲解,以及手写一个连接池实现过程作为演示。 一、早期通过JDBC方式操作数据库 我们先来看早期使用JDBC...
  • 数据库连接池的理解和使用

    万次阅读 多人点赞 2015-08-27 20:49:47
    一、什么是数据库连接池? 官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。 个人理解:创建数据库连接...
  • 前提 安装好的达梦数据库,我这里用的版本是DM8 DM数据库连接驱动包(可以去官网问客户给,也...打开IDEA数据库连接工具,新增一个驱动,如下图 编辑驱动名,添加DM数据库连接驱动包,如下图 添加DataSource D...
  • 谈谈数据库连接池的原理

    万次阅读 多人点赞 2013-11-06 10:14:07
    这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包。
  • 数据库连接池大小到底多少合适?

    万次阅读 2020-06-09 11:59:22
    基本上来说,大部分项目都需要跟数据库做交互,那么,数据库连接池的大小设置成多大合适呢? 一些开发老鸟可能还会告诉你:没关系,尽量设置的大些,比如设置成 200,这样数据库性能会高些,吞吐量也会大些! 你也许...
  • 数据库连接池原理详解与自定义连接池实现

    万次阅读 多人点赞 2017-05-17 18:18:54
    实现原理数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的...
  • 数据库连接池DataSource

    千次阅读 2017-09-17 18:40:28
    一:数据库连接池介绍 什么是数据库连接数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的...
  • Springboot+druid数据库连接池使用

    万次阅读 多人点赞 2018-06-08 17:23:10
    1. 为什么要使用数据库连接池 使用数据库连接池主要考虑到程序与数据库建立连接的性能。创建一个新的数据库是一个很耗时的过程,在使用完之后,可能还需要不断的释放建立的连接,对资源的损耗大。 而采用数据库...
  • JDBC- 正确关闭数据库连接

    万次阅读 2017-07-24 20:03:05
    在我们刚开始学习 JDBC时,由于没有使用数据库连接池,我们代码中的每一次连接都需要我们自己来关闭。 不过很多人,都没有正确关闭,包括一些 JDBC的教程。 例如: ...
  • 数据库连接池,学习总结

    万次阅读 2020-01-26 13:05:29
    这是一个费时费资源的操作,数据库连接池技术应运而生,是设计模式“资源池Resource Pool”在实际中的典型应用,用于共享资源。 基本原理就是为数据库连接建一个资源池,预先创建一些连接,需要时就从池子中取出....
  • 1.SpringBoot的数据库连接池的相关默认 springBoot之前的版本默认使用的是Tomcat的数据库连接池 较新的版本2点多(具体多少我看看)默认使用的是Hikari(我使用的是2.2.1) 默认支持数据库连接池: Tomcat ...
  • Druid数据库连接

    千次阅读 多人点赞 2019-04-02 23:00:32
    什么是数据库连接池: 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池...
  • SpringBoot数据库连接池Hikari配置

    千次阅读 2020-11-17 22:42:35
    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏...
  • 多种开源的数据库连接池3.1 C3P0数据库连接池3.2 DBCP数据库连接池3.3 Druid(德鲁伊)数据库连接数据库连接池 1. JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: ...
  • 常用jdbc数据库连接jar包,数据库连接池jar包

    千次下载 热门讨论 2007-12-18 16:49:16
    收集了常见的数据库连接jar包,包括oracle、mysql、sql server、db2、opta、dbcp连接池、c3p0连接池等等常见的数据库jar包,不断更新中。
  • MySql数据库连接

    万次阅读 2018-03-10 16:17:13
    官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对连接池中的连接进行申请,使用,释放。 理解:创建数据库连接池是一个很耗时的操作,也...
  • SpringBoot切换数据库连接

    千次阅读 2017-08-12 03:28:10
    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏...
  • 几种常用数据库连接池的使用

    万次阅读 多人点赞 2019-02-14 12:38:38
    一、应用程序直接获取数据库连接的缺点  用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的...
  • 使用数据库连接池获取JDBC数据库

    千次阅读 2016-09-23 16:23:38
    为什么必须使用数据库连接池:   1.普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接时都要将Connection加载到内存中,再验证用户名和密码。需要数据库连接的时候,就向数据库要求一个,执行完...
  • Python 数据库连接

    千次阅读 2018-09-11 22:21:05
    python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此实际使用中,通常会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,155,841
精华内容 862,336
关键字:

数据库连接