Tomcat的JDBC数据源之一(如何使用配置JDBC数据源)

2023-11-15

JDBC数据源是什么:
许多 Web 应用程序需要通过 JDBC 驱动程序访问数据库,以支持该应用程序所需的功能。Java EE 平台规范要求 Java EE 应用服务器为此目的提供DataSource实现(即用于 JDBC 连接的连接池)。
注意- Tomcat 中的默认数据源是DBCP 2连接池 。但是,可以通过编写自己的自定义资源工厂 来使用任何其他实现的连接池。
如何使用JDBC数据源:

  1. 安装JDBC驱动,将驱动程序的 JAR 文件安装到 $CATALINA_HOME/lib目录中。
  2. 声明你的资源需求 修 改 Web 应用程序下 ( /WEB-INF/web.xml) 声明 JNDI名称,后续通过该名称查找预配置的数据源。示例代码:
  <resource-ref>  
   <description>java.sql.Connection 实例的工厂的资源引用,可用于与 Web 应用程序的 <Context> 配置中配置的特定数据库进行通信。  
  </description>   
  <res-ref-name>
       dbc/TestDB   
  </res-ref-name>   
  <res-type>
     javax.sql.DataSource   
  </res-type>   
  <res-auth>
      Container   
  </res-auth> 
</resource-ref>

3.配置Tomcat的资源,将jdbc的配置加入应用程序的[]Web元素中。代码示例:

<Context ...>
  ...
  <Resource name="jdbc/TestDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="dbusername"
            password="dbpassword"
            driverClassName="com.mysql.cj.jdbc.Driver"
            url="jdbc:mysql://mysqlUrl:mysqlPort/databaseName"
            maxTotal="8"
            maxIdle="4"/>
  ...
</Context>

4.如何在代码中使用该数据源。代码示例如下:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/TestDB");

Connection conn = ds.getConnection();
... 使用此连接访问数据库 ...
conn.close();

自此tomcat的数据源配置完成。

如果默认的数据源不满足的你的需求,tomcat支持自定义数据源。那么如何自定义呢?下面分四个步骤讲解。

如何使用自定义数据源

  1. 编写你的自定义资源工厂类。

需要实现JNDI javax.naming.spi.ObjectFactory接口的类。每次Web 应用程序调用lookup()绑定到该工厂的上下文条目时, getObjectInstance()都会调用该方法。示例代码:

public class MyBeanFactory implements ObjectFactory {

  public Object getObjectInstance(Object obj,
      Name name2, Context nameCtx, Hashtable environment)
      throws NamingException {

      // 获取我们指定的bean类的一个实例
      MyBean bean = new MyBean();

      // 从我们的属性中自定义 bean 属性
      Reference ref = (Reference) obj;
      Enumeration addrs = ref.getAll();
      while (addrs.hasMoreElements()) {
          RefAddr addr = (RefAddr) addrs.nextElement();
          String name = addr.getType();
          String value = (String) addr.getContent();
          if (name.equals("foo")) {
              bean.setFoo(value);
          } else if (name.equals("bar")) {
              try {
                  bean.setBar(Integer.parseInt(value));
              } catch (NumberFormatException e) {
                  throw new NamingException("Invalid 'bar' value " + value);
              }
          }
      }

      // 返回自定义实例
      return (bean);

  }

}

在这个例子中,无条件地创建一个类的新实例,并根据包含在 配置这个工厂com.mycompany.MyBean的元素中的参数填充它的属性。
2.声明你的资源需求
修 改 Web 应用程序下 ( /WEB-INF/web.xml) 声明 JNDI 名称。后续通过该名称查找此 bean 的新实例。最简单的方法是使用元素,如下所示:

<resource-env-ref>
<description>
MyBean 实例的对象工厂。
</description>
<resource-env-ref-name>
 MyBeanFactory
</resource-env-ref-name>
<resource-env-ref-type>
 com.mycompany.MyBean
</resource-env-ref-type>
</resource-env-ref>

3.配置Tomcat的资源工厂
将以下 []元素添加到 Web 应用程序中:

<Context ...>
  ...
  <Resource name="MyBeanFactory" auth="Container"
            type="com.mycompany.MyBean"
            factory="com.mycompany.MyBeanFactory"
            singleton="false"
            bar="23"/>
  ...
</Context>

4.在你的应用程序中使用该资源
示例代码如下:

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("MyBeanFactory");

writer.println("foo = " + bean.getFoo() + ", bar = " + bean.getBar());

如何在tomcat中使用JDBC数据源就结束了。下一章将从源码分析,tomcat是如何加载jdbc数据源的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat的JDBC数据源之一(如何使用配置JDBC数据源) 的相关文章

  • 无法执行目标 org.codehaus.mojo:exec-maven-plugin:1.5.0:exec

    三周前 我完成了一个网络应用程序的工作 一切都运行没有问题 现在 三周后 没有任何更改 我想再次运行该应用程序 但这次我收到以下错误消息 An error occurred while parsing the server response
  • SharePoint 2010 Web 服务上的 Java JBoss 401 错误

    我的代码在 Eclipse IDE 中测试时运行成功 我正在使用生成的 Copy wsdl 通过 Web 服务连接到 MS SharePoint 2010 当我在 JBoss 服务器上部署代码 运行 Adob e LifeCycle 时 我
  • 浏览时 Java Applet 不会被终止

    当用户离开加载小程序的页面时 如何停止 Java 小程序的进程 我正在使用 Chrome 现在要杀死小程序 我必须使用窗口的任务栏并杀死进程 java exe Java applet 具有生命周期方法 那些是init start stop
  • 有没有一种干净的方法将泛型类型的类分配给变量?

    鉴于此代码 List
  • Google API - 重定向 URI 不匹配错误

    我正在我的网络应用程序上实现 google 登录 我通过参考this尝试过link https developers google com web signin server side flow 我的 google 登录按钮如下 div s
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • 从 Windows Batch (cmd.exe) 中的文件读取环境变量

    我正在尝试从批处理文件中读取变量 以便稍后在批处理脚本 Java 启动器 中使用 理想情况下 我希望所有平台 Unix Windows 上的设置文件都具有相同的格式 并且也是有效的 Java 属性文件 也就是说 它应该看起来像这样 sett
  • 将 Swing 集成到简单的文本冒险游戏中

    我对 Java 中的一些中级概念相当陌生 最近 我制作了一款名为 DazzleQuest 的文本冒险游戏 它完全在开发者控制台 终端中运行 它涉及到我的朋友作为角色 所以我想向他们展示它 并通过将命令行的功能和控制台的输出转移到一个简单的
  • Cognito SRP 身份验证 JAVA SDK

    我正在尝试使用 Cognito 验证 Java 应用程序 我在Python中使用了warrant库 效果非常好 但我现在想在java中做同样的事情 我的 Python 函数用于身份验证warrant https github com cap
  • 在 Selenium Grid 中注册 PhantomJS 节点时出错

    我有以下问题 我成功启动了 Selenium Grid hub java jar selenium server standalone 2 53 0 jar role hub 之后我尝试使用以下命令启动 PhantomJS 节点 phant
  • 使用 PowerMock 和 TestNG 模拟单个静态方法

    class StaticClass public static String a return a public static String ab return a b 我想嘲笑StaticClass a以便它返回 x 并致电StaticC
  • 具有多个字符串的列表视图

    我正在尝试创建一个包含多个字符串的列表视图 现在我有一个可以实现的功能 while i lt 10 GETS DATA FROM WEBPAGE ETC a DATAFROMWEBPAGE1 b DATAFROMWEBPAGE2 c DAT
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 谷歌的Json解析Gson库:JsonElement和JsonObject有什么区别?

    public abstract class JsonElement extends Object 表示 Json 元素的类 它可以是 JsonObject JsonArray JsonPrimitive 或 JsonNull public
  • 不支持使用 JDK 版本“11.0.1”进行构建。请安装 JDK 版本 `1.8.0`

    我已经下载了 Visual Studio for Mac 并尝试开始学习 Xamarin iOS 和 Android 问题是当我尝试运行 android 项目时出现以下错误 Building with JDK Version 11 0 1
  • 尝试用Java实现基于文本的Hangman游戏

    我需要检查用户输入的字母以及他们猜测的空格是否位于隐藏单词的特定位置 变量one等于用户猜测的空间索引 而letterGuess是他们猜测的字母 我的代码怎么错了 示例 秘密词是你好 hidden word is 用户猜测h 0 1 2 3
  • Java:易失性足以使类线程安全?

    我有一个关于 Java 中 volatile 语句的问题 请看这个构造的例子 class Master Foo is a class with thread safe methods public volatile Foo foo clas
  • 在地图中的图块上实现鼠标单击事件

    我正在尝试在 JPanel 上实现图像 基本上是地图上的图块 的鼠标单击事件 我只是不知道该怎么做 我有一个扩展 JPanel 的 Main 类 我正在从图块服务器检索图块 并根据特定的缩放级别在 Main 类的 PaintComponen
  • 在android中测量不规则多边形的面积

    我正在开发一个应用程序 在其中我在地图上绘制多边形 并且我使用的地图不是谷歌 它的Mapsforge开源离线地图库 我可以通过将地理点转换为像素点来轻松在地图上绘制多边形 但在这里我想发现是不规则的多边形 为此我做了很多尝试 但它让我失败了
  • 如何读取FTL文件中的JSONArray?

    我在我的 Java 文件中硬编码了以下 JSON 对象 JSONObject notificationInfoJson new JSONObject notificationInfoJson put title Payment Receiv

随机推荐

  • 连续七天登录-在线人数最多

    连续七天登录 select id count from select date add dated rown as startdate from select row number over PARTITION by id order by
  • 随笔篇-多线程世界的来龙去脉

    文章目录 线程 多线程带来的问题 线程的挂起与唤醒 线程的管理 如果看官觉得有点用 点赞一下 鼓励一下我吧 感谢原创的整理 以下是原文作者连接 原文 https zhuanlan zhihu com p 122010626 以下为摘抄概要整
  • JSP数据交互(二)----》浏览器缓存cookie

    学会使用浏览器缓存cookie 生活中的cookie 系统会记录已经浏览过的搜索记录 cookie是Web服务器保存在客户端的一系列文本信息 cook的作用 对特定的对象追踪 实现各种个性化功能 简化登录 安全性能 容易泄露信息 在JSP中
  • Latex 操作(3) beamer(PPT)

    1 新建文件 documentclass 11pt beamer 11pt 是设置的字号大小 usetheme CambridgeUS 排版主题Madrid 在每个section前有一个current显示 放到引言区 在每个section前
  • QT 按键组 - QButtonGroup

    链接 https blog csdn net potato123232 article details 118788209 ops request misc 257B 2522request 255Fid 2522 253A 2522167
  • 无人飞行器智能感知竞赛--模拟器安装

    开发环境 win11 wsl2 注意事项 请配合视频使用 如果不看视频会对下面的配置过程迷惑 因为一开始我是想安装在ubuntu18 04的 中途发现ubuntu18 04没有ros noetic 所以转入ubuntu20 04配置 视频链
  • 过年宅家,学习wxPython,编了个数回(Slither Link)小游戏,踩了好多坑,特记一下

    今年过年真是前所未有的有时间 哪都去不了 于是难得得有时间想学习一下 好多年没编程 没写博客 因为总是编嵌入式的c程序 对界面开发基本没搞过 过去只会用Borland C 还是6 0 真是太过时了 好在还学过python 听说用python
  • gcc编译程序的四个阶段(预处理-编译-汇编-链接)

    相关博客http blog csdn net eastonwoo article details 8655243 相关博客http blog sina com cn s blog 5ff8e88e01015tga html gcc的编译流程
  • 【实战】基于GDAL库读取指定经纬度下的地表覆盖数据(数据源:清华大学FROM_GLC10(2017))

    目录 前言 数据源 清华大学宫鹏教授学科组10m土地覆盖数据 数据集类型 下载途径 GDAL库读取FROM GLC10数据集 下载一个GIS平台 数据集命名规则 GetGeoTransfrom方法介绍 实例代码 geoTransform参数
  • R读取csv格式文件;result <- read.table;及报错

    设置文件目录 读取数据csv csv的分隔符 注意表格中不能有逗号 一般仅要设施以下参数 result lt read table file header TRUE sep stringsAsFactors FALSE setwd C Us
  • dll文件保存到服务器,dll是什么文件?dll文件怎么打开?

    dll是Dynamic Link Library的简称 意为动态链接库 dll文件一般被储放在C WindowsSystem目录下 在Windows中 很多应用软件并并不是一个详细的可实行文件 他们被切分成一些相对性单独的动态链接库 即dl
  • SuperSocket使用 IRequestInfo 和 IReceiveFilter 等对象实现自定义协议

    本文章向大家介绍SuperSocket使用 IRequestInfo 和 IReceiveFilter 等对象实现自定义协议 主要包括SuperSocket使用 IRequestInfo 和 IReceiveFilter 等对象实现自定义协
  • 常见性能测试指标

    性能测试核心指标 吞吐量 响应时间 Rsponse Time 并发处理能力 资源占用能力 测试中的时间占比 40 性能测试分析 30 测试执行 30 测试结果分析 而全链路监控就是只要和系统相关的全部需要监控到 吞吐量 单位时间内 系统能够
  • 红黑树与AVL树的区别

    文章目录 红黑树与AVL树的区别 红黑树的一个案列 英文答案 红黑树的高度问题 红黑树的优点 与AVL树的比较 相同点 使用 红黑树为何能比AVL树高效的原因 分析 红黑树的应用领域 java 集合类和c STL Linux 选择RBTre
  • Microsoft Store无法打开解决方法

    Microsoft Store 无法启动 网络出错问题解决 Microsoft Store 无法启动 一直在转圈 最后显示网络出错的问题 解决方法 1 通过搜索打开 gt 控制面板 2 打开 gt 网络和Internet 3 打开 gt I
  • 有道云笔记登录失败,解决办法

    今天登录有道云笔记是 无论是app还是pc端 一直显示登陆失败 摸索了解决方法 先登录网页版官网 网页版肯定可以登录的 https note youdao com 进入账号安全 点击你要登陆的端注销 然后重新登陆 亲测 大功告成
  • VirtualBox 无法选择 64 位的虚拟机

    VirtualBox 无法选择 64 位的虚拟机 问题 解决方案 问题 在Win10 64位机器上安装VirtualBox只显示32bit 没有64bit选项 解决方案 一般是电脑没有把支持虚拟机的选项打开 虚拟化功能被占用 控制面板 程序
  • MYSQL 几种 join

    注意 Oracle数据库支持full join mysql是不支持full join的 但仍然可以同过左外连接 union 右外连接实现 初始化SQL语句 join 建表语句 drop database if exists test cre
  • C为什么斐波那契数列递归50不会栈溢出

    今天看了个文章 是说递归的 大概代码如下 void test int n if n lt 1000000 test n 1 int main test 1 return 0 运行报错 Stack overflow 堆栈溢出 为什么会溢出内
  • Tomcat的JDBC数据源之一(如何使用配置JDBC数据源)

    JDBC数据源是什么 许多 Web 应用程序需要通过 JDBC 驱动程序访问数据库 以支持该应用程序所需的功能 Java EE 平台规范要求 Java EE 应用服务器为此目的提供DataSource实现 即用于 JDBC 连接的连接池 注