【问题标题】:derby database open and close connectionsderby 数据库打开和关闭连接
【发布时间】:2019-12-31 01:22:22
【问题描述】:

我们有一个实用程序类,可以打开和断开 Derby DB 连接
数据库存储在 Windows 7 计算机 C 盘上的文件夹中
该应用程序是使用 JavaFX 8 编写的
我们不使用交易
在使用实用程序类之前,我们将使用每个 CRUD 函数 rs.close() con.close() 打开和断开连接
我们的问题有两个部分
1.我们真的需要用每个CRUD函数打开和关闭连接吗?
2、为什么Utility Class没有关闭rs和stmnt?
conn.close() 在
时触发 我们将发布实用程序类和删除功能的代码
我们还在主类中使用以下代码在应用程序关闭时关闭 Derby DB

    private void handle(WindowEvent e) throws SQLException {
    //Proper CLOSE of connection to DB keeps proper incrementing by 1 as set when the table is created
    JDBCUtil.closeConnection(conn);
    String conURL = "jdbc:derby:;shutdown=true";    
    try{
        DriverManager.getConnection(conURL);
    }catch (SQLException se){
    if(!(se.getErrorCode() == 50000) && (se.getSQLState().equals("XJ015")))
        System.err.println(se);
    }
    System.exit(0);
    Platform.exit(); 
}

实用类
公共类 JDBCUtil {

    public static Connection conn;
    public static Connection getConnection() throws SQLException {
    // The URL is specific to the JDBC driver and the database you want to connect
    String dbName="InfoDB";
    String dbURL = "jdbc:derby:C:/A_DerbyDataBase/DBName/" + dbName + ";create=true";
    //String dbURL = "jdbc:derby:DATABASE_NAME;create=true";
    // Set the user id and password
    //String userId = "app";
    //String password = "app";
    // Get a connection

    conn = DriverManager.getConnection(dbURL);
    // Set the auto-commit to false ONLY if you use Transactions
    /*conn.setAutoCommit(true);*/
    System.out.println("111111111111111111111111111 Get Connection ");
    return conn;
    }

    public static void closeConnection(Connection conn) throws SQLException {

        if (conn != null) {
            System.out.println("222222222222222222222 conn.close ");
            conn.close();
        }
    }
    public static void closeStatement(Statement stmnt) throws SQLException{

        if (stmnt != null) {
            System.out.println("3333333333333333333333 stmnt.close ");
            stmnt.close();
        }
    }
    public static void closeResultSet(ResultSet rs) throws SQLException {

        if (rs != null) {
            System.out.println("44444444444444444444444 rs.close ");
            rs.close();
        }
    }

    /*public static void commit(Connection conn) throws SQLException {

    if (conn != null) {
    conn.commit();
    }
    }
    public static void rollback(Connection conn) throws SQLException {

    if (conn != null) {
    conn.rollback();
    }
    }*/
    public static void main(String[] args) throws SQLException {
    //conn = JDBCUtil.getConnection();
    JDBCUtil.closeConnection(conn);
    }

还有删除功能

    @FXML
private void onDelete(ActionEvent e) throws SQLException, IOException{
    conn = JDBCUtil.getConnection();
    String sql = "DELETE FROM infodata WHERE ID = ?";
    pstmt = conn.prepareStatement(sql); 
    int ID = Integer.valueOf(txfID.getText());
    pstmt.setInt(1, ID);
    pstmt.executeUpdate();
    pstmt.close();

    JDBCUtil.closeConnection(conn);
    ReadFromDB();

    btnEdit.setVisible(false);
    btnDelete.setVisible(false);
    btnCancel.setVisible(false);
    btnAdd.setVisible(true);
    txfInfo.setText("Record Deleted");
}

【问题讨论】:

  • @kleopatra 为什么你觉得有必要编辑 TAG JavaFX
  • 因为不相关,为什么还有;)
  • @kleopatra 很明显,该项目是 JavaFX 8,这对桌面开发人员和遵循 JavaFX 标签的人来说意义重大,所以在我看来,这使它相关你知道 EOF 是什么意思吗?

标签: javafx derby


【解决方案1】:

使用连接池访问数据库

我建议不要编写自己的连接逻辑,而是使用连接池,例如参见Baeldung Hikari Tutorial。你可以这样使用它:

  1. Initialize the connection pool 在您的应用程序的 init method 中。
  2. 当您想使用连接时,请使用 Java try-with-resources 构造,它会在您完成连接后自动关闭连接(将其返回到连接池)。
  3. 在您的应用程序的stop methodclose the connection pool

DataSource 连接的示例包装类(从上面的 Baeldung Hikari 链接复制):

public class DataSource {

    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;

    static {
        config.setJdbcUrl( "jdbc_url" );
        config.setUsername( "database_username" );
        config.setPassword( "database_password" );
        config.addDataSourceProperty( "cachePrepStmts" , "true" );
        config.addDataSourceProperty( "prepStmtCacheSize" , "250" );
        config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );
        ds = new HikariDataSource( config );
    }

    private DataSource() {}

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

使用 Hikari 连接池的示例数据库调用,并使用 Java 的 try with resources 构造自动关闭连接(从上面的 Baeldung Hikari 链接复制):

public static List<Employee> fetchData() throws SQLException {
    String SQL_QUERY = "select * from emp";
    List<Employee> employees = null;
    try (Connection con = DataSource.getConnection();
        PreparedStatement pst = con.prepareStatement( SQL_QUERY );
        ResultSet rs = pst.executeQuery();) {
            employees = new ArrayList<>();
            Employee employee;
            while ( rs.next() ) {
                employee = new Employee();
                employee.setEmpNo( rs.getInt( "empno" ) );
                employee.setEname( rs.getString( "ename" ) );
                employee.setJob( rs.getString( "job" ) );
                employee.setMgr( rs.getInt( "mgr" ) );
                employee.setHiredate( rs.getDate( "hiredate" ) );
                employee.setSal( rs.getInt( "sal" ) );
                employee.setComm( rs.getInt( "comm" ) );
                employee.setDeptno( rs.getInt( "deptno" ) );
                employees.add( employee );
            }
    } 
    return employees;
} 

有关更多信息,请阅读 Baeldung 教程和 Hikari 网站文档:

没有连接池的数据库访问

现在,您不需要使用连接池来执行此操作,您可以为每个数据库调用打开和关闭一个连接,但是出于性能原因,我建议您使用连接池,这样您就不会结束尝试重新发明轮子并最终得到方形而不是圆形的东西。

我没有尝试调试或检查您的问题中的连接实用程序类,但是,如果您无论如何都要用连接池替换它,那么没有理由这样做。

在没有连接池的情况下从 JavaFX 访问数据库的示例代码:

一些示例代码被编写得极少,以演示特定用途,例如访问数据库和将数据从给定表反馈到 UI,而不是作为通用数据库实用程序。对于使用许多数据库查询的应用程序的健壮实现,首选连接池或专用数据库连接管理器类(例如您的问题)。

【讨论】:

  • 答案意义重大,因为您真正准确的答案和 JavaFX 将阅读链接并尝试实施。如果我理解在我执行 CRUD 的每个类上打开一个连接并在我退出应用程序时关闭,我注意到我的实用程序中的 rs.close 不起作用的原因是我没有调用它
  • 不是图书馆的忠实拥护者,但现在会试一试,因为该应用程序仅在我的桌面上运行我将允许连接在上课时保持打开状态,但在转移到另一个SO帖子的第一类我看着那个人说,如果你关闭连接,那么它会关闭记录集和语句如何验证这可能是一个更好的问题但我会在我问起至少我被禁止之前搜索
猜你喜欢
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2010-11-19
相关资源
最近更新 更多