web server apache tomcat11-09-JNDI Datasource

前言

整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。

开源项目

从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。

系列文章

web server apache tomcat11-01-官方文档入门介绍

web server apache tomcat11-02-setup 启动

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

...

介绍

JNDI 数据源配置在 JNDI-Resources-HOWTO 中有详细说明。然而,来自 tomcat-user 的反馈显示,针对特定配置的具体细节可能会相当棘手。

以下是一些已发布到 tomcat-user 的针对流行数据库的示例配置,以及一些通用数据库使用的一般提示。

您应该注意,由于这些注释是从发布到 tomcat-user 的配置和/或反馈中派生的,因此可能会因人而异 :-)。如果您有任何其他经过测试的配置,您认为可能对更广泛的受众有用,或者如果您认为我们可以以任何方式改进此部分,请告诉我们。

请注意,Tomcat 7.x 和 Tomcat 8.x 之间的 JNDI 资源配置在一定程度上有所变化,因为它们使用了不同版本的 Apache Commons DBCP 库。您很可能需要修改旧的 JNDI 资源配置以匹配下面示例中的语法,以使它们在 Tomcat 11 中正常工作。有关详细信息,请参阅 Tomcat 迁移指南。

此外,请注意,JNDI DataSource 配置一般以及本教程特别假设您已经阅读并理解了 Context 和 Host 配置参考,包括后者参考中关于自动应用程序部署的部分。

DriverManager、服务提供程序机制和内存泄漏

java.sql.DriverManager 支持服务提供程序机制。这个特性是,通过提供 META-INF/services/java.sql.Driver 文件宣布自己的所有可用 JDBC 驱动程序会自动被发现、加载和注册,从而使您无需在创建 JDBC 连接之前显式加载数据库驱动程序。然而,在所有 Java 版本中,该实现在 servlet 容器环境中基本上是有缺陷的。问题在于,java.sql.DriverManager 仅会扫描驱动程序一次。

Apache Tomcat 包含的 JRE 内存泄漏预防监听器通过在 Tomcat 启动期间触发驱动程序扫描来解决这个问题。这是默认启用的。这意味着只有可见于公共类加载器及其父加载器的库将被扫描以寻找数据库驱动程序。这包括 $CATALINA_HOME/lib、$CATALINA_BASE/lib、类路径和模块路径中的驱动程序。打包在 Web 应用程序中(在 WEB-INF/lib 中)和共享类加载器中(如果已配置)的驱动程序将不可见,并且不会自动加载。如果您考虑禁用此功能,请注意,扫描将由使用 JDBC 的第一个 Web 应用程序触发,导致在重新加载此 Web 应用程序时以及依赖于此功能的其他 Web 应用程序时失败。

因此,在其 WEB-INF/lib 目录中具有数据库驱动程序的 Web 应用程序不能依赖于服务提供程序机制,并且应该显式注册驱动程序。

java.sql.DriverManager 中的驱动程序列表也是已知的内存泄漏源。由 Web 应用程序注册的任何驱动程序在 Web 应用程序停止时必须取消注册。当 Web 应用程序停止时,Tomcat 将尝试自动发现并注销由 Web 应用程序类加载器加载的任何 JDBC 驱动程序。但是,预期应用程序通过 ServletContextListener 自行执行此操作。

数据库连接池(DBCP 2)配置

Apache Tomcat 中默认的数据库连接池实现依赖于 Apache Commons 项目的库。使用以下库:

  • Commons DBCP 2
  • Commons Pool 2

这些库位于一个单独的 JAR 中,路径为 $CATALINA_HOME/lib/tomcat-dbcp.jar。但是,仅包含了用于连接池的类,并且已经重命名了包以避免干扰应用程序。

DBCP 2 支持 JDBC 4.1。

安装

查看 DBCP 2 文档以获取完整的配置参数列表。

预防数据库连接池泄漏

数据库连接池创建和管理到数据库的连接池。重新使用已经存在的连接比打开新连接更高效。

连接池存在一个问题。Web 应用程序必须显式关闭 ResultSet、Statement 和 Connection。如果 Web 应用程序未关闭这些资源,它们可能永远不会再次可用,从而导致数据库连接池“泄漏”。如果没有更多可用的连接,则最终可能会导致您的 Web 应用程序数据库连接失败。

有一个解决方案。Apache Commons DBCP 2 可以配置为跟踪和恢复这些被遗弃的数据库连接。它不仅可以恢复它们,还可以为打开这些资源但从未关闭它们的代码生成堆栈跟踪。

要配置 DBCP 2 DataSource,以便移除和重新使用被遗弃的数据库连接,请在 DBCP 2 DataSource 的 Resource 配置中添加以下一个或两个属性:

  • removeAbandonedOnBorrow=true
  • removeAbandonedOnMaintenance=true

这两个属性的默认值都是 false。请注意,只有当设置 timeBetweenEvictionRunsMillis 为正值时,removeAbandonedOnMaintenance 属性才会生效。

有关这些属性的详细文档,请参阅 DBCP 2 文档。

使用 removeAbandonedTimeout 属性设置数据库连接在被视为被遗弃之前空闲的秒数。

removeAbandonedTimeout="60"

移除被遗弃连接的默认超时时间为 300 秒。

如果希望

DBCP 2 记录已遗弃数据库连接资源的代码的堆栈跟踪,则可以将 logAbandoned 属性设置为 true。

logAbandoned="true"

默认值为 false。

MySQL DBCP 2 示例

0. 介绍

以下是已知可以工作的 MySQL 和 JDBC 驱动程序的版本:

  • MySQL 3.23.47、MySQL 3.23.47 使用 InnoDB、MySQL 3.23.58、MySQL 4.0.1alpha
  • Connector/J 3.0.11-stable(官方 JDBC 驱动程序)
  • mm.mysql 2.0.14(一个旧的第三方 JDBC 驱动程序)

在继续之前,请不要忘记将 JDBC 驱动程序的 jar 复制到 $CATALINA_HOME/lib。

1. MySQL 配置

确保按照以下说明操作,因为变化可能会导致问题。

  • 创建一个新的测试用户、一个新的数据库和一个单个的测试表。您的 MySQL 用户必须分配密码。如果您尝试使用空密码连接,驱动程序将失败。
mysql> GRANT ALL PRIVILEGES ON *.* TO javauser@localhost->   IDENTIFIED BY 'javadude' WITH GRANT OPTION;
mysql> create database javatest;
mysql> use javatest;
mysql> create table testdata (->   id int not null auto_increment primary key,->   foo varchar(25),->   bar int);

测试数据插入

执行完测试后,应该移除上述用户!

接下来,向 testdata 表中插入一些测试数据。

mysql> insert into testdata values(null, 'hello', 12345);
Query OK, 1 row affected (0.00 sec)mysql> select * from testdata;
+----+-------+-------+
| ID | FOO   | BAR   |
+----+-------+-------+
|  1 | hello | 12345 |
+----+-------+-------+
1 row in set (0.00 sec)mysql>

上下文配置

在 Tomcat 中配置 JNDI DataSource,通过在 Context 中添加资源声明来实现。

例如:

<Context><!-- maxTotal: 数据库连接池中的最大连接数。确保你配置了足够大的 mysqld max_connections 来处理所有的数据库连接。设置为 -1 表示无限制。 --><!-- maxIdle: 连接池中保留的最大空闲数据库连接数。设置为 -1 表示无限制。请参阅 DBCP 2 文档以了解有关此参数以及 minEvictableIdleTimeMillis 配置参数的更多信息。 --><!-- maxWaitMillis: 等待数据库连接可用的最长时间(以毫秒为单位),例如在此示例中为 10 秒。如果超过此超时时间,则会抛出异常。设置为 -1 表示无限等待。 --><!-- username 和 password: 数据库连接的 MySQL 用户名和密码  --><!-- driverClassName: 旧的 mm.mysql JDBC 驱动程序的类名是 org.gjt.mm.mysql.Driver - 我们建议使用 Connector/J。官方 MySQL Connector/J 驱动程序的类名是 com.mysql.jdbc.Driver。 --><!-- url: 连接到 MySQL 数据库的 JDBC 连接 URL。 --><Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"maxTotal="100" maxIdle="30" maxWaitMillis="10000"username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/javatest"/></Context>

web.xml 配置

现在为此测试应用程序创建一个 WEB-INF/web.xml。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaeehttps://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"version="6.0"><description>MySQL Test App</description><resource-ref><description>DB Connection</description><res-ref-name>jdbc/TestDB</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>
</web-app>

测试代码

现在创建一个简单的 test.jsp 页面供以后使用。

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><sql:query var="rs" dataSource="jdbc/TestDB">
select id, foo, bar from testdata
</sql:query><html><head><title>DB Test</title></head><body><h2>Results</h2><c:forEach var="row" items="${rs.rows}">Foo ${row.foo}<br/>Bar ${row.bar}<br/>
</c:forEach></body>
</html>

该 JSP 页面利用了 JSTL 的 SQL 和 Core 标签库。您可以从 Apache Tomcat Taglibs - Standard Tag Library 项目中获取它 — 确保获取 1.1.x 或更新的版本。一旦您获得了 JSTL,将 jstl.jar 和 standard.jar 复制到您的 Web 应用的 WEB-INF/lib 目录中。

最后,将您的 Web 应用部署到 $CATALINA_BASE/webapps,可以是一个名为 DBTest.war 的 war 文件,也可以是一个名为 DBTest 的子目录。

部署后,将浏览器指向 http://localhost:8080/DBTest/test.jsp,即可查看您的辛勤工作的成果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

变形记---容灾恢复(一),异常崩溃引发服务器丢档或无法正常运行

接着上篇文章 变形记---抽象接口,屎山烂代码如何改造成优质漂亮的代码 ,我一直想写一些对年轻人有帮助的文档来,刚好最近有空就零零碎碎写了一些,罗列了一些提纲然后改再删,花了一个礼拜的时间。 写这一系列的 “变形记”,也是因为最近我给M部门面试服务器主程序开发的职…

现代软件为什么要采用微服架构

现代软件采用微服务架构是为了解决传统单体架构在开发、部署和维护大型应用时面临的一系列问题。以下是采用微服务架构的主要优势&#xff1a; 1. **模块化和组件化**&#xff1a;微服务通过将应用拆分为一系列小型、松耦合的服务来提高模块化水平。每个服务都是围绕特定的业务…

RabbitMQ 各种通信模式的Python实现

一、RabbitMQ 原理 1、基本原理 RabbitMQ是流行的开源消息队列系统&#xff0c;用erlang语言开发。RabbitMQ是AMQP&#xff08;高级消息队列协议&#xff09;的标准实现。支持多种客户端&#xff0c;如&#xff1a;Python、Java、Javascript、C#、C/C,Go等&#xff0c;支持AJ…

音响扫频分析音频特性

把音响的的扬声器断开&#xff0c;接负载电阻&#xff0c;再连接到AP仪器端进行扫频测试&#xff0c;可得到频响曲线。

开源大模型 Llama 3

开源大模型Llama 3是一个在多个领域都展现出卓越性能的大模型。下面将为您介绍Llama 3的特性和一些简单的使用案例。 一、Llama 3介绍 Llama 3在Meta自制的两个24K GPU集群上进行预训练&#xff0c;使用了超过15T的公开数据&#xff0c;其中5%为非英文数据&#xff0c;涵盖30多…

刀片式服务器的作用有哪些?

刀片式服务器是是一种紧凑的独立服务器&#xff0c;将多个服务器功能集成在一个紧凑的机箱中&#xff0c;这种服务器设计可以使数据中心更加高效地管理硬件资源&#xff0c;提高服务器的可靠性和可扩展性&#xff0c;在多种场景中得到广泛的应用。 刀片式服务器的作用有哪些呢&…

WEB前端常规技术面试题之HTML+CSS基础

//每小时20道基础你知道么&#xff1f; 1.简述html、http、www、URL、web、W3C的意思 Html:超文本标记语言 http:超文本传输协议 www: 是环球信息网&#xff08;World Wide Web&#xff09;的缩写&#xff0c;也可以简称为Web&#xff0c;中文名字为“万维网”。 URL:统一…

使用yolov8 进行实例分割训练

1、基于windows 的ISAM标注 直接下载安装包&#xff0c;解压后即可使用 链接&#xff1a;https://pan.baidu.com/s/1u_6jk-7sj4CUK1DC0fDEXQ 提取码&#xff1a;c780 2、标注结果转yolo格式 通过ISAM标注后的json文件路径 原始json格式如下&#xff1a; ISAM.json 转 yolo.…

【机器学习】机器学习学习笔记 - 无监督学习 - k-means/均值漂移聚类/凝聚层次聚类/近邻传播聚类 - 05

pdf在线免费转word文档 https://orcc.online/pdf 不限次数、免费不需要注册。 无监督学习 (聚类) 聚类是一种无监督学习方法&#xff0c;是将数据划分为若干个簇&#xff0c;使得簇内的点尽可能相似&#xff0c;簇间尽可能不相似。 k-means 聚类 k-means 聚类算法是一种迭…

Leetcode算法训练日记 | day30

一、重新安排行程 1.题目 Leetcode&#xff1a;第 332 题 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发…

给index.html 添加javascript 元素,最好放到那个位置

给index.html 添加javascript 元素呢&#xff1f; 给index.html 添加javascript 元素 有两种添加方式&#xff0c;head部位或 body部位 reason reason1&#xff1a;浏览器是从上到下解析此文件&#xff0c;将script文件放到head部分中&#xff0c;浏览器会优先解析和执行jav…

深入刨析 mysql 底层索引结构B+树

文章目录 前言一、什么是索引&#xff1f;二、不同索引结构对比2.1 二叉树2.2 平衡二叉树2.3 B-树2.4 B树 三、mysql 的索引3.1 聚簇索引3.2 非聚簇索引 前言 很多人看过mysql索引的介绍&#xff1a;hash表、B-树、B树、聚簇索引、主键索引、唯一索引、辅助索引、二级索引、联…

【Hadoop大数据技术】——Sqoop数据迁移(学习笔记)

&#x1f4d6; 前言&#xff1a;在实际开发中&#xff0c;有时候需要将HDFS或Hive上的数据导出到传统关系型数据库中&#xff08;如MySQL、Oracle等&#xff09;&#xff0c;或者将传统关系型数据库中的数据导入到HDFS或Hive上&#xff0c;如果通过人工手动进行数据迁移的话&am…

怎么看自己是不是公网IP?

当我们需要进行网络连接或者网络配置的时候&#xff0c;经常会遇到需要知道自己是否拥有公网IP的情况。公网IP是全球唯一的IP地址&#xff0c;在互联网上可直接访问和被访问&#xff0c;而私有IP则是在本地网络中使用&#xff0c;无法从互联网上直接访问。我们将介绍如何查看自…

笔记-----BFS宽度优先搜索

对于BFS&#xff1a;宽搜第一次搜到就是最小值&#xff0c;并且基于迭代&#xff0c;不会爆栈。 Flood Fill 模型 如果直译的话就是&#xff1a;洪水覆盖&#xff0c;意思就是像是从一个点一圈圈的往外扩散&#xff0c;如果遇见能够连通的就扩散&#xff0c;如果遇见无法联通的…

TCP三次握手,但通俗理解

如何用通俗的语言来解释TCP&#xff08;传输控制协议&#xff09;的三次握手过程&#xff1f; 想象一下你正在和朋友电话沟通&#xff0c;但你们之间不是心灵感应&#xff0c;而是需要通过清晰地听到对方的声音来确认通话质量良好。TCP三次握手就像是在电话拨通之前&#xff0…

爱普生发布一款16位MCU产品用于大电流LED驱动

精工爱普生发布一款内置Flash存储器的16位微控制器S1C17M13 该新品可以提供最大56mA的驱动电流用于驱动发光二极管(LED) 以往爱普生的微处理器大多继承了液晶驱动器电路&#xff0c;但近来随着工业自动化和家用设备使用7段LED显示的数量大幅增加&#xff0c;爱普生也推出了对应…

第五届上海市青少年算法竞赛 T6 位置互换(广度优先搜索)

第六题&#xff1a;T6位置互换 标签&#xff1a;广度优先搜索题意&#xff1a;给定一个矩形地图&#xff0c;地图中 . . .代表可以走的空地&#xff1b; # \# #代表不可以走的墙壁&#xff1b; 1 1 1表示小爱初始的位置&#xff1b; 2 2 2表示小艾初始的位置。小爱和小艾可以上…

k8s:通过nodeSelector将pod调度到含有指定标签的结点上

一、查看node,并给node打标签 二、在资源清单文件中配置nodeSelector来指定要往满足哪个标签条件的结点进行调度 apiVersion: v1 kind: Pod metadata:name: probe-tcp spec:containers:- name: nginximage: nginxlivenessProbe:initialDelaySeconds: 5timeoutSeconds: 5tcpSo…

宝塔面板使用docker+nginx+gunicorn部署Django项目实战教程

第一步&#xff1a;创建Django项目 使用pip install django安装创建django项目的依赖在电脑某个根目录下执行django-admin startproject app创建一个名为app的Django项目。目录结构如下: ├── app │ ├── init.py │ ├── asgi.py │ ├── settings.py │ ├── url…