Java 每次插入数据库时,是否必须获取连接并关闭连接?

Java 每次插入数据库时,是否必须获取连接并关闭连接?,java,sql,oracle,oop,Java,Sql,Oracle,Oop,我只是想知道,在我的java应用程序中,是否真的有必要在每次插入数据库时调用getConnection/closeConnection,或者我是否可以在应用程序开始时验证User/Pass,并且不再调用Connection //Conn class private static final String DRIVER = "oracle.jdbc.driver.OracleDriver"; private static final String URL = "jdbc:oracle:thin:@

我只是想知道,在我的java应用程序中,是否真的有必要在每次插入数据库时调用getConnection/closeConnection,或者我是否可以在应用程序开始时验证User/Pass,并且不再调用Connection

//Conn class
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String URL = "jdbc:oracle:thin:@localhost:1521:XE";
private static final String USER = "hr";
private static final String PASS = "hr";

//Connect
public static Connection getConnection(){
    try {
        Class.forName(DRIVER);
        return DriverManager.getConnection(URL, USER, PASS);
    } catch (ClassNotFoundException | SQLException ex) {
        throw new RuntimeException("Error: RuntimeException",ex);
    }
}

//Close
public static void closeConnection(Connection con){
        try {
            if(con!=null){
            con.close();
        } 
    } catch (SQLException ex) {
            Logger.getLogger(ConnectionAcademia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

//DAO Class
//Insert product
public void createProduct(Product p){

    Connection con = ConnectionGym.getConnection();
    PreparedStatement stmt = null;

    try {

        stmt = con.prepareStatement("INSERT INTO tb_product(key_product, name, price, status) "
                                  + "VALUES(?,?,?,?)");
        stmt.setInt(1, p.getKey_Product());
        stmt.setString(2, p.getName());
        stmt.setDouble(4, p.getPrice());
        stmt.setBoolean(6, p.getStatus());

        stmt.executeUpdate();

        JOptionPane.showMessageDialog(null, "Success!");
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Error: " + ex);
    } finally{
        ConnectionAcademia.closeConnection(con, stmt);
    }
}

你肯定不想这样做。与执行语句所需的时间相比,创建和关闭连接的开销是巨大的。您还将失去准备语句的好处,因为准备好的语句链接到数据库连接以供以后重用

如果您不是在多线程环境(如web应用程序)中工作,那么使用单个连接是完全合理的,请在应用程序启动时创建连接,然后在应用程序完成后关闭

如果您需要并发访问,那么您应该考虑配置连接池,以防止阻塞IO


以上评论中提到的,如果你打算在你的应用程序中做大量的数据库更新,你应该考虑使用<代码> ORM > <代码> Hibernate < /C> >,这将使你的生活从长远来看更容易。您可以保持连接打开。如@shmosel所说,将连接对象另存为Conn类中的变量,并在查询数据库时使用该变量保持连接打开。如果存在安全问题等,则在x分钟后超时。如果您使用的数据源带有连接池,则需要调用

close()
以返回到连接池的连接。否则你会泄露资源。