• 1. DataSource / ConnectionPool /  JNDI 三者关系
  • 2. 配置 JNDI 数据源的方式和使用
  • 3. 小结

最近有个用户量 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 三者关系

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  配置文件中添加:

<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"/>   

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

<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>  

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

<?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>  

配置好之后,使用起来也是相当的简单,核心如下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>  

3. 小结

应用起初使用的是自带 C3P0 ConnectionPool,出现崩溃问题后,辗转尝试很多方法。

将应用的数据库连接池改动为服务器 weblogic  JNDI ConnectionPool ,使数据库连接的压力从应用转移到 web 容器。

崩溃问题得到了缓解,经过后续的 weblogic 连接池参数的调整,卡死崩溃问题得到妥善解决。

骚年?是不是感觉 web 容器配置 JNDI 提供给应用使用后效率远远大于应用自带的连接池。

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

试想发布在 weblogic 上面的 10个自带连接池的应用,当数据库信息变动时,你是不是想哭?

而且这样几乎无代码改动,只需变动下 DataSource 的获取。

转载于:https://www.cnblogs.com/shanheyongmu/p/6722123.html

浅析 JNDI / DataSource / ConnectionPool 三者相关推荐

  1. 浅析 JNDI / DataSource / ConnectionPool 三者

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

  2. Hibernate Tomcat JNDI DataSource示例教程

    Hibernate Tomcat JNDI DataSource示例教程 欢迎来到Hibernate Tomcat JNDI DataSource示例教程.我们已经看到如何在独立的Java应用程序中使 ...

  3. JNDI(datasource)在tomcat,JBOSS下的spring+quartz配置

    由于项目中多个小应用(类似插件)需要使用数据库连接池,不能为每一个应用中配置连接池.故采用JNDI的模式进行配置. 我们使用的web服务器有tomcat和jboss两种.分别介绍其在这两种服务器下并且 ...

  4. tomcat中配置jndi数据源以便spring获取

    [0]README 0)intro to jndi, plase visit intro to jndi: 1)本文译自 Configuring Spring MVC JdbcTemplate wit ...

  5. 如何在Tomcat中设置JNDI数据库连接池-Spring教程示例

    在Spring和Tomcat中设置JNDI数据库连接池非常容易. Tomcat服务器文档提供了有关如何在Tomcat 5.6或7中设置连接池的足够信息.在这里,我们将结合使用Tomcat 7和Spri ...

  6. java安全(四) JNDI

    给个关注?宝儿! 给个关注?宝儿! 给个关注?宝儿! 关注公众号:b1gpig信息安全,文章推送不错过 1.JNDI JNDI(Java Naming and Directory Interface) ...

  7. Spring Boot文档阅读笔记-DataSource configuration

    DataSource:一个工厂可以连接任意厂家的数据库.通常使用URL以及一些认证去建立数据库连接. DataSource在代码中是一个对象,这个对象贯彻并落实了javax.sql.DataSourc ...

  8. boot jndi数据源 spring_使用Spring Boot配置JNDI数据源 -Roy教程

    在这篇文章中,我们将看到如何使用Spring Boot配置JNDI数据源.JNDI数据源与JDBC数据源非常相似.JNDI数据源访问在应用程序服务器中预定义和配置并作为JNDI资源或服务发布的数据库连 ...

  9. Java使用JNDI调用配置在服务器(Weblogic、Tomcat)的数据源配置

    本篇介绍在Weblogic和Tomct 中配置数据源, 并演示使用Java JNDI获取数据库连接的代码示例. WebLogic 的配置与使用 WebLogic 控制台可以配置数据源. 左侧导航栏 S ...

最新文章

  1. Java常见面试题,2021年及答案汇总
  2. 微生态、生信和植物领域最新资讯合集,不看你就亏大啦!!!
  3. ALGO-185 Trash Removal
  4. (Microsoft) Visual Studio LightSwitch
  5. java编程有什么独特之处?
  6. puppeteer api_使用Node.js和puppeteer API从URL创建PDF文件
  7. Teleport Pro使用教程
  8. 理解SVN中trunk,branches,tags
  9. 什么是数据库触发器?
  10. html获取文件路径_HTML 文件路径
  11. mysql存储过程实例实现查询_Mybatis应用mysql存储过程查询数据实例
  12. AJAX Control Toolkit ——FilteredTextBoxExtender(文本过滤)
  13. 好程序员web前端分享逻辑运算
  14. 工作分析文献综述_学术知识| 如何撰写文献综述
  15. 企业统一社会信用代码规则
  16. 2021-09-25 WPF上位机 29-3D绘图的对象,变形,鼠标操控,鼠标事件,2D在3D中展示
  17. java 新特性-TWR(Try-with-resources)
  18. 高速PCB 设计中终端匹配电阻的放置
  19. 使用codemirror打造你自己的前端在线编辑器
  20. NVIDIA GeForce GTX 950M 新出驱动程序

热门文章

  1. java多线程上传文件_Java大文件分片上传/多线程上传
  2. CSS:hover伪类使用
  3. 计算机组成原理—主存储器与cpu的连接
  4. bzoj 2434 [Noi2011]阿狸的打字机(AC自动机+fail树+dfs序+树状数组)
  5. manacher算法--最长回文子串
  6. rancher中添加用户,赋予权限
  7. 李开复:多次失败后,我总结出最优秀创业者的4个特点
  8. c#图像处理、图片拼接、图片裁剪、图片缩放、图上添加形状、屏幕截图、图片反色、改变图片色彩度全解
  9. Sass 安装到使用
  10. 高效延时消息设计与实现的场景