精华内容
下载资源
问答
  • 看到这个我明白了因为我们的配置是maxIdle配置的值是5,而maxActive配置的值为40,这样当并发较高的时候,当连接数接近maxActive值的情况下,空闲连接数很容易超过maxIdle,很快就被连接池给主动销毁了,这样就导致...

    摘要:最近针对某系统做了次压力测试,在并发较高的时候暴露了一个maxIdle设置不合理的问题,特总结一下这次问题,并分析一下这个问题背后的原因。

    问题现象

    用60个线程并发访问某个读和写均有的业务接口,性能测试人员查看Oracle数据库负载CPU非常高,而且oracle的Logons指标达到148.1次/秒(这个值的含义是数据库客户端登录认证的每秒的次数)。

    a90a6a3adf1e549bb006073f5251b491.png

    53127140?locationNum=5&fps=1

    851cf9a54c1d48e5c96c25de9eae9fcb.png

    53127140?locationNum=5&fps=1

    而且查看应用程序中的线程栈,也发现了较多数量的线程处于创建新的oracle物理连接处。

    c03a7941a36f332666b70df85bfdf74e.png

    这当时就让我有点儿糊涂了,我们不是用了连接池吗?怎么还会经常创建物理连接呢?

    问题分析解决

    遇到这个问题,我当时也是从自己掌握的各种知识里去想可能的原因,都想到了是不是因为tcp连接的超时时间是不是太短,仔细一想这些可能性都排除掉了。然后查看连接池的配置,当时我们的同学告诉我这些配置跟线上的是一样的,应该没有问题,我当时是就怀疑是maxIdle设置太小导致的原因,但是没有什么具体的依据。

    所以我就简单开发了一个页面可以实时查看当时应用连接池的active number(当前被使用的数据库连接数)和idle number(当前处于空闲状态的数据库连接数)。再次运行测试脚本,通过查看连接池的连接数就可以看出来,连接数的波动较大,有时候连接总数(上面两个数字相加)从20多突然降到10,说明物理连接被销毁了,创建了新的物理连接,那这就与我们看到的一些异常现象相吻合了,创建新的连接就会导致oracle数据库服务器的logons数量增加。由于连接的复用率较差,导致频繁的创建物理连接,oracle数据库的资源消耗增大。

    网上找到一篇文章详细介绍dbcp连接池配置的,它关于maxIdle的配置说明是这么写的。

    maxIdle值与maxActive值应配置的接近。 因为,当连接数超过maxIdle值后,刚刚使用完的连接(刚刚空闲下来)会立即被销毁。而不是我想要的空闲M秒后再销毁起一个缓冲作用。这一点DBCP做的可能与你想像的不一样。 若maxIdle与maxActive相差较大,在高负载的系统中会导致频繁的创建、销毁连接,连接数在maxIdle与maxActive间快速频繁波动,这不是我想要的。 高负载系统的maxIdle值可以设置为与maxActive相同或设置为-1(-1表示不限制),让连接数量在minIdle与maxIdle间缓冲慢速波动。

    看到这个我明白了因为我们的配置是maxIdle配置的值是5,而maxActive配置的值为40,这样当并发较高的时候,当连接数接近maxActive值的情况下,空闲连接数很容易超过maxIdle,很快就被连接池给主动销毁了,这样就导致了连接频繁的创建,弱化了数据库连接池的作用。

    这次的性能测试然让我深刻的感受到了数据库连接池对的价值,使用得当,它能够很好地复用已有的物理连接,在高并发的场景下,减少频繁的创建和销毁物理连接,降低系统的压力。用得不好,它的价值就发挥不出来,就像咱们今天这个案例一样。

    为什么是这样的?

    maxIdle的值为什么要与maxActive的接近呢?果真如此吗?我们还要通过源码来分析它背后的根本原因。

    a756c8d3b4ddbca328c6fd2e63fda80f.png

    看看上图是对dbcp连接池的获取和归还连接对象的流程图的描述,通过该图我们就一目了然了。

    maxIdle配置总结

    maxIdle值与maxActive值应配置的接近。

    因为,当连接数超过maxIdle值后,刚刚使用完的连接(刚刚空闲下来)会立即被销毁。而不是我想要的空闲M秒后再销毁起一个缓冲作用。这一点DBCP做的可能与你想像的不一样。

    若maxIdle与maxActive相差较大,在高负载的系统中会导致频繁的创建、销毁连接,连接数在maxIdle与maxActive间快速频繁波动,这不是我们想要的。

    高负载系统的maxIdle值可以设置为与maxActive相同或设置为-1(-1表示不限制),让连接数量在minIdle与maxIdle间缓冲慢速波动。多余的空闲连接等待回收线程来缓慢回收。

    至于具体多少合理取决于大家的具体应用场景,但是配置的原则是这样的:

    1.如果是连接池命中率(即应用在获取连接时直接获得已经创建物理连接的比率)优先的应用。适合连接资源较充裕的环境,可以尽可能将maxIdle设置得更大一些,多数应用设置的大一些会更加安全。

    2.如果是连接资源利用率(即被使用连接占的比率)优先的应用。适合那些连接资源紧张的环境。可以尽可能将maxIdle设置得更小一些,这样空闲连接能够得到更快的释放,保持一个较小的连接,但是设置的过小的话会导致连接池命中率非常低,弱化连接池的作用。

    展开全文
  • java配置数据库连接池的方法步骤java配置数据库连接池的方法步骤,需要的朋友可以参考一下先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库...

    java配置数据库连接池的方法步骤

    java配置数据库连接池的方法步骤,需要的朋友可以参考一下

    先来了解下什么是数据库连接池

    数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。

    在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请

    求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操

    作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例

    如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。

    数据库连接池的主要操作如下:

    (1)建立数据库连接池对象(服务器启动)。

    (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。

    (3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。

    (4)存取数据库。

    (5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。

    (6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。

    配置步骤:

    1.在Tomcat  conf/content.xml中节点内添加如下内容

    auth="Container"type="javax.sql.DataSource" maxActive="100" maxIdle="30"

    maxWait="10000" username="sa" password="120010"

    driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"

    url="jdbc:sqlserver://localhost:1433;DatabaseName=news"/>

    name:之后我们要调用resource时候用到

    type:是链接数据库时候用到的java扩展包下的类

    maxActive:最大连接数

    maxIdle:是空闲时候最大连接数

    maxwait:空闲判断标准

    注意:

    1).该配置文件里不允许有中文;各个属性间的用一个空格隔开

    2).要将对应链接数据库的jar包放到tomcat /lib文件夹中工程中就不需要存放了

    下面还中是链接oracle的

    url="jdbc:oracle:thin:@192.168.2.102:1521:orcl"

    driverClassName="oracle.jdbc.driver.OracleDriver" password="bg"

    username="test" maxWait="10000" maxIdle="30" maxActive="100"

    auth="Container"/>

    2.在工程的web.xml中添加如下代码

    jdbc/news

    javax.sql.DataSource

    Container

    这里标签里面的名字就是在content.xml文件中的name的名字

    3.得到数据库连接池中的Connection对象

    Context context=new InitialContext();

    DataSourceds=(DataSource)context.lookup("java:comp/env/jdbc/news");

    Connectionconn = ds.getConnection();

    注意:context是javax.namingx下的类,dataSource是javax.sql下的类 ,"java:comp/env/jdbc/news"中:java:comp/env是固定写法 jdbc/news是jndi名称(Tomcat中配置的那个name)

    如果我们不是在web.xml中配置数据源,我们用spring来控制数据库链接方法步骤:

    1).在配置文件中添加如下节点

    配置好了获取sql语句查询数据有多少条:

    调用的时候直接Dao类继承JdbcDaoSupport类(spring.jar中的类)

    int count = this.getJdbcTemplate().queryForInt("select * from users");

    展开全文
  • 1、准备JNDI(Java Naming and Directory ...我们这里要配置的资源是连接池,所以项目中就可以通过统一的方式来获取连接池对象。新建一个java web项目,导入jar包commons-dbcp-1.4.jarcommons-pool-1.3.jar数据库驱...

    1、准备

    JNDI(Java Naming and Directory Interface),Java命名和目录接口。JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源。我们这里要配置的资源是连接池,所以项目中就可以通过统一的方式来获取连接池对象。

    新建一个java web项目,导入jar包

    commons-dbcp-1.4.jar

    commons-pool-1.3.jar

    数据库驱动包,如:mysql-connector-java-5.1.28-bin.jar

    2、配置文件

    在%CATALINA_HOME%\conf\Catalina\localhost目录下创建与项目名同名的xml文件

    c3p0配置

    配置JNDI资源需要到元素中配置子元素:

    l  name:指定资源的名称,这个名称可以随便给,在获取资源时需要这个名称;

    l  factory:用来创建资源的工厂,这个值基本上是固定的,不用修改;

    l  type:资源的类型,我们要给出的类型当然是我们连接池的类型了;

    l  bar:表示资源的属性,如果资源存在名为bar的属性,那么就配置bar的值。对于DBCP连接池而言,你需要配置的不是bar,因为它没有bar这个属性,而是应该去配置url、username等属性。

    dbcp配置

    3、获取资源

    配置资源的目的当然是为了获取资源了。只要你启动了Tomcat,那么就可以在项目中任何类中通过JNDI获取资源的方式来获取资源了。

    import java.io.IOException;

    import java.sql.Connection;

    import javax.naming.Context;

    import javax.naming.InitialContext;

    import javax.naming.NamingException;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import javax.sql.DataSource;

    /**

    * 获取JNDI的资源

    *

    */

    public class AServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    /*

    * 1. 创建JNDI的上下文对象

    */

    try {

    Context cxt = new InitialContext();

    // 2查询出入口

    // Context envContext = (Context)cxt.lookup("java:comp/env");

    // 3. 再进行二次查询,找到我们的资源

    // 使用的是名称与元素的name对应

    // DataSource dataSource = (DataSource)envContext.lookup("jdbc/dataSource");

    DataSource dataSource = (DataSource)cxt.lookup("java:comp/env/jdbc/dataSource");

    Connection con = dataSource.getConnection();

    System.out.println(con);

    con.close();

    } catch (Exception e) {

    throw new RuntimeException(e);

    }

    }

    }

    获取资源:

    l  Context:javax.naming.Context;

    l  InitialContext:javax.naming.InitialContext;

    l  lookup(String):获取资源的方法,其中”java:comp/env”是资源的入口(这是固定的名称),获取过来的还是一个Context,这说明需要在获取到的Context上进一步进行获取。”bean/MyBeanFactory”对应中配置的name值,这回获取的就是资源对象了。

    展开全文
  • 数据库连接包:ojdbc6.jar数据库连接池包:commons-pool2-2.2.jarcommons-dbcp2-2.0.jar数据库连接配置文件:config.properties使用连接池连接一定不要忘记关闭否则会很倒霉DBHelper的写法import java.io.IOException...

    首先应加入连接池和数据库连接的配置文件:

    数据库连接包:ojdbc6.jar

    数据库连接池包:commons-pool2-2.2.jar

    commons-dbcp2-2.0.jar

    数据库连接配置文件:config.properties

    使用连接池连接一定不要忘记关闭否则会很倒霉

    DBHelper

    的写法

    import java.io.IOException;

    import java.io.InputStream;

    import

    java.sql.Connection;

    import java.sql.PreparedStatement;

    import

    java.sql.ResultSet;

    import java.sql.SQLException;

    import

    java.util.Properties;

    import org.apache.commons.dbcp2.BasicDataSource;

    public class DBHelper {

    private static BasicDataSource ds = new

    BasicDataSource();

    static {

    InputStream is =

    DBHelper.class

    .getResourceAsStream("config.properties");

    Properties

    prop = new Properties();

    try

    {

    prop.load(is);

    ds.setDriverClassName(prop.getProperty("driver"));

    ds.setUrl(prop.getProperty("url"));

    ds.setUsername(prop.getProperty("username"));

    ds.setPassword(prop.getProperty("password"));

    System.out.println(ds.getDriverClassName()

    + ds.getUrl());

    } catch (IOException e) {

    e.printStackTrace();

    }

    finally {

    try {

    if (is != null)

    is.close();

    } catch

    (IOException e) {

    e.printStackTrace();

    }

    }

    }

    public static Connection getConnection() throws SQLException {

    return

    ds.getConnection();

    }

    public static void close(ResultSet rs, PreparedStatement ps, Connection

    conn) {

    try {

    if (rs != null)

    rs.close();

    if (ps !=

    null)

    ps.close();

    if (conn != null)

    conn.close();

    }

    catch (SQLException e) {

    e.printStackTrace();

    }

    }

    }

    config.properties文件配置:

    driver=oracle.jdbc.driver.OracleDriver

    url=jdbc\:oracle\:thin\:@10.141.42.119\:1521\:orcl

    username=hdid01

    password=hdid01

    7b6ee30040916c1eea68e0acd91600de.png

    两个文件的放置位置:

    63d39f4de8e0ddf3f3b30d1bf4bc89f7.png

    这样就可以使用了,也可以吧config.properties 放到别的地方更改

    InputStream is =

    DBHelper.class

    .getResourceAsStream("config.properties");

    找到文件的路径修改下就可以了。

    展开全文
  • 关于java数据库连接池配置的几种方式今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,(已Mysql数据库为例)一,Tomcat配置数据源:方式一:在WebRoot下面建文件夹META-INF,里面建一个...
  • package ...import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import...
  • java配置dbcp连接池示例分享,大家参考使用吧
  • 一、首先配置连接池1、tomcat下配置连接池*>在tomcat下的context.xml配置连接池代码name=”jdbc/sqlserver” //连接池名称type=”javax.sql.DataSource”password=”syl6413″driverClassName=”...
  • 先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库...
  • java配置数据库连接池的方法步骤java配置数据库连接池的方法步骤,需要的朋友可以参考一下先来了解下什么是数据库连接池数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,一旦数据库...
  • 第一部分是在eclipse下配置项目自身的连接池,这块有问题的比较多主要解决两个异常。第二部分是在Tomcat下配置全局连接池,这块有官方文档问题较少,简单过一下。本文的样例老规律,您可以在文尾下载到他。其中,...
  • 今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例)一、Tomcat配置数据源:方式一:在WebRoot下面建文件夹META-INF,里面建一个文件context....
  • 今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例)一,Tomcat配置数据源:方式一:在WebRoot下面建文件夹META-INF,里面建一个文件context....
  • 1. tomcat方式:在context.xml配置连接池,然后在web.xml中写配置代码(也能够在server.xml文件里配置连接池)。这两种方法的差别是:在tomcat6版本号及以上中context元素已经从server.xml文件里独立出来了,放在一个...
  • java配置数据库连接池的方法步骤,需要的朋友可以参考一下
  • java数据库连接池配置

    2020-09-03 11:45:40
    java数据库连接池配置 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///temporary?useUnicode=true&characterEncoding=UTF-8 jdbc.username=root jdbc.password=12345
  • 配好了连接池之后,我对有连接池和没有连接池的数据库访问性能作了一下对比。同样的连接条件:连接300次,每次从表里读20条String,显示在网页上。最后显示执行时间。结果如下:无连接池:平均8-9秒有连接池:平均...
  • 第一部分是在eclipse下配置项目自身的连接池,这块有问题的比较多主要解决两个异常。第二部分是在Tomcat下配置全局连接池,这块有官方文档问题较少,简单过一下。本文的样例老规律,您可以在文尾下载到他。其中,...
  • 1、java连接redisjava通过需要jedis的jar包获取Jedis连接。public void getConn(){//获取jedis连接Jedis jedis = new Jedis("127.0.0.1",6379);//获取redis中以FIELD开头的keySet keys = jedi...
  • /*** * Title:数据库连接池* * * Description:本连接池支持对失效连接重连、重建连接池,并监控调用者及调用时间* 本类需要在类路径根中存在db.properties数据库配置文件,文件内容示例:* drivers=...
  • 在pom.xml中加org.springframework.dataspring-data-redis1.0.2.RELEASEredis.clientsjedis2.1.0在application.xml中加Java连接使用代码importorg.springframework.beans.factory.annotation.Autowired;importorg....
  • } GenericObjectPoolConfig 中配置了默认的config信息 ,使用此方法初始化一个jedisPool连接池 package redisDemo; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.Jedis...
  • Java配置数据库连接池

    2018-10-18 11:47:06
    dbcp数据库连接池 DbcpUtils.java import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql....
  • 到这里,连接池已经配置好啦。2.//通过tomcat连接池获得数据库的连接 Connection conn = null; DataSource ds = null; Context initCtx = new InitialContext(); ds =(DataSource)initCtx.lookup("java:comp/env/jdbc...
  • 今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例)一,Tomcat配置数据源:方式一:在WebRoot下面建文件夹META-INF,里面建一个文件context....
  • 请使用HikariCP作为您的应用程序,在java世界中可用的最佳和非常快速的连接池,配置应如下所示.或者您也可以进行编程配置.HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/...
  • cassandra的连接池配置cassandra的datastax驱动使用的是异步nio实现的,发出去的请求,不会阻塞线程,当有响应的时候会通知你。所以cassandra客户端和服务器之间不需要太多的连接,因为发送一个请求是很快的,只要一...
  • 连接池配置属性DBbean:里面存放可以配置的一些属性2.连接池接口IConnectionPool:里面定义一些基本的获取连接的一些方法3.接口实现ConnectionPool:对上面操作进行实现,并加入一些其他方法4.连接池管理...
  • 首先,我们准备文件jdbc.properties,用于保存连接数据库的信息,利于我们在配置文件中的使用jdbc.driver=...Spring框架内置的连接池(内置jar包可以使用)当然,它是使...
  • packagecom.ecshipper_manager....importjava.util.List;importjava.util.Set;importorg.springframework.stereotype.Component;importredis.clients.jedis.Jedis;@Component("redisClient")publicclassRedisClie...

空空如也

空空如也

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

java配置连接池

java 订阅