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
}
}
我有一个ItemDispatcher类:
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();
}
}
}
run()
中的 ItemDispatcher
方法反复运行。我想在prepareStatement
类中创建数据库连接和Database
,但在Database类的构造器上执行此操作会多次创建连接。如何在run()
的每次执行中更改我的设计以仅创建一次连接而不是一遍又一遍。我试图不在任何其他类和数据库类
答案 0 :(得分:0)
使用Singleton pattern。这将允许您只有一个数据库连接实例。 以您的代码为例,它将是这样的:
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
}
}
如果您的应用程序将使用线程(并发),我建议您也为这些情况准备单例,see this question
答案 1 :(得分:0)
在类Database
中的静态块中执行此操作static {
}
但这意味着Connections和Statement将是静态的,然后由所有Database实例共享。
正如另一篇SO帖子中的一个例子:
public static final Map<String, String> initials = new HashMap<String, String>();
static {
initials.put("AEN", "Alfred E. Newman");
// etc.
}
答案 2 :(得分:0)
在ItemDispatcher的范围内,声明类型为数据库的私有变量X.您可以在单独的方法(最好)或构造函数中初始化它(可能没问题)。使用私有变量X而不是在方法运行
中创建新实例