java跑一段时间后就报:Caused by: java.sql.SQLException: 无法从套接字读取更多的数据。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java跑一段时间后就报:Caused by: java.sql.SQLException: 无法从套接字读取更多的数据。相关的知识,希望对你有一定的参考价值。

oracle,java跑一段时间后就报:Caused by: java.sql.SQLException: 无法从套接字读取更多的数据。使用的是url=jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.209)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.210)(PORT = 1521))(LOAD_BALANCE = yes) (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = orcl)))是集群的.急,求高手出手,,谢谢

引起这种错误的原因很多,几点建议:
1、检查程序,优化数据库操作及SQL语句,如该关闭的数据库链接要及时关闭、查询语句该简化的简化;
2、检查网络状况,排除网络原因;
3、调整数据库配置参数,比如:会话超时时间、每秒最大连接数、最大连接数等等;
4、看看数据库的版本,有没有升级的可能,也许会解决这个问题;
参考技术A 检查一下jar包是否导入,数据库名,用户名和密码是否正确
这个代码我运行是正确的。
参考技术B 检查一下jar包是否导入,数据库名,用户名和密码是否正确
这个代码我运行是正确的。
参考技术C 你数据量有多少啊??我这数据量达到170多万条也报这个错,缓存不够大 ,调了一下OK了。。你试试 参考技术D sid问题

Caused by: java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block

   前一阵子做应用内秘钥加密,用得RSA,加密没有问题,但是在解密阶段,直接就报错,关键的错误就是标题的这个错误。

不明白为什么测试的时候没有问题,但是正是运行的时候有问题,认真看了一下报错,是说需要解密的RSA数据太大了。。其实解决方式很简单,就是在加密的时候对已经RSA加密的数据进行Base64加密,然后解密的时候先进行Base64解密,然后进行RSA解密。废话不多说,上RSAUtil关键代码

package com.sunsy.demoproject.util;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import sun.misc.BASE64Decoder;

public class RSAUtil 

    /**
     * 从字符串中加载公钥
     *
     * @param publicKeyStr 公钥数据字符串
     * @throws Exception 加载公钥时产生的异常
     */
    public static RSAPublicKey loadPublicKey(String publicKeyStr) throws Exception 
        try 
            BASE64Decoder base64Decoder = new BASE64Decoder();
            byte[] buffer = base64Decoder.decodeBuffer(publicKeyStr);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
            return (RSAPublicKey) keyFactory.generatePublic(keySpec);
         catch (NoSuchAlgorithmException e) 
            throw new Exception("无此算法");
         catch (InvalidKeySpecException e) 
            throw new Exception("公钥非法");
         catch (IOException e) 
            throw new Exception("公钥数据内容读取错误");
         catch (NullPointerException e) 
            throw new Exception("公钥数据为空");
        
    

    public static RSAPrivateKey loadPrivateKey(String privateKeyStr) throws Exception 
        try 
            BASE64Decoder base64Decoder = new BASE64Decoder();
            byte[] buffer = base64Decoder.decodeBuffer(privateKeyStr);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
         catch (NoSuchAlgorithmException e) 
            throw new Exception("无此算法");
         catch (InvalidKeySpecException e) 
            throw new Exception("私钥非法");
         catch (IOException e) 
            throw new Exception("私钥数据内容读取错误");
         catch (NullPointerException e) 
            throw new Exception("私钥数据为空");
        
    


    /**
     * 加密
     *
     * @param publicKey
     * @param srcBytes
     * @return
     * @throws NoSuchAlgorithmException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */
    public static byte[] encrypt(RSAPublicKey publicKey, byte[] srcBytes) 
        try 
            if (publicKey != null) 
                //Cipher负责完成加密或解密工作,基于RSA
                Cipher cipher = Cipher.getInstance("RSA");
                //根据公钥,对Cipher对象进行初始化
                cipher.init(Cipher.ENCRYPT_MODE, publicKey);
                byte[] resultBytes = cipher.doFinal(srcBytes);
                return resultBytes;
            
         catch (NoSuchAlgorithmException e) 
            e.printStackTrace();
         catch (InvalidKeyException e) 
            e.printStackTrace();
         catch (NoSuchPaddingException e) 
            e.printStackTrace();
         catch (BadPaddingException e) 
            e.printStackTrace();
         catch (IllegalBlockSizeException e) 
            e.printStackTrace();
        
        return null;
    

    /**
     * 解密
     *
     * @param privateKey
     * @param srcBytes
     * @return
     * @throws NoSuchAlgorithmException
     * @throws NoSuchPaddingException
     * @throws InvalidKeyException
     * @throws IllegalBlockSizeException
     * @throws BadPaddingException
     */
    public static byte[] decrypt(RSAPrivateKey privateKey, byte[] srcBytes) 
        try 
            if (privateKey != null) 
                //Cipher负责完成加密或解密工作,基于RSA
                Cipher cipher = Cipher.getInstance("RSA");
                //根据公钥,对Cipher对象进行初始化
                cipher.init(Cipher.DECRYPT_MODE, privateKey);
                byte[] resultBytes = cipher.doFinal(srcBytes);
                return resultBytes;
            
         catch (NoSuchAlgorithmException e) 
            e.printStackTrace();
         catch (InvalidKeyException e) 
            e.printStackTrace();
         catch (NoSuchPaddingException e) 
            e.printStackTrace();
         catch (BadPaddingException e) 
            e.printStackTrace();
         catch (IllegalBlockSizeException e) 
            e.printStackTrace();
        
        return null;
    

上面这个就是RSA加密,解密工具类。你可以自己生成公钥,私钥进行测试。

先说我引起错误的代码

package com.sunsy.demoproject.activity

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Base64
import android.view.View
import com.starv.recommend.utils.PreContact
import com.starv.recommend.utils.PreUtil
import com.sunsy.demoproject.R
import com.sunsy.demoproject.config.Config
import com.sunsy.demoproject.util.RSAUtil
import kotlinx.android.synthetic.main.ac_main.*

class MainAc : AppCompatActivity() 

    private var originSign = "R++ihY0MA1wPfhVu5R2qW5XLx8OJSoXyC8m55CZOKTY=";

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.ac_main)
    

    /**
     * 解密
     */
    fun decode(view: View) 
        var rsaSign = PreUtil.getInstance().getString(PreContact.SIGN)
//        String(RSAUtil.decrypt(RSAUtil.loadPrivateKey(Config.PRIVATEKEY), Base64.decode(rsaSign, Base64.DEFAULT)))
        tv_decode.text = String(RSAUtil.decrypt(RSAUtil.loadPrivateKey(Config.PRIVATEKEY), rsaSign.toByteArray()))
    

    /**
     * 加密
     */
    fun encode(view: View) 
        var rsaSign = RSAUtil.encrypt(RSAUtil.loadPublicKey(Config.PUBLICKEY), originSign.toByteArray())
//        PreUtil.getInstance().putString(PreContact.SIGN, Base64.encodeToString(RSASign, Base64.DEFAULT))
        PreUtil.getInstance().putString(PreContact.SIGN, String(rsaSign))
        tv_encode.text = String(rsaSign)
    

解决方案就是把我注释的代码放开,注释掉下面的那个就可以。

以上是关于java跑一段时间后就报:Caused by: java.sql.SQLException: 无法从套接字读取更多的数据。的主要内容,如果未能解决你的问题,请参考以下文章

Caused by: java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block

Caused by: java.lang.ClassNotFoundException: com.alibaba.dubbo.common.Version

java 如何让一个程序运行一段时间后就停止运行

如何修复由 Caused by: java.lang.NumberFormatException: For input string: "pets" 引起的 Asynctask 错

java 如何让一个程序运行一段时间后就停止运行

异常Zipkin server启动 Caused by: java.lang.ClassNotFoundException: com.linecorp.armeria.server.cors.Co