JAVA JDBC重用连接

JAVA JDBC重用连接,java,jdbc,Java,Jdbc,我有一个Java程序,其中我正在为select查询执行一些JDBC。建议每次调用testDataBase(),inturns每次调用DBConnection(),还是应该为所有查询重用一个连接。提前谢谢 private void testDataBase(String query){ Connection con = DBConnection(); Statement st = null; ResultSet rs = null; try {

我有一个Java程序,其中我正在为select查询执行一些JDBC。建议每次调用testDataBase(),inturns每次调用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;
}
private void测试数据库(字符串查询){
Connection con=DBConnection();
语句st=null;
结果集rs=null;
试一试{
st=con.createStatement();
rs=st.executeQuery(查询);
布尔标志=真;
while(rs.next()){
字符串resultString=“”;

对于(int i=1;i打开数据库连接在性能上是一项昂贵的操作。您应该使用ConnectionPool在不同请求之间共享连接。

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

获取数据库连接是一项非常昂贵的操作,因此,建议在可能的情况下重新使用连接。还考虑使用连接池,这将为您维护多个连接,因此您可以在需要时从池中抓取一个连接。上面所示的方法可能不需要更改,这取决于dBnCut连接()。方法。

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

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


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

< P>如果你只想要一个连接实例,你可以使用单模式,你可以考虑:

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;
}
}


然后,您可以调用:
Connector.getInstance().getConnection()

对于与一个场景相关的查询,您应该使用一个连接。例如,创建一个新用户。然后打开连接,(1)检查新用户ID是否已存在,然后(2)插入到user_表中。两个查询都应该使用单个连接完成。是的,您可以重复使用相同的连接connection@DanielRobertus连接池呢?我们可能需要多个连接对象。@AmitG我认为需要证明连接造成了瓶颈。如果一个连接就足够了,我认为不需要创建多个连接。只要我的两美分。它在性能方面没有任何改变。在您的示例中,您仍然每次调用DriverManager.getConnection方法。这是真的,但是Singleton模式将在每次使用getConnection()方法时返回相同的连接对象,因为它存储在连接器对象中。