Java 只创建一次数据库连接
我有一个ItemDispatcher类: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
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.
}