JAVA JDBC重用连接
我有一个Java程序,其中我正在为select查询执行一些JDBC。建议每次调用testDataBase(),inturns每次调用DBConnection(),还是应该为所有查询重用一个连接。提前谢谢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 {
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()方法时返回相同的连接对象,因为它存储在连接器对象中。