我使用java.sql.Connection和String参数创建了一个线程。 但是从线程内部,我发现String值可用但Connection对象不可用。有线索吗?
(编辑细节问题):
好吧,似乎连接对象可用,但在线程内关闭。 这是代码:
package com.catgen.helper;
import java.sql.Connection;
public class ImageCheckHelper extends Thread{
public Connection conn = null;
public String str = null;
public ImageCheckHelper(Connection conn, String str){
this.conn = conn;
this.str = str;
try{
System.out.println("From inside the constructor");
System.out.println((this.conn!=null)?"Connection is not null":"Connection is null");
System.out.println((this.str!=null)?"String is not null":"String is null");
System.out.println((this.conn.isClosed())?"Connection is closed.":"Connection is not closed");
System.out.println("\n\n");
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
try{
System.out.println("From inside the thread");
System.out.println((conn!=null)?"Connection is not null":"Connection is null");
System.out.println((str!=null)?"String is not null":"String is null");
System.out.println((conn.isClosed())?"Connection is closed.":"Connection is not closed");
}catch(Exception e){
e.printStackTrace();
}
}
public void initiateImageCheck(){
this.start();
return;
}
}
这是输出:
From inside the constructor
Connection is not null
String is not null
Connection is not closed
From inside the thread
Connection is not null
String is not null
Connection is closed.
答案 0 :(得分:0)
我看不出您的问题是什么 - 查看输出,您可以看到Connection
和String
在构造函数和中都是非空的当你来运行线程时。
唯一的区别是在正在构造的线程和正在运行的线程之间的某个时刻关闭了连接。根据您提供连接的方式以及其他线程如何使用它,这并不是特别不寻常。在任何情况下,如果要跟踪此对象,您应该查看在同一Connection对象上调用close()
的其他线程。
作为一般指导原则,让每个线程管理自己的Connection通常最简单,因为否则你会得到一些关于提交和关闭它们的非常棘手的语义(正如你在这里看到的那样)。在多个线程之间共享连接可以工作,并且在极少数情况下是必要的,但一般来说它应该是例外而不是规则。
编辑:此外,许多Connection
实现甚至不是线程安全的,因此您无法以可靠的方式在多个线程之间真正使用它们。如果一个线程正在运行一个语句,然后您尝试在另一个线程上使用该连接,那么将发生坏事。更为合理的是,只需为每个线程提供自己的连接,让它继续处理它想要做的事情,而不必进行某种互斥同步(这也是消除多线程的一些吸引力的瓶颈!)。 / p>
答案 1 :(得分:0)
另一个线程是否在给予构造函数的时间和run()方法中使用它的时间之间关闭连接?我的猜测是,在调用initiateImageCheck()之后,但在run()方法到isClosed()检查之前,连接已关闭。
如果没有,您是否可以访问JDBC驱动程序的源代码?我想知道它是否在保护自己免受多线程使用。
不保证连接是线程安全的,因此您应该从将要使用它的线程中获取连接。
您还可以从两个不同的线程对conn进行不同步的访问。公共成员变量也不是一个好主意 - 特别是在需要线程安全的类中。