Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.Connection在线程中不可见_Java_Multithreading - Fatal编程技术网

java.sql.Connection在线程中不可见

java.sql.Connection在线程中不可见,java,multithreading,Java,Multithreading,我用java.sql.Connection和字符串参数创建了一个线程。 但在线程中,我观察到字符串值可用,但连接对象不可用。有什么线索吗 编辑问题的细节: 看起来连接对象是可用的,但在线程内部是封闭的。 代码如下: package com.catgen.helper; import java.sql.Connection; public class ImageCheckHelper extends Thread{ public Connection conn = null;

我用java.sql.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.

我看不出你的问题是什么-看看输出,你可以看到连接和字符串在构造函数中都是非空的,当你开始运行线程时

唯一的区别是,在正在构造的线程和正在运行的线程之间的某个点上,连接已经关闭。根据您提供连接的方式以及其他线程使用连接的方式,这并不特别罕见。在任何情况下,如果您想跟踪此情况,您应该查看在同一连接对象上调用close的其他线程

一般来说,让每个线程管理自己的连接通常是最容易的,因为否则,您最终会遇到一些非常棘手的关于提交和关闭它们的语义,正如您在这里看到的那样。在多个线程之间共享连接可以起作用,而且在极少数情况下是必要的,但一般来说,这应该是例外而不是规则


编辑:此外,许多连接实现甚至都不是线程安全的,因此您无法在多个线程之间可靠地使用它们。如果一个线程正在运行一条语句,然后您尝试在另一个线程上使用该连接,那么就会发生不好的事情。更合理的做法是,只为每个线程提供自己的连接,让它继续执行它想做的事情,而不必进行某种互斥同步——这也是一个瓶颈,会消除多线程的一些吸引力

另一个线程是否正在关闭它被赋予构造函数的时间和它在run方法中使用的时间之间的连接?我的猜测是,在initiateImageCheck调用返回后,但在run方法到达isClosed检查之前,连接关闭

如果没有,您可以访问JDBC驱动程序的源代码吗?我想知道它是否在保护自己不被多线程使用

连接不能保证线程安全,因此您应该从将要使用它的线程中获取连接


您还可以从两个不同的线程对conn进行非同步访问。公共成员变量也不是一个好主意,尤其是在需要线程安全的类中。

如果您没有提供任何代码,就不能。请注意,JDBC对象(如连接、语句、结果集等)通常不是线程安全的;不要同时使用来自多个线程的对象。如果有多个线程同时访问同一数据库,则每个线程都需要自己的独立连接。知道如何在线程内不关闭连接吗?James-唯一的方法是不要在其他位置关闭连接。但正如我所说的,一般来说,更好的解决方案是确保每个线程都使用自己的连接。这似乎是暗中发生的。这里我的要求是只创建一个线程并传递连接以供进一步使用。线程的用途是让用户知道进程在启动操作后立即启动,而无需用户等待操作完成。我无法从代码中看到,因为这不是您的整个代码库。什么代码调用构造函数?该代码从何处获得连接?同样的连接会在其他地方使用吗?而不是整个代码。我闻到鱼腥味。可能是的。我会回来的。你面前有完整的密码。连接未在两者之间的任何其他位置关闭。关于非同步访问,我这样做是为了简化这里的代码,因为我们只有一个线程。好的,在创建线程之后,正常的流会立即继续,并最终关闭连接。非常感谢richj。