HikariCP:为 Oracle 11g 设置 maxLifetime 时应考虑哪些数据库级别超时

2024-03-18

在 HikariCP 的文档中提到

我们强烈建议设置此值,并且它应该比任何数据库级连接超时至少少 30 秒。

Oracle 11g.2 数据库应考虑哪些数据库级连接超时?我怎样才能找到这些超时(要执行的查询)?


简短回答:无(默认情况下)。


作为记录(在链接更改时在此处包含详细信息),我们正在讨论属性maxLifetime of HikariCP https://github.com/brettwooldridge/HikariCP:

该属性控制池中连接的最长生命周期。正在使用的连接永远不会退休,只有当它关闭时才会被删除。我们强烈建议设置此值,并且它应该比任何数据库或基础设施施加的连接时间限制至少少 30 秒。值 0 表示没有最大生命周期(无限生命周期),当然取决于idleTimeout 设置。默认值:1800000(30 分钟)

根据我的经验,HikariCP 这样做是一件好事。据我所知默认情况下,Oracle 不强制连接的最大生存期(既不在 JDBC 驱动程序端 (1),也不在服务器端 (2))。所以在这方面,“基础设施施加的连接时间限制“是+无穷大——这对我们来说是一个问题,因为我们确实观察到了长期连接的问题。这也意味着任何值都是”至少少30秒”,包括默认值:)

I suppose连接层对此不做任何事情,因为它依靠上面的池层来处理这些事情。这是不可能的(现已弃用)隐式连接池 https://docs.oracle.com/cd/B14117_01/java.101/b10979/conncache.htm,我不知道是否UCP https://docs.oracle.com/cd/E11882_01/java.112/e12265/intro.htm#BABHFGCA(替代品)可以做到这一点,但如果你使用 HikariCP,你就不会使用那些。

现在,对于给定的连接 30 分钟后(通常是在出于各种目的多次重复使用之后),HikariCP 会关闭它并创建一个新的连接。这样做的成本非常小,并且解决了我们与长期连接的问题。我们对这个默认值很满意,但为了以防万一,仍然可以配置它(参见下面的 2)。

(1) OracleDataSource不提供任何配置点 http://download.oracle.com/otn_hosted_doc/jdeveloper/905/jdbc-javadoc/oracle/jdbc/pool/OracleDataSource.html#setConnectionProperties(java.util.Properties)(属性或系统属性)来控制它,我observed无限的寿命。

(2) 服务器端限制参见轮廓参数IDLE_TIME http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_6010.htm#SQLRF01310。引用这个答案 https://stackoverflow.com/a/1967638/6730571:

默认情况下,Oracle 不会因不活动而关闭连接。您可以使用 IDLE_TIME 配置配置文件以使 Oracle 关闭不活动的连接。

验证的值是什么IDLE_TIME对于您的用户,结合以下答案本次问答 https://stackoverflow.com/a/42022379/6730571:

select p.limit
from dba_profiles p, dba_users u
where p.resource_name = 'IDLE_TIME' and p.profile = u.profile and u.username = '...'
;

默认值为UNLIMITED.

Please note there can be other limits enforced elsewhere (firewall... yes I've been bitten by that, although most DB systems have a keep-alive mechanism) that might interfere. So you'd better make it configurable, in case such issues are discovered when you deploy your product.


在 Linux 上,您可以验证物理连接的最大生命周期通过监视连接到数据库的 TCP 套接字。我一直在我的服务器上运行下面的脚本(从数据库的角度来看,这是client主机),它需要 1 个参数,ip:port你的 oracle 节点的,正如它出现在输出中一样netstat -tan(如果有多个节点,则为模式)。

#!/bin/bash
target="$1"
dir=$(mktemp -d)
while sleep 10
do
    echo "------------ "$(date)
    now=$(date +%s)
    netstat -tan | grep " $target " | awk '{print $4}' | cut -f2 -d: | while read port
    do
        file="p_$port"
        [ ! -e $file ] && touch $file
        ftime=$(stat -c %Z "$file")
        echo -e "$port :\t "$(( now - ftime))
    done
done
\rm "$dir"/p_*
\rmdir "$dir"

If you run that and stop it with ctrl-c during sleep time, it should exit the loop and clean up the temp directory, but this is not 100% foolproof

在结果中所有端口均不应显示超过 1800 秒的值(即 30 分钟),或多或少一分钟。请参阅下面的示例输出,第一个示例显示 2 个套接字超过 1800 秒,它们在 10 秒后消失。

------------ Thu Jul 6 16:09:00 CEST 2017
49806 :  1197
49701 :  1569
49772 :  1348
49782 :  1317
49897 :  835
49731 :  1448
49620 :  1830
49700 :  1569
49986 :  523
49722 :  1498
49715 :  1509
49711 :  1539
49629 :  1820
49732 :  1448
50026 :  332
49849 :  1036
49858 :  1016
------------ Thu Jul 6 16:09:10 CEST 2017
49806 :  1207
49701 :  1579
49772 :  1358
49782 :  1327
49897 :  845
49731 :  1458
49700 :  1579
49986 :  533
49722 :  1508
49715 :  1519
49711 :  1549
49732 :  1458
50026 :  342
49849 :  1046
49858 :  1026

You'll need to run the script for more than 30 minutes to see that, because it does not know age of sockets that existed before

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

HikariCP:为 Oracle 11g 设置 maxLifetime 时应考虑哪些数据库级别超时 的相关文章

  • 在 Oracle BI Publisher 中将数字转换为单词

    我有一个要求 我需要将发票总金额显示为 rtf 中的文字 我尝试过 but it doesn t show any thing Is there any RTF Tag to do such a requirement on layout
  • 在 Android 中使用 SQL (JDBC) 数据库

    在旧的 Java 应用程序中 我使用以下代码连接到 SQL 数据库并将其用于某些查询 private Connection dbConnection null System setProperty derby system home C C
  • 神秘的 getClobVal()

    我有一个表 AKADMIN 其中包含 XMLTYPE 列 其名称为 XML 我想在该列中使用 getClobVal select t xml getClobVal t xml getClobVal t xml getClobVal as c
  • Oracle 12 对 SQL 中的本地集合类型有问题吗?

    长话短说 我建议讨论下面看到的代码 运行时 Oracle 11 编译器引发 PLS 00306 调用 PIPE TABLE 时参数提示的数量或类型错误 PLS 00642 SQL 语句中不允许使用本地集合类型 Oracle 12编译下面的包
  • SQL选择符号||是什么意思意思是?

    什么是 在 SQL 中做什么 SELECT a b AS letter 表示字符串连接 不幸的是 字符串连接不能在所有 sql 方言之间完全移植 ANSI SQL 中缀运算符 mysql concat 可变参数函数 caution 表示 逻
  • 实体框架左外连接和分组抛出:ORA-00907:缺少右括号

    我在基于实体框架的数据访问中使用实体框架来定位多个数据库 我们是一个使用 Entity Framework 已有 2 年的团队 生成的代码与 sql server 2008 完美配合 现在 我们在将数据库迁移到 Oracle 11 Expr
  • 在 Oracle 临时表上放置索引安全吗?

    我读过 不应分析临时表 因为它会破坏其他表的统计信息 指数怎么样 如果我在程序运行期间在表上放置索引 使用该表的其他程序会受到该索引的影响吗 索引是否会影响我的进程以及使用该表的所有其他进程 或者它会单独影响我的过程吗 所有的回复都不是权威
  • SQL*Loader - 如何忽略具有特定字符的某些行

    如果我有一个以下格式的 CSV 文件 fd sdf dsfds dsfd fd asdf dsfds dsfd fd sdf rdsfds dsfd fdd sdf dsfds fdsfd fd sdf dsfds dsfd fd sdf
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • 如何终止正在运行的 SELECT 语句

    如何通过终止会话来停止正在运行的 SELECT 语句 该命令不断根据 SELECT 语句向我提供输出 我想在其间停止它 As you keep getting pages of results I m assuming you starte
  • Oracle Many OR 与 IN () 的 SQL 性能调优 [重复]

    这个问题在这里已经有答案了 我手头没有 解释计划 您能帮忙判断以下哪一个更有效吗 选项1 select from VIEW ABC where STRING COL AA OR STRING COL BB OR STRING COL BB
  • 在 Oracle SQL 中执行 MERGE 时,如何更新 SOURCE 中不匹配的行?

    我有一个main数据库和一个report数据库 我需要同步一个表main into report 但是 当项目在main数据库 我只想设置一个IsDeleted标志在report数据库 执行此操作的优雅方法是什么 我目前正在使用 MERGE
  • 在 C# 中多次使用单个参数的更好方法

    我刚开始使用准备好的语句从数据库查询数据 并且在实现 C 参数 特别是 OracleParameters 时遇到问题 假设我有以下 SQL string sql select from table1 t1 table2 t2 where t
  • 从Oracle表中删除重复行

    我正在 Oracle 中测试某些内容并使用一些示例数据填充表 但在此过程中我不小心加载了重复记录 因此现在我无法使用某些列创建主键 如何删除所有重复行并只保留其中一行 Use the rowid伪列 DELETE FROM your tab
  • 如何在Oracle数据库11g中创建新模式/新用户?

    我已经申请了一家公司的实习机会 作为一个问题 他们要求我为他们的公司创建一个具有一定要求的架构 并将DDL文件 我已经安装了 Oracle 数据库 11g Express 版本 但如何在 Oracle 数据库 11g 中创建新架构 我在网上
  • H2控制台看不到JAVA创建的表

    我已经从以下位置下载了 H2 控制台http www h2database com html download html http www h2database com html download html我已经在我的中配置了 URLjdb
  • 使用 SYS_CONNECT_BY_PATH 的 Oracle 累积计数

    当我尝试对实际数据执行以下查询时 它返回了更多记录数 请帮助解决这个问题 下面是表 DM TEMP SUMMING DVC BY FW 中的实际数据 device count dmc id firmware version cg id im
  • 如何使用 WHERE x IN 子句编写PreparedStatement 的SQL?

    我有一个如下所示的查询 SELECT last name first name middle initial FROM names WHERE last name IN smith jones brown 我需要能够对 IN 子句中的列表进
  • Java MYSQL/JDBC 查询从缓存的连接返回过时的数据

    我一直在 Stackoverflow 中寻找答案 但似乎找不到不涉及 Hibernate 或其他数据库包装器的答案 我直接通过 Tomcat 6 Java EE 应用程序中的 MYSQL 5 18 JDBC 驱动程序使用 JDBC 我正在缓
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10

随机推荐