在不同Java进程中使用Java TCL(tclblend)JDBC连接身份验证错误

在不同Java进程中使用Java TCL(tclblend)JDBC连接身份验证错误,java,jdbc,tcl,Java,Jdbc,Tcl,我正在尝试运行几个连接到DB的进程,执行一些操作,然后完成它 我的代码如下所示 Processing java.sql.SQLRecoverableException: IO Error: Connection reset at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalCo

我正在尝试运行几个连接到DB的进程,执行一些操作,然后完成它

我的代码如下所示

Processing java.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
    at java.sql.DriverManager.getConnection(DriverManager.java:620)
    at java.sql.DriverManager.getConnection(DriverManager.java:169)
    at (...)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at oracle.net.ns.DataPacket.send(DataPacket.java:210)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:321)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:268)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:190)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:107)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:350)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:407)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:416)
    ... 19 more
java.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
    at java.sql.DriverManager.getConnection(DriverManager.java:620)
    at java.sql.DriverManager.getConnection(DriverManager.java:169)
(...)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at tcl.lang.reflect.PkgInvoker.invokeMethod(PkgInvoker.java:128)
    at tcl.lang.JavaInvoke.call(JavaInvoke.java:304)
    at tcl.lang.JavaInvoke.callStaticMethod(JavaInvoke.java:217)
    at tcl.lang.JavaCallCmd.cmdProc(JavaCallCmd.java:74)
    at tcl.lang.AutoloadStub.cmdProc(Extension.java:119)
    at tcl.lang.Interp.callCommand(Interp.java:1266)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at oracle.net.ns.DataPacket.send(DataPacket.java:210)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:321)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:268)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:190)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:107)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:350)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:407)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:416)
    ... 19 more
java.sql.SQLRecoverableException: IO Error: Connection reset
Java使用进程调用脚本

Runtime r = Runtime.getRuntime();
Process p = r.exec(expectPath+" "+expectScriptPath+" "+ticket);        
SessionLogger sysout = new SessionLogger(logger,p.getInputStream());
sysout.start();           
SessionLogger syserr = new SessionLogger(logger,p.getErrorStream());
syserr.start();           
try {
   return p.waitFor();
} catch (InterruptedException e) {
   log.error(e.getMessage(),e);
   return -1;
}
TCL脚本调用java方法

set inputData [ java::call myPackage.TCLDriverWrapper pullNextInputData $ticket ]
Java代码创建jdbc连接,执行简单查询并关闭连接

private static LegacyDriverTaskInputData pullNextInputData(String token) throws Exception {
    Connection conn = null;
    try{
        conn = new TCLDriverWrapper().getConnection();
        QueryRunner run = new QueryRunner();
        ResultSetHandler<LegacyDriverTaskInputData> rsh = new BeanHandler<LegacyDriverTaskInputData>(LegacyDriverTaskInputData.class);
        LegacyDriverTaskInputData inputData = run.query(conn,"select * from mytable where id = ?",rsh,Long.valueOf(token));
        return inputData;
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        throw e;
    } catch (SQLException e) {
        e.printStackTrace();
        throw e;
    } finally {
        DbUtils.close(conn);
    }
}
我注意到的一件事是,当我一次只触发一个进程时,一切正常

但是如果我试图同时运行3个进程(每个进程都在自己的线程中),我会得到这样一个错误

Processing java.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
    at java.sql.DriverManager.getConnection(DriverManager.java:620)
    at java.sql.DriverManager.getConnection(DriverManager.java:169)
    at (...)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at oracle.net.ns.DataPacket.send(DataPacket.java:210)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:321)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:268)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:190)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:107)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:350)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:407)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:416)
    ... 19 more
java.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
    at java.sql.DriverManager.getConnection(DriverManager.java:620)
    at java.sql.DriverManager.getConnection(DriverManager.java:169)
(...)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at tcl.lang.reflect.PkgInvoker.invokeMethod(PkgInvoker.java:128)
    at tcl.lang.JavaInvoke.call(JavaInvoke.java:304)
    at tcl.lang.JavaInvoke.callStaticMethod(JavaInvoke.java:217)
    at tcl.lang.JavaCallCmd.cmdProc(JavaCallCmd.java:74)
    at tcl.lang.AutoloadStub.cmdProc(Extension.java:119)
    at tcl.lang.Interp.callCommand(Interp.java:1266)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at oracle.net.ns.DataPacket.send(DataPacket.java:210)
    at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:321)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:268)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:190)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:107)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
    at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:350)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:407)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:416)
    ... 19 more
java.sql.SQLRecoverableException: IO Error: Connection reset
处理java.sql.SQLRecoverableException:IO错误:连接重置 位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498) 位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:553) 位于oracle.jdbc.driver.T4CConnection(T4CConnection.java:254) 位于oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 位于oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) 位于java.sql.DriverManager.getConnection(DriverManager.java:620) 位于java.sql.DriverManager.getConnection(DriverManager.java:169) 在(…) 原因:java.net.SocketException:连接重置 位于java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) 位于java.net.SocketOutputStream.write(SocketOutputStream.java:153) 位于oracle.net.ns.DataPacket.send(DataPacket.java:210) 位于oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230) 位于oracle.net.ns.NetInputStream.getNextPackage(NetInputStream.java:321) 位于oracle.net.ns.NetInputStream.read(NetInputStream.java:268) 位于oracle.net.ns.NetInputStream.read(NetInputStream.java:190) 位于oracle.net.ns.NetInputStream.read(NetInputStream.java:107) 位于oracle.jdbc.driver.T4CSocketInputStreamWrapper.readnextPackage(T4CSocketInputStreamWrapper.java:124) 位于oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) 位于oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) 位于oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:350) 位于oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) 位于oracle.jdbc.driver.T4CTTIoauthenticate.doosskey(T4CTTIoauthenticate.java:407) 位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:416) ... 还有19个 java.sql.SQLRecoverableException:IO错误:连接重置 位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498) 位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:553) 位于oracle.jdbc.driver.T4CConnection(T4CConnection.java:254) 位于oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 位于oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) 位于java.sql.DriverManager.getConnection(DriverManager.java:620) 位于java.sql.DriverManager.getConnection(DriverManager.java:169) (...) invoke(NativeMethodAccessorImpl.java:57) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:616) 位于tcl.lang.reflect.PkgInvoker.invokeMethod(PkgInvoker.java:128) 调用(JavaInvoke.java:304) 位于tcl.lang.JavaInvoke.callStaticMethod(JavaInvoke.java:217) 在tcl.lang.JavaCallCmd.cmdProc(JavaCallCmd.java:74) 位于tcl.lang.AutoloadStub.cmdProc(Extension.java:119) 位于tcl.lang.Interp.callCommand(Interp.java:1266) 原因:java.net.SocketException:连接重置 位于java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) 位于java.net.SocketOutputStream.write(SocketOutputStream.java:153) 位于oracle.net.ns.DataPacket.send(DataPacket.java:210) 位于oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230) 位于oracle.net.ns.NetInputStream.getNextPackage(NetInputStream.java:321) 位于oracle.net.ns.NetInputStream.read(NetInputStream.java:268) 位于oracle.net.ns.NetInputStream.read(NetInputStream.java:190) 位于oracle.net.ns.NetInputStream.read(NetInputStream.java:107) 位于oracle.jdbc.driver.T4CSocketInputStreamWrapper.readnextPackage(T4CSocketInputStreamWrapper.java:124) 位于oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) 位于oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) 位于oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:350) 位于oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) 位于oracle.jdbc.driver.T4CTTIoauthenticate.doosskey(T4CTTIoauthenticate.java:407) 位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:416) ... 还有19个 java.sql.SQLRecoverableException:IO错误:连接重置 在我看来,有些东西没有正确地去分配某些对象,但我不确定它是在java端,还是在TCL端。另外,我不知道TCL是否为不同的进程共享对象(对我来说没有意义)

欢迎提供任何线索


代码在Linux中运行。

在进程之间共享对象的可能性极低。那是巨大的伏都教。(给每个进程分配一个进入共享空间的委托会更实际,但没有人会为DB连接的这种事情而烦恼。)这也是我的想法@DonalFellows…:-(您的数据库可能正忙于另一个线程中的工作,或者可能已达到其最大连接数。请查找可在db驱动程序中配置的最大连接数、连接等待时间等变量。读连接与写连接可能存在问题。如果可能,请尝试打开只读句柄进行选择。您可能还希望o监视线程中的连接和关闭时间,查看是否一次只能访问一个数据库。