Java 只创建一次数据库连接

Java 只创建一次数据库连接,java,constructor,Java,Constructor,我有一个ItemDispatcher类: public class Database { private String ric; private String volume; private String _url; private String _userId; private String _password; private String _dbLib; private String _dbFile; private Co

我有一个ItemDispatcher类:

public class Database {

    private String ric;
    private String volume;

    private String _url;
    private String _userId;
    private String _password;
    private String _dbLib;
    private String _dbFile;
    private Connection _conn;
    private PreparedStatement _statement;

    public Database(LSE item) {
        ric = item.get_ric();
        volume = item.get_volume();
    }

    public void writeToDb() throws SQLException{
          //setString           
    }
}
itemdpatcher
中的
run()
方法重复运行。我想在
database
类中创建数据库连接和
prepareStatement
,但在database类构造函数上这样做会多次创建连接。如何更改设计,以便在每次执行
run()
时只创建一次连接,而不是一次又一次地创建连接。我试图在任何其他类中都不这样做,而只是在数据库类中使用。这将允许您只有一个数据库连接的instance。 以您的代码为例,如下所示:

public class ItemDispatcher implements Runnable {

    private LSE lse;

    public ItemDispatcher(LSE lseItem) {
        this.lse= lseItem;
    }

    @Override
    public void run() {
        try {
            new Database(lse).writeToFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果您的应用程序将使用线程(并发),我建议您也为这些情况准备您的单例,

在类数据库的静态块中执行

public class Database {

private String ric;
private String volume;

private String _url;
private String _userId;
private String _password;
private String _dbLib;
private String _dbFile;
private Connection _conn;
private PreparedStatement _statement;
private static final Database INSTANCE;

private Database(LSE item) {
    ric = item.get_ric();
    volume = item.get_volume();
}

public static final Database getInstance(LSE item) {
   if (INSTANCE == null) {
         INSTANCE = new Database(LSE item);
    }

   return INSTANCE;
 }

public void writeToDb() throws SQLException{
      //setString           
}
}
但这意味着连接和语句将是静态的,然后由数据库的所有实例共享

正如另一篇SO文章中的一个例子:

static {

}
public static final Map initials=new HashMap();
静止的{
姓名首字母。put(“AEN”、“阿尔弗雷德·E·纽曼”);
//等等。
}

在ItemDispatcher的范围内,声明类型为数据库的私有变量X。您可以在单独的方法(最佳)或构造函数(可能可以)中初始化它。使用私有变量X,而不是在方法run

中创建新实例。您的方法假设只有一个ItemDispatcher实例。@codenoire,他仍然可以传递ItemDispatcher,我不假设只有一个ItemDispatcher实例,但只有一个连接实例。您可能无法构建一个可扩展的应用程序,其中两个dispatcher实例共享一个数据库连接。他们中的第二个需要做一些交易,你完蛋了。单例是应用程序范围的。这实际上比OP要求的要多——他/她要求在实例范围内使用run方法来使用一个数据库连接。我不知道她/他在哪里指定代码将部署在集群或其他地方,我看到的是一个从java开始的人,必须知道Singleton,尽管正如你所评论的,这是一个广泛的应用。
public static final Map<String, String> initials = new HashMap<String, String>();
static {
    initials.put("AEN", "Alfred E. Newman");
    // etc.
}