2014-01-28 55 views
0
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类:在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()方法。我想在Database类中创建数据库连接和prepareStatement,但是在Database类构造函数上这样做会多次创建连接。我怎样才能改变我的设计来创建连接只有一次,而不是在run()的每次执行中都不会重复。我试图在其他任何课程中都不这样做,只是数据库类

回答

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

+0

您的方法假定只有一个ItemDispatcher实例。 –

+0

@codenoire,他仍然可以通过ItemDispatcher,我没有假设只是ItemDispatcher的一个实例,而是一个连接的实例。 – Leo

+0

当分派器的两个实例共享单个数据库连接时,您可能不会构建可伸缩的应用程序。他们中的第二个需要做一些事情,就是搞砸了。单身人士是整个应用程序。这实际上比OP要求的更多 - 他/她要求在***实例***范围内的运行方法使用一个数据库连接。 –

0

待办事项它在数据库类的静态块

static { 

} 

但这意味着连接和声明将是静态的,然后通过数据库的所有实例共享。

正如从另一个SO交一个例子:

public static final Map<String, String> initials = new HashMap<String, String>(); 
static { 
    initials.put("AEN", "Alfred E. Newman"); 
    // etc. 
} 
0

在ItemDispatcher的范围内,声明型数据库的专用变量X。你可以用一个单独的方法(最好)或者在构造函数中初始化它(可能没问题)。使用私有变量X代替在方法中创建新实例运行