Oracle JDBC连接BUG解决方案

yizhihongxing

下面是详细的“Oracle JDBC连接BUG解决方案”的攻略。

问题描述

使用Java程序连接Oracle数据库时,经常会遇到连接时出现“ORA-12519, TNS:no appropriate service handler found”的错误提示,造成无法连接数据库的情况。这个问题一般出现在高并发的情况下。

原因分析

这个问题的产生是由于Oracle数据库在处理大量用户连接时,由于数据库链接池的限制,会不能够正常的接收新的连接请求,从而导致上述提示出现。

解决方案

针对这个问题,通常的解决方案是通过在Oracle数据库端增加一些参数来增加数据库链接池的大小,从而提高数据库支持高并发的能力。具体有以下几种方案:

1. 修改数据库的SPFILE

可以通过修改后的spfile文件,来在数据库启动时对数据库链接池的大小进行设置。具体操作如下:

SQL> ALTER SYSTEM SET PROCESSES=500 SCOPE=spfile;
SQL> ALTER SYSTEM SET SESSIONS=1000 SCOPE=spfile;

注意: 以上参数根据实际情况可进行调整。

2. 增加数据库的进程数

通过增加数据库的进程数,可以增强数据库处理高并发连接的能力。具体操作如下:

SQL> ALTER SYSTEM SET processes=500 SCOPE=spfile;

注意: 以上参数根据实际情况可进行调整。

3. 增加JDBC连接的心跳检测时间

由于JDBC连接在使用过程中,可能由于网络因素和数据库负载限制等原因,导致连接中断的情况。可以通过调整JDBC连接的心跳检测时间来降低中断的几率。

对于使用DataSource方式获取连接的程序,可以通过增加以下参数来调整心跳检测时间:

DataSource ds = getDataSource();
ds.setTestOnBorrow(true);
ds.setTestOnReturn(false);
ds.setTestWhileIdle(true);
ds.setTimeBetweenEvictionRunsMillis(60000);
ds.setNumTestsPerEvictionRun(-1);

注意: setTimeBetweenEvictionRunsMillis(60000)表示心跳检测时间为60秒。setNumTestsPerEvictionRun(-1)表示不限定心跳检测次数。

对于使用DriverManager方式获取连接的程序,可以通过增加以下参数来调整心跳检测时间:

Properties props = new Properties();
props.setProperty("user", "admin");
props.setProperty("password", "admin");
props.setProperty("oracle.net.CONNECT_TIMEOUT", "5000");
props.setProperty("oracle.jdbc.ReadTimeout", "180000");

注意: oracle.net.CONNECT_TIMEOUT表示连接超时时间为5秒,oracle.jdbc.ReadTimeout表示读取超时时间为3分钟。

示例说明

示例一

如果使用Java程序连接Oracle数据库时,遇到ORA-12519错误,可以通过增加JDBC连接的心跳检测时间来解决。例如:

public class OracleJdbcTest {
    private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
    private static final String ORACLE_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    private static final String ORACLE_USER = "hr";
    private static final String ORACLE_PASSWORD = "hr";

    public static void main(String[] args) throws Exception {
        Class.forName(ORACLE_DRIVER);
        Properties props = new Properties();
        props.setProperty("user", ORACLE_USER);
        props.setProperty("password", ORACLE_PASSWORD);
        props.setProperty("oracle.net.CONNECT_TIMEOUT", "5000");
        props.setProperty("oracle.jdbc.ReadTimeout", "180000");
        Connection conn = DriverManager.getConnection(ORACLE_URL, props);
        // 执行具体操作
        conn.close();
    }
}

示例二

如果使用DataSource方式获取Oracle数据库连接时,遇到ORA-12519错误,可以通过增加连接池大小来解决。例如:

public class OracleJdbcTest {
    private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
    private static final String ORACLE_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    private static final String ORACLE_USER = "hr";
    private static final String ORACLE_PASSWORD = "hr";

    public static void main(String[] args) throws Exception {
        Class.forName(ORACLE_DRIVER);
        DataSource ds = getDataSource();
        Connection conn = ds.getConnection(ORACLE_USER, ORACLE_PASSWORD);
        // 执行具体操作
        conn.close();
    }

    private static DataSource getDataSource() throws Exception {
        OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
        ds.setURL(ORACLE_URL);
        ds.setUser(ORACLE_USER);
        ds.setPassword(ORACLE_PASSWORD);
        ds.setMinLimit(1);
        ds.setMaxLimit(100);
        ds.setInitialLimit(1);
        return ds;
    }
}

总结

通过以上方案的操作,可以有效提高Oracle数据库的高并发连接处理能力,避免ORA-12519错误的出现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle JDBC连接BUG解决方案 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Java String类正则操作示例

    Java String类正则操作示例 简介 Java中String类提供了很多方法进行正则表达式的操作。通过使用正则表达式,我们可以在字符串中匹配特定的字符或者模式,进行替换或者搜索等操作。在这篇文章中,我们将学习String类操作正则表达式的方法,并且提供两个实际的示例说明。 String类操作正则表达式的方法 Java String类提供了以下方法来操作…

    Java 2023年5月27日
    00
  • 如何使用Java加密技术?

    如何使用Java加密技术? 在Java中,加密技术可以通过Java提供的加密API来实现。常见的加密方式有对称加密、非对称加密和哈希加密。下面是使用Java加密技术的完整使用攻略: 1. 对称加密 对称加密是指加密和解密都使用同一个密钥的加密方式。Java中常见的对称加密算法有DES、3DES、AES等,其中AES被广泛应用。下面是使用AES对称加密的示例代…

    Java 2023年5月11日
    00
  • java中删除 数组中的指定元素方法

    当我们需要删除数组中指定元素时,可以通过以下步骤实现: 遍历数组,找到需要删除的元素; 将被删除元素后面的所有元素向前移动一位; 将数组末尾元素设为null或者0,以保证数组的正确长度。 这里提供两个示例: 示例1: 我们定义一个数组int[] arr = {1, 2, 3, 4, 5},现在我们需要删除元素2,实现代码如下: int[] arr = {1,…

    Java 2023年5月26日
    00
  • Bootstrap的fileinput插件实现多文件上传的方法

    下面我来介绍一下Bootstrap的fileinput插件实现多文件上传的方法。 1. 插件介绍 Bootstrap的fileinput插件是一个强大的文件上传插件,支持多文件上传、图片预览等功能,而且使用起来也非常方便,只需要简单的配置和调用就可以了。 2. 安装插件 你可以通过多种方法来安装Bootstrap的fileinput插件,比如使用CDN、下载…

    Java 2023年6月15日
    00
  • 2023年4月21日-关于远程feign调用实现文件上传下载

    一、客户需求:做一个查询程序,客户提供一个excel模板,将查询结果保存到excel模板中,上传到文件服务,供客户下载使用。 二、代码实现 // 服务A,文件上传 @ApiOperation(“上传文件-demo”) @PostMapping(value = “/uploadDemo/{busType}/{billId}”) public ResBean u…

    Java 2023年4月22日
    00
  • SpringBoot整合Mybatis与MybatisPlus方法详细讲解

    下面我将为您详细讲解SpringBoot整合Mybatis与MybatisPlus的方法。 1. SpringBoot整合Mybatis 1.1 添加依赖 首先,在pom.xml文件中添加Mybatis和Mybatis-spring-boot-starter的依赖: <dependency> <groupId>org.mybatis.…

    Java 2023年5月19日
    00
  • Spring Boot实现功能的统一详解

    Spring Boot实现功能的统一详解 什么是Spring Boot Spring Boot是一个基于Spring框架的快速开发框架,它通过自动化配置、约定优于配置等方式,帮助我们快速构建Spring应用程序。使用Spring Boot可以大大降低Spring应用程序的开发难度和维护成本。 常见功能的实现 1. 数据库操作 Spring Boot提供了丰富…

    Java 2023年5月20日
    00
  • Java之OutputStreamWriter流案例详解

    Java之OutputStreamWriter流案例详解 在Java中,OutputStreamWriter是用于在写入操作时将输出流发送到指定字符编码的字符输出流。本文将详细讲解如何使用OutputStreamWriter流进行写操作。 步骤 创建FileOutputStream类实例,指定写入文件路径。 创建OutputStreamWriter实例,指定…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部