18

我有一个 Java 程序,我在其中为选择查询做一些 JDBC。是否建议每次调用 testDataBase() 从而每次调用 DBConnection() 或者我应该为所有查询重用一个连接。提前致谢。

private  void testDataBase(String query){
    Connection con = DBConnection();
    Statement st = null;
    ResultSet rs = null;

    try {
        st = con.createStatement();
        rs = st.executeQuery(query);
        boolean flag = true;
        while (rs.next()) {
            String resultString = "";
            for(int i = 1; i <=rs.getMetaData().getColumnCount();i++){
                resultString=resultString+" "+  rs.getString(i);
            }
            System.out.println(resultString);
        }
    } catch (SQLException e) {
        e.printStackTrace();

    } finally {
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}               



private  Connection DBConnection() {
    final String method_name =  "DBConnection";
    Connection conn = null;
    try{
      Class.forName(driver).newInstance();
      conn = java.sql.DriverManager.getConnection(url,userName,password);

    }catch (ClassNotFoundException e) {
        System.out.println(e.getMessage());
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    return conn;
}
4

6 回答 6

13

就性能而言,打开数据库连接是一项昂贵的操作。您应该使用 ConnectionPool 在不同请求之间共享连接。

于 2013-03-13T10:42:53.507 回答
6

连接不是线程安全的,因此跨请求共享它们不是一个好主意。

一个更好的想法是将连接池化并使其范围尽可能窄:检查池外的连接,使用它,然后在事务范围内关闭它。

于 2013-03-13T11:13:35.873 回答
5

数据库连接是长时间运行的,应该重复使用,除非您的查询率非常低。

于 2013-03-13T10:42:55.353 回答
5

获取数据库连接是一项相当昂贵的操作,因此建议尽可能重用连接。还可以考虑使用连接池,它将为您维护许多连接,因此您可以在需要时从池中获取一个。上面显示的方法可能不需要更改,它取决于您调用的 DBConnection() 方法。

于 2013-03-13T10:44:07.027 回答
1

我完全同意@Amir Kost 的观点,在性能方面,以您可以做的最慢的操作之一打开数据库连接,如果您有限制性的实时限制,这可能是一个大问题。我不知道你是否使用框架,但一个好的做法是发布一个包装连接池的 bean,每次你需要直接与数据库交互时,你都会获得当前打开的连接(通常对应于所谓的“会话”)。我建议你(即使你没有使用任何框架)来重现这种技术性。

于 2013-03-13T11:12:00.127 回答
-1

If you want only one instance of Connection, you can make use of the Singleton pattern, you can consider :

public class Connector {

private static final String URL = "jdbc:mysql://localhost/";
private static final String LOGIN = "root";
private static final String PASSWORD = "azerty";
private static final String DBNAME = "videotheque";
private static Connector connector;
private static Connection connection;

private Connector() {
}

public synchronized static Connector getInstance() {
    if (connector == null) {
        connector = new Connector();
    }
    return connector;
}

public static Connection getConnection() {
    if (connection == null) {
        Connection c = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            c = DriverManager.getConnection(URL + DBNAME, LOGIN, PASSWORD);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return c;
    }
    return connection;
}

}

And then, you can call : Connector.getInstance().getConnection()

于 2013-03-13T11:17:42.120 回答