返回顶部
首页 > 资讯 > 数据库 >浅析 JNDI / DataSource / ConnectionPool 三者
  • 229
分享到

浅析 JNDI / DataSource / ConnectionPool 三者

2024-04-02 19:04:59 229人浏览 独家记忆
摘要

最近有个用户量 5W-10W 的 WEB 应用,频繁导致 weblogic 崩溃,让运维组很难受。   通过几天跟踪系统日志和 weblogic 运行状况,发现报错的姿势有很多,其中对定

最近有个用户量 5W-10W 的 WEB 应用,频繁导致 weblogic 崩溃,让运维组很难受。

   通过几天跟踪系统日志和 weblogic 运行状况,发现报错的姿势有很多,其中对定位问题比较关键的报错:

ExecuteThread: '496' for queue: 'weblogic.kernel.Default (self-tuning)' has beenbusy for "712" seconds working on the request "XXXX", which is more than the configured time (StuckThreadMaxTime) of "600" seconds.

   weblogic 分配给 web 应用使用的线程响应返回周期最大为10分钟,线程迟迟无法返回结果导致阻塞,并且这样的刺头线程越来越多。

   运行一段时间后达到 weblogic 阻塞线程的阀值,weblogic 自然就崩溃了。

   刚开始也试着调大 weblogic 响应周期/阻塞线程的阀值,但是阻塞线程还是会存在并且很快达到阀值。

   仔细比对奔溃前后日志,查看 weblogic 阻塞线程详情,导致阻塞开始罪魁祸首是数据库查询需要很长时间。

   该系统与内外围很多厂商系统有进行数据交互,数据库里面旁根错杂的 db_link/synonyms/view/procedure。

   而且是老旧项目,代码经过很多人修改,已经风烛残年摇摇欲坠,俺想重造它不是一天两天了,因为很多原因无法进行,很无奈。

   规范数据库中的交互流程?然后动代码?oh,no! 限定解决的期限将至,不能拖。

   所有最后将目光放到数据库连接池这部分,也使我不得不重新审视这块对于 web 项目的重要性。好了,言归正传。

回到顶部

1. DataSource / ConnectionPool /  JNDI 三者关系

   浅析 JNDI / DataSource / ConnectionPool 三者

   DataSource:数据源是在 JDBC2.0 中引入的一个概念;

   在 JDBC 扩展包中定义了Java.sql.DataSource 接口,它负责建立与数据库的连接;

   在应用程序访问数据库是不必编写连接数据库的代码,可直接从数据源获得数据库连接。

   ConnectionPool :在数据源中初始化建立了多个数据库连接,这些数据库连接保存在连接池(ConnectionPool)中。

   Java程序访问数据库时,只需从连接池中取出空闲状态的数据库连接,当访问结束时,将数据库连接返回给连接池。

   JNDI : (Java Naming and Directory Interface)Java命名与目录接口;

   为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。

   其实可以将 JNDI 理解为一种对象和名字绑定的技术,即指定一个资源名称,将该名称与某一资源或服务相关联。

   结合图和上面的简述,数据层关键性对象都已展露无遗,同样也很容易理解。

   JNDI 避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。

回到顶部

2. 配置 JNDI 数据源的方式和使用

   weblogic 上配置 JNDI 为图形界面,操作起来很方便,而且那是运维组的事情,术业有专攻。

   这里我拿 Tomcat 为例(开发时你也不可能在本机装个 weblogic 调试吧),简述下配置 JDNI 的几种方式:

a. 全局使用:Tomcat 的 conf 文件夹下的 context.xml  配置文件中添加:

浅析 JNDI / DataSource / ConnectionPool 三者

<Resource name="jndi/db_test"   
            auth="Container"   
            type="javax.sql.DataSource"   
            driverClassName="com.Mysql.jdbc.Driver"   
            url="jdbc:mysql://localhost:3306/db_test"   
            username="root"   
            passWord="123456"   
            maxActive="20"   
            maxIdle="10"   
            maxWait="10000"/>

浅析 JNDI / DataSource / ConnectionPool 三者

b.局部使用:Tomcat 的 conf 文件夹下 server.xml 的 <host> 标签内添加:

浅析 JNDI / DataSource / ConnectionPool 三者

Context path="/demo_jndi" docBase="/demo_jndi">  
   <Resource  
     name="jndi/db_test"  
     type="javax.sql.DataSource"  
     driverClassName="com.mysql.jdbc.Driver"  
     maxIdle="2"  
     maxWait="5000"  
     username="root"  
     password="123456"  
     url="jdbc:mysql://localhost:3306/db_test"  
     maxActive="4"/>  </Context>

浅析 JNDI / DataSource / ConnectionPool 三者

 c.局部使用:应用 META-INFO 下新建 context.xml 添加:

浅析 JNDI / DataSource / ConnectionPool 三者

<?xml version="1.0" encoding="UTF-8"?>  <Context>  
    <Resource name="jndi/db_test"   
                auth="Container"   
                type="javax.sql.DataSource"   
                driverClassName="com.mysql.jdbc.Driver"   
                url="jdbc:mysql://localhost:3306/db_test"   
                username="root"   
                password="123456"   
                maxActive="20"   
                maxIdle="10"   
                maxWait="10000"/>      </Context>

浅析 JNDI / DataSource / ConnectionPool 三者

   上述几种配置使用的数据源都为 javax.sql.DataSource,当然你也可以引入其他开源的数据源。

   也就是 web 容器使用其他的开源数据库连接池,比如像下面这集中姿势(记得将依赖的 jar 添加到容器的 lib 中):

浅析 JNDI / DataSource / ConnectionPool 三者

<Resource name="jndi/db_test"   
            auth="Container"
            //DBCP
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
        
            //C3P0
            type="com.mchange.v2.c3p0.ComboPooledDataSource"
            factory="org.apache.naming.factory.BeanFactory" 
              
            //Druid
            type="com.alibaba.druid.pool.DruidDataSource" 
            factory="com.alibaba.druid.pool.DruidDataSourceFactory"
            
            driverClassName="com.mysql.jdbc.Driver"   
            url="jdbc:mysql://localhost:3306/db_test"   
            username="root"   
            password="123456"   
            maxActive="20"   
            maxIdle="10"   
            maxWait="10000"/>

浅析 JNDI / DataSource / ConnectionPool 三者

   配置好之后,使用起来也是相当的简单,核心如下2行代码即可:

    Context ctx = new InitialContext();  
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jndi/db_test");

   如果项目中引入了 spring 上述两行代码都可以省了,变动注入数据源配置,如下:

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
        <property name="jndiName" value = "java:comp/env/jndi/db_test"/>  
    </bean>


您可能感兴趣的文档:

--结束END--

本文标题: 浅析 JNDI / DataSource / ConnectionPool 三者

本文链接: https://lsjlt.com/news/36369.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅析 JNDI / DataSource / ConnectionPool 三者
    最近有个用户量 5W-10W 的 web 应用,频繁导致 weblogic 崩溃,让运维组很难受。   通过几天跟踪系统日志和 weblogic 运行状况,发现报错的姿势有很多,其中对定...
    99+
    2024-04-02
  • RocketMQ producer发送者浅析
    发送者其实比较简单,需要做的就是首先确定往哪里发送,其次怎么让消息发送顺畅。我们就看一下具体的代码吧。 首先调用start方法。完成各个类的初始化,启动多个定时任务,其中一个定时任务...
    99+
    2023-05-17
    RocketMQ producer RocketMQ发送者
  • Java浅析代码块与构造块及静态块三者之间的关系
    目录普通代码块(本地代码块)构造块(实例代码块)静态块(静态代码块)他们之间有什么关系呢例子分析普通代码块(本地代码块) 定义在方法里面用{ }括起来的代码块(凡是用{ }括起来都叫...
    99+
    2024-04-02
  • 浅谈Flutter解析JSON三种方式
    Dart实体类格式 class CategoryMo { String name; int count; CategoryMo({this.name, this.cou...
    99+
    2024-04-02
  • Python中赋值、浅拷贝、深拷贝三者的区别
    本篇文章为大家展示了Python中赋值、浅拷贝、深拷贝三者的区别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy;...
    99+
    2023-06-14
  • 深入浅析Go中三个点(...)用法
    ‘…' 其实是go的一种语法糖。 它的第一个用法主要是用于函数有多个不定参数的情况,可以接受多个不确定数量的参数。 第二个用法是slice可以被打散进行传递。 实例: packa...
    99+
    2024-04-02
  • PHP设计模式之观察者模式浅析
    目录PHP观察者模式(Observer Pattern)模式结构实现步骤代码示例适用场景PHP观察者模式(Observer Pattern) 观察者模式是一种行为设计模式,它定义了一...
    99+
    2023-05-14
    PHP观察者模式 PHP 设计模式 观察者模式
  • PHP设计模式之中介者模式浅析
    目录中介者模式PHP中的中介者模式中介者模式 中介者模式(Mediator Pattern)是一种常用的设计模式,用于解决各个对象之间的复杂依赖关系,使得各个对象之间可以独立地改变自...
    99+
    2023-05-14
    PHP中介者模式 PHP 设计模式 中介者模式
  • 浅析web前端开发者的招聘要求
    随着互联网的不断发展,Web前端开发成为了非常重要的职业之一。Web前端开发人员主要负责开发网站的前端部分,包括页面设计、交互效果实现、数据展示等方面。前端开发人员的职责非常广泛,需要掌握多种编程语言和工具,同时具备创新、学习能力和团队协作...
    99+
    2023-05-14
  • 浅析前端开发者可以学习Web3D技术吗
    随着互联网的发展,网页设计也越来越重要。前端开发者需要不断地学习新技术和新领域,以适应市场变化和用户需求。其中,Web3D技术逐渐成为前端开发的新关键词,它可以让网站更加生动和多样化。那么,前端开发者可以学习Web3D技术吗?首先,Web3...
    99+
    2023-05-14
  • 浅析前端开发者要如何学习Node语言?
    本文整理自我初学 Node.js 时的笔记,用以向对 Node.js 这门语言有兴趣的读者简明扼要的介绍 Node.js 是什么,以及该如何学习这门语言。1. 什么是 Node.js?Node.js 是 Ryan Dahl 在 2009 年...
    99+
    2023-05-14
    前端 Node.js JavaScript
  • 浅析node怎么进行微博第三方登录
    接入微博第三方登录可以免注册,对用户的体验更好,今天我们就用nodejs实现微博第三方登录(用其它语言也可以)。【相关教程推荐:nodejs视频教程】实现效果在线实例: http://www.lolmbbs.com/login1、点击微博登...
    99+
    2022-11-22
    node nodejs​ Node.js
  • 浅析织梦(dedecms)三个最重要的安全设置
    1、 改变织梦data目录位置。 data目录用于存放织梦系统一些重要的配置文件与数据,应该予以重点保护。具体操作步骤为: 1) 新建一目录用于存放data目录,如mydataabc,将DATA目录移动到该目录下。这样d...
    99+
    2022-06-12
    织梦 dedecms 安全设置
  • 浅析node是怎么实现github第三方登录的
    一、详细流程二、具体流程1.注册应用①登录github,Settings=>Developer settings=>OAuth Apps=>Register a new application ②填写应用信息③注册完成,得...
    99+
    2022-11-22
    nodejs​ node
  • 浅析Android中常见三种弹框在项目中的应用
    一丶概述 弹框在Android项目中经常出现,常见的实现方法有三种:Dialog 弹框,Window弹框,Activity伪弹框。本文就说一说三种弹框的实现及在项目中的运用。 ...
    99+
    2022-06-06
    Android
  • 浅析Node常见的三种关于安全方面的处理
    当我们使用 node 连接到数据库的时候, 通常会在 node 端写 sql 语句来进行数据库查询, 例如下方-- 这是一个简易的登录判断sql语句, 输入 username 和 password 在 users 表中进行用户登录验证, ...
    99+
    2023-05-14
    前端 Node.js
  • 怎么深度剖析JDK和JRE以及JVM三者的区别
    本篇文章为大家展示了怎么深度剖析JDK和JRE以及JVM三者的区别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。你对jdk,jre,jvm三者的区别和联系是否了解,这里和大家分享一下, j2sdk(...
    99+
    2023-06-17
  • 浅析JavaScript观察者模式:理解事件处理机制的精髓
    JavaScript观察者模式是一种设计模式,它允许对象订阅和发布事件。这种模式非常适合用于构建事件驱动的应用程序,例如GUI或游戏。 在观察者模式中,发布者对象负责将事件发送给订阅者对象。订阅者对象负责处理这些事件。发布者对象和订阅者...
    99+
    2024-02-03
    JavaScript 观察者模式 事件处理 订阅 发布
  • php怎么替换数组中的指定值?三种方法浅析
    在PHP编程中,替换数组中指定值是一个常见的操作。在本篇文章中,我们将会学习如何使用PHP编写代码以替换数组中指定值。我们将介绍以下内容:1.一个使用for循环来遍历数组和替换值的示例2.一个使用array_map()函数来替换数组中指定值...
    99+
    2023-05-14
    php数组 php
  • 详解如何利用tushare、pycharm和excel三者结合进行股票分析
    前言 当你逐渐了解tushare之后,你会发现我们要进行数据分析只靠tushare是不够的,接下来我将介绍如何利用第三方软件将tushare获取的数据进行分析。 一、使用工具 首先我...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作