繁体   English   中英

从线程内看不到java.sql.Connection

[英]java.sql.Connection not visible from within a thread

我使用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.

我看不到您的问题是什么-查看输出,可以看到在构造函数中以及当您运行线程时, ConnectionString都不为空。

唯一的区别是,正在构造的线程和正在运行的线程之间的某个位置已关闭连接。 根据您提供连接的方式以及其他线程的使用方式,这并不是特别常见。 无论如何,如果要跟踪此事件,则应查看在同一Connection对象上调用close()其他线程。

作为一般准则,通常让每个线程管理自己的连接是最容易的,因为否则,最终会产生一些关于提交和关闭它们的非常棘手的语义(如您在此处看到的)。 共享多个线程之间的连接可以正常工作,并在极少数情况下是必要的,但在总体上应该是例外而不是规则。

编辑:此外,许多Connection实施甚至都不是线程安全的,因此您不能真正以可靠的方式在多个线程之间使用它们。 如果一个线程正在运行一条语句,然后您尝试在另一个线程上使用该连接,则会发生不良情况。 更为合理的理由是只给每个线程提供自己的连接,让它继续进行自己想做的事情,而不必进行某种互斥锁同步(瓶颈也消除了多线程的吸引力!)。

是否有另一个线程关闭了给构造函数的时间与它在run()方法中使用的时间之间的连接? 我的猜测是,在对initializeImageCheck()的调用返回之后但在run()方法达到isClosed()检查之前,该连接已关闭。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM