我对Java比较陌生。我正在修补一个小程序,该程序使用带有几个字段的JFrame来查询和插入数据库。
我目前有一个除了创建数据库连接之外什么都不做的类。从那里,我有其他类来执行SELECT或INSERT数据库功能。其中每个都是通过为数据库连接类创建新对象开始的。完成后连接会关闭。
对此我不熟悉,我只是想看看这是否是访问数据库的最佳方式,即:每次按下按钮时创建和关闭一个全新的连接。它执行所需的任务,但如果有更有效或明智的方法来做到这一点,我很想知道。
我可以提供您可能需要查看的任何代码。谢谢!
答案 0 :(得分:1)
从java访问数据库的常用方法是连接池。我推荐你这个:http://jolbox.com/
在您的数据库交互代码中,您只需从池创建连接(实际上它借用了池中的连接),并且在请求之后只需关闭连接(实际上它返回到池的连接)。
public class DAO {
private final DataSource ds;
public void foo(...) {
Connection connection = ds.getConnection();
try {
// do work there
} finally {
connection.close();
}
}
}
public class MainPanel extends JPanel {
private final DAO dao;
public MainPanel(DAO dao) {
this.dao = dao;
}
// ...
}
public class Main {
public static void main(String[] args) {
Class.forName("org.hsqldb.jdbcDriver");
BoneCPDataSource ds = new BoneCPDataSource();
ds.setJdbcUrl("jdbc:hsqldb:mem:test");
ds.setUsername("sa");
ds.setPassword("");
DAO dao = new DAO(ds);
MainPanel mainPanel = new MainPanel(dao);
// ...
}
}
答案 1 :(得分:1)
您可以创建一次连接,然后使用它多少次。有两种标准方法:单例和依赖注入。由于单身因素有多种原因通常不是一个好的解决方案,所以我坚持使用依赖注入。
我们走了。
数据库类(伪代码):
public class Database implements Closeable {
private final DBConnection connection;
public Database(String url, String db, String user, String password) {
// TODO: establish connection
}
// TOOD implement methods for working with DB, for example:
public void add(String foo, String bar) {
// TODO
}
@Override
public void close() throws IOException {
connection.close();
}
}
使用数据库的GUI:
public class GUI extends JPanel {
private Database db;
public GUI(Database db) {
this.db = db;
}
// TODO implement GUI, use `db` to access the database
}
初始化应用程序:
public static void main(String[] args) {
Database db = new Database(...);
GUI gui = new GUI(db);
// TODO: create JFrame, add GUI to it
}
这可能适用于大多数情况。对于更复杂或运行时间较长的软件,一直不使用数据库连接(或者您需要更多数据库连接),最好在未使用等情况时关闭连接。对于这种情况,请使用连接池,如Denis Borovikov所示:https://stackoverflow.com/a/29395796/2709026