在不同Java进程中使用Java TCL(tclblend)JDBC连接身份验证错误
我正在尝试运行几个连接到DB的进程,执行一些操作,然后完成它 我的代码如下所示在不同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
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监视线程中的连接和关闭时间,查看是否一次只能访问一个数据库。