为什么 JDBC 驱动程序必须放在 TOMCAT_HOME/lib 文件夹中?

2024-03-22

我有一个奇怪的问题,两个带有 Oracle JDBC 驱动程序的 Web 应用程序会相互冲突。我必须将 JDBC 驱动程序 JAR 放在 common 文件夹中TOMCAT_HOME/lib。这是什么原因呢?


JDBC 驱动程序在 JVM 范围的单例中注册自己DriverManager http://download.oracle.com/javase/6/docs/api/java/sql/DriverManager.html共享者all网络应用程序。如果您有相同的(如类名)的 JDBC 驱动程序从两个不同的 Web 应用程序注册两次,这可能会导致您的问题。如果您的 Web 应用程序使用同一 JDBC 驱动程序的不同版本,则问题会更大。

此外,将 JDBC 驱动程序放入 Tomcat 的 lib 文件夹中将有助于防止在不重新启动 Tomcat 的情况下重新部署 Web 应用程序时发生内存泄漏,例如如果你只是将一个新的 WAR 文件放入 Tomcat 的 webapps 文件夹中:

班上DriverManager由引导类加载器加载,从而全局“存在”在 JVM 中,而 Tomcat 在其自己的类加载器中加载所有 Web 应用程序。因此,如果 Web 应用程序的 WEB-INF/lib 文件夹中的 JDBC 驱动程序将自身注册到DriverManager,它将该 Web 应用程序的类加载器固定在内存中(从而固定该 Web 应用程序的所有类),从而防止其垃圾回收。

如果相反,两者DriverManager由于 JDBC 驱动程序来自非 Web 应用程序类加载器,您可以自由地重新部署 Web 应用程序,而无需任何 Web 应用程序类将自身固定在从其他类加载器加载的类中。

当前版本的 Tomcat(可能是 6.x,肯定是 7.x)将在 JDBC 驱动程序检测到内存泄漏时记录有关取消部署 Web 应用程序的警告。

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

为什么 JDBC 驱动程序必须放在 TOMCAT_HOME/lib 文件夹中? 的相关文章

随机推荐

  • 使用 WCF 流上传文件,从流中进行微小读取

    我已经使用WCF的流实现了文件上传 一切都按预期进行 但是我遇到了一个问题 我分配 4kb 缓冲区来从传入流中读取数据 但 WCF 仅读取 255 字节 这是我的上传功能 public UploadResponse UploadFile F
  • 一张 Microsoft SQL 表可以有多个主键吗?

    我一直很好奇 但找不到简洁的答案 有什么帮助吗 它不能有超过一个首要的关键 但是 它的主键中可以有多于一列 它也可以有多个唯一索引 通常 唯一索引是主键 但单个表上可以有多个唯一索引 我一时想不出一个例子 但当我想到的时候我会添加它 EDI
  • 如何修复 Eclipse 警告:“建议插件 'XXX' 从 JAR 运行,指定 'unpack="false"' 属性”

    该插件确实需要解压 是的 我知道它不应该关心 但它确实关心 我只是想让这个警告消失 我该怎么做 尝试设置Bundle ClassPath在你的清单中 这个头告诉 OSGi 在你的包中哪里可以找到这些类 如果未指定 则默认值为 这意味着你的包
  • 列表框未选择所选项目

    请参阅下面的代码视觉工作室2010ListBox 上方有一个 TextBox 通过绑定 当选择某个项目时 文本框可以变大或变小 这会导致列表框移动 当列表框移动时 所选项目不是被单击的项目 所选项目是移动的ListBox 上鼠标下方的项目
  • 从不同线程读取值

    我正在用 Go 编写可以进行大量并行计算的软件 我想从工作线程收集数据 但我不太确定如何以安全的方式做到这一点 我知道我可以使用通道 但在我的场景中 它们使事情变得更加复杂 因为我必须以某种方式在主线程中同步消息 等到每个线程发送一些内容
  • R下载。文件错误无法打开URl

    temp lt tempfile download file file connect me test gz temp 该网址存在是因为我可以将其放入浏览器中 但是当我运行该代码时 出现错误 Error in download file f
  • 将 sqldf 中的整数值转换为日期时间

    我正在使用 sqldf 库返回具有不同值的数据框 并且仅返回日期列的最大值 数据框看起来像这样 NAME val1 val2 DATE A 23 7228 0 5829 11 19 2014 8 17 A 23 7228 0 5829 11
  • AngularFire2 - 如何在页面刷新后保持登录状态

    我正在将 AngularFire2 用于应用程序 并且已经获得了与 Firebase 一起使用的注册 登录功能 但是 每次刷新页面时 登录状态都会重置并且不会持续存在 尽管我觉得我错过了一些非常小的东西 但我不太找到执行此操作的功能 我可以
  • 在 FPC 下的自动化对象中使用标识符或保留字

    实际上我在 Free Pascal 下使用 OLE 自动化 但某些对象具有使用保留字作为名称的属性 因此我无法编译代码 检查这个样本 MyObj OleVariant begin MyObj CrealeOleObject AObject
  • 使用 BottomNavigationBar 根据页面更改 AppBar 标题

    我试图根据用户所在的页面更改 AppBar 标题 页面由加载不同类 页面 的 BottomNavigationBar 控制 我设法改变这一点的唯一方法是为每个页面添加一个应用栏 我认为这不是继续下去的方法 class HomePage ex
  • 如何更改 Android 中滚动条的颜色?

    当前的问题是我们的主题继承自 Theme AppCompat 它似乎有一个白色滚动条 并且在白色背景上不可见 我知道我可以使用
  • 三星 S4 上的蓝牙崩溃

    我正在运行一个带有 BLE 扫描的应用程序 一段时间后在 Samsung S4 上或者如果周围有超过 10 个信标 我会看到此错误 07 18 11 51 57 169 W bt userial 7819 userial read thre
  • 如何在 django admin 中显示我的模型的所有字段?

    此代码显示如下对象 Home Object 1 Home Object 2 但我想在我的 django 管理页面中显示所有模型字段 我该怎么做 我是 django 的初学者 这是我的第一个项目 模型 py class Home models
  • R:如何使 data.table 只读而不复制它(例如用于数据验证)

    我进行数据整理 ETL 以将新数据加载到数据库中 并希望让用户基于我现有的实现自己的数据验证功能data table包含准备好的数据的对象 如何避免用户可以更改 修改 我的数据data table在验证函数中 有意或无意 而不进行复制 因为
  • 升级到1.2.162.1后:vkQueueWaitIdle == VK_ERROR_DEVICE_LOST

    我最近将光线追踪渲染器从 Vulkan SDK 版本 1 2 148 0 升级到 1 2 162 1 这是必要的 因为光线追踪扩展已经结束测试版 因此现在可以与非测试版一起使用 显卡驱动程序 我的 RTX 2070 SUPER 的版本为 4
  • 实体框架 - 从数据库更新模型... - 没有更新发生!

    我的数据库中有一个名为CompanyDetails 它有一个名为CharacterID varchar 255 我刚刚将其从NOT NULL列到一个NULL柱子 我在模型浏览器和 EDMX 文件查看器中运行了 从数据库更新模型 命令 这是它
  • C# 中的十六进制运算[重复]

    这个问题在这里已经有答案了 有关在 C 中解析 转换 操作十六进制值的任何提示吗 特别是我想将十进制整数转换为十六进制 然后输出为字符串 Int32 decValue 42 string hexValue decValue ToString
  • GAE/GWT:加载模块时出错:无法找到“com/androidstartup/serialization/KPadProject.gwt.xml”

    我正在使用 Eclipse 3 5 和 GAE SDK 1 3 7 GWT SDK 2 1 0 和 Restlet 2 0 3 当我运行我的应用程序时 控制台日志显示 Loading modules com androidstartup s
  • 如何在 Curses 中获取 Shift+X / Alt+X 键?

    I am currently using this code to grab key strokes but I am missing e g Shift Alt keys like Ctrl Shift S Ctrl Shift Alt
  • 为什么 JDBC 驱动程序必须放在 TOMCAT_HOME/lib 文件夹中?

    我有一个奇怪的问题 两个带有 Oracle JDBC 驱动程序的 Web 应用程序会相互冲突 我必须将 JDBC 驱动程序 JAR 放在 common 文件夹中TOMCAT HOME lib 这是什么原因呢 JDBC 驱动程序在 JVM 范