Oracle在Linux系统连接很慢的问题

2023-11-18

无比的兴奋,新版本的Bing支持国际版,这样就可以更好的检索国外的资料了。Oracle在Centos7中连接局域网内的速度很慢的问题,终于找到问题的原因了,当然可能还会存在其他问题,本文考虑两个:
(1)代理问题

ProxySelector.setDefault(null);

在开始连接数据库前调用,我开始的时候感觉有效,过一段时间就没有效果了,任然很慢,甚至第一次连接是失败的。

(2)安全随机数问题
后面继续检索(bing国际版),发现找到了问题:安全随机数问题(PRNG)。
经过测试,发现,的确,Windows系统上和Linux系统上,执行的时间不一样,代码如下:

long start = (Calendar.getInstance().getTimeInMillis());
System.out.println("Ok: " + SecureRandom.getInstance("SHA1PRNG").nextLong());
System.out.println(Calendar.getInstance().getTimeInMillis() - start);

Windows上执行,第一次在:60ms左右,后面该函数执行时间在1ms以内;而CentOS7 + OpenJDK 1.8,第一次在4800ms左右,后面函数执行时间在1ms以内。这个现象和连接Oracle第一次很慢很相似。
如何提高速度呢?stackflow上建议增加参数:

-Djava.security.egd=file:/dev/urandom
// 或(建议使用下面)
-Djava.security.egd=file:/dev/./urandom

通过增加该参数执行程序,发现,第一次执行时间在CentOS机器上只有39ms!
当然,专家说,这样得到的随机数是不安全的!
为什么不安全?其实随机数是一种可重复算法,给定随机数种子的情况下,随机数每一次的随机数应该相同的(与字面定义不同),为了获得真正的随机数,随机种子必需真正的随机!所以,这里面实现随机数的方法就有多种了,比如通过访问服务器获得随机数种子,或者收集系统特定的随机信息得到随机数种子,总之,这个过程需要时间……为了安全,他们还说,如果主板有随机数硬件,那就可以用这个……可是这个真不懂!
总之,在内网环境下,连接一下数据库,我觉得一般般的安装就够了,对不!影响启动数据可不行,尤其是调试程序的时候。测试代码如下,有兴趣的朋友可以测试一下自己的机器是不是这个问题:
OracleConnTest.java

import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import java.util.List;

public class OracleConnTest {
    public static void main(String[] args){
        try {
            ProxySelector selector = ProxySelector.getDefault();
            List<Proxy> lstProxies = selector.select(URI.create("socket://10.0.0.10:1521"));
            if (lstProxies != null){
                for (Proxy proxy : lstProxies){
                    System.out.println(proxy.address().toString() + ", " + proxy.type());
                }
            }

            ProxySelector.setDefault(null);
            lstProxies = selector.select(URI.create("socket://10.0.0.10:1521"));
            if (lstProxies != null){
                for (Proxy proxy : lstProxies){
                    System.out.println(proxy.address().toString() + ", " + proxy.type());
                }
            }

            long start;
            start = Calendar.getInstance().getTimeInMillis();
            Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
            System.out.println("time elpase in get forname action:" + (Calendar.getInstance().getTimeInMillis() - start));

            start = Calendar.getInstance().getTimeInMillis();
            Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@10.0.0.10:1521:irobot",
                    "robotservice", "robotservice");
            System.out.println("time elpase in get connection action:" + (Calendar.getInstance().getTimeInMillis() - start));

            start = Calendar.getInstance().getTimeInMillis();
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery("select 10 from dual");
            System.out.println("time elpase in get data action:" + (Calendar.getInstance().getTimeInMillis() - start));
            while(rs.next()){
                System.out.print("must be 10:" + rs.getInt(1));
            }

            start = Calendar.getInstance().getTimeInMillis();
            rs.close();
            st.close();
            conn.close();
            System.out.println("time elpase in get close action:" + (Calendar.getInstance().getTimeInMillis() - start));
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

执行方法如下:
java -cp .:./ojdbc6.jar OracleConnTest
java -cp .:./ojdbc6.jar -Djava.security.egd=file:/dev/./urandom OracleConnTest

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

Oracle在Linux系统连接很慢的问题 的相关文章

随机推荐

  • 【使用Excel批量修改文件名称——超详细教程——无需复杂操作;bat,ren指令】

    基本指令 bat concatenate concatenate 该公式用于给新文件名名称添加后缀 ren公式 ren A2 B2 要注意的是ren后边有一个空格 后边有一个空格 此公式用于合并旧文件与新文件名称 操作步骤 首先创建一个文本
  • C语言 函数 下

    函数的定义 如果函数的定义在main函数之后 函数要在main函数前先进行声明 写一个函数完成两个整数的相加 int Add int a int b 函数的声明 int main printf 请您输入a b的值 int a 0 int b
  • Python入门---初识

    Python简介 Python的历史 1989年圣诞节 Guido von Rossum开始写Python语言的编译器 1991年2月 第一个Python编译器 同时也是解释器 诞生 它是用C语言实现的 后面 可以调用C语言的库函数 在最早
  • python入门教程(非常详细)

    Python是一种高级 解释性的脚本语言 其简单易学 灵活 强大等特点 使其成为了当代最流行的编程语言之一 如果您是想学习Python编程的新手 以下是详细的Python入门教程 以帮助您快速掌握Python编程基础 1 安装Python
  • STM32 基础系列教程 50 – MbedTls

    前言 mbed TLS 以前称为PolarSSL 是TLS和SSL协议的实现 并且需要相应的加密算法和支持代码 这是双重许可与Apache许可证 2 0版 与GPLv2许可也可 网站上指出 mbed TLS的目标是 易于理解 使用 集成和扩
  • 详解 C 语言中的弱符号与弱引用

    C语言中的 attribute weak 与 attribute weakref 引言 最近在看 linux 中一些驱动代码 驱动代码中为了实现程序的扩展性和兼容性用了很多 C 语言中的高级特性 本节就来谈一谈 C 语言中的弱符号和弱引用的
  • 机器学习在工程中使用要点

    机器学习现在有很多分支 大部分使用数据和模型优化入手 在此之前机器学习按照学派划分是有可靠的理论依据的 那么我们使用应该注意以下几点 1 如何获取训练集 一般我们下载现有的训练集为了学习或者来测试自己的算法泛化能力的表现水平 这时候我们对训
  • Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    首先介绍一些乐观锁与悲观锁 悲观锁 总是假设最坏的情况 每次去拿数据的时候都认为别人会修改 所以每次在拿数据的时候都会上锁 这样别人想拿这个数据就会阻塞直到它拿到锁 传统的关系型数据库里边就用到了很多这种锁机制 比如行锁 表锁等 读锁 写锁
  • 每日站会是在浪费时间...吗?

    原文链接作者 Mark Levison 又要开站会 实在是浪费时间 打断我的工作啦 每日站会只是为ScrumMaster刷存在感而设计的 便于他微观管理 每日站会上就是汇报一下状态 而我写个邮件就行了啊 你以前听说过这些抱怨吗 我听过 不过
  • Java中获取数组长度

    Java中获取数组长度 方法 使用数组属性length来获取数组长度 代码 public class ArrayLength public static void main String args String data new Strin
  • Linux服务器之间的文件同步(单向同步:rsync+inotify)

    1 rsync简介 rsync是linux系统下的数据备份工具 支持本地复制 或者与其他SSH rsync主机同步 2 rsync的部分特性 rsync支持很多特性 可以镜像保存整个目录树和文件系统 可以很容易做到保持原来文件的权限 时间
  • APICloud(四):图片上传-Java版

    这一篇讲 将选择的图片上传到指定的服务器 说实话 这个功能写了好久 一会儿json拼的有问题访问不到后台 一会儿后台又说form表单的enctype不是multipart form data类型 各种乱七八糟的问题折腾了一下午都没好 第二天
  • 蓝桥杯---貌似化学---逆矩阵

    试题 算法训练 貌似化学 资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 现在有a b c三种原料 如果他们按x y z混合 就能产生一种神奇的物品d 当然不一定只产生一份d 但a b c的最简比一定是x y z 现在给你
  • 快速识别图像的RGB值

    今天无意发现 使用QQ的文字识别功能也可以识别色彩颜色 ctrl alt o 移动鼠标指针至想要提取颜色的位置 按c键就可以复制色号了 代码里一粘贴直接就是RGB值
  • 线性自抗扰(LADRC)的stm32f1程序,实现用编码器反馈控制直流电机调速,控制器采用加了TD的LADRC

    线性自抗扰 LADRC 的stm32f1程序 实现用编码器反馈控制直流电机调速 控制器采用加了TD的LADRC 控制效果良好 h和 c分开 代码清晰有注释 有调试说明 YID 1235653714412755tbNick 9w978
  • 记一次 微信小程序封装请求方法

    调用 const res await requestMmsq app params 或者 request app then res gt const baby fetus res this setData baby fetus
  • vscode是什么(vscode干嘛用的)

    vscode是什么 接触VSCode不太长 但是我觉得我越来越喜欢它 所以我想写些关于它的东西 vscode 首先介绍一下这东西是什么 当然 这是由M 开发和开源的轻量级IDE 可以免费使用 我这样定义 它和VisualStudio之间的区
  • Youtube ASX Portfolio的视频笔记 What is a Quant? - Financial Quantitative Analyst

    What is a Quant Financial Quantitative Analyst YouTube youtube 上搜 option pricing 很多讲解 Stochastic Calculus的 In this video
  • RTTI简述

    RTTI的用途 RTTI的使用 dynamic cast typeid 使用总结 dynamic cast与其他转换运算符 RTTI的用途 得益于虚函数表 如果派生类实现了基类中的虚函数 通过基类指针或引用可以完成正确的函数调用 但是也不得
  • Oracle在Linux系统连接很慢的问题

    无比的兴奋 新版本的Bing支持国际版 这样就可以更好的检索国外的资料了 Oracle在Centos7中连接局域网内的速度很慢的问题 终于找到问题的原因了 当然可能还会存在其他问题 本文考虑两个 1 代理问题 ProxySelector s