仅创建一次数据库连接

时间:2014-01-28 17:22:32

标签: java constructor

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()的每次执行中更改我的设计以仅创建一次连接而不是一遍又一遍。我试图不在任何其他类和数据库类

中执行此操作

3 个答案:

答案 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而不是在方法运行

中创建新实例