建立与 mysql 数据库的连接(关于优化的问题)
establishing connection to mysql database (question about optimization)
我正在执行一个需要与 mysql 数据库建立连接的程序。我目前正在为每个 class(如注册、登录、显示用户等)独立连接,使用以下行:
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3308/myfirstdb","root");
我想的是为连接实现一个class,每次调用它的默认构造函数。它是否给出任何 advantages/disadvantages 或无关紧要。这是 class:
public class MyConnection {
private Connection con;
public MyConnection() {
//establishing connection
try {
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3308/myfirstdb","root","");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
//for future use
public Connection getCon() {
return con;
}
}
除了极少数例外,整个程序与数据库的单个连接是 "correct" 要做的事情。
连接需要一些费用。您的所有查询都可以使用该连接。
当然,让 "constructor" 执行 "connect"。并让 "destructor" 执行 "disconnect".
class 应该是 "singleton"(或等效)以避免意外获得两个连接。
您的代码有 public MyConnection()
,请求用户创建多个连接。那应该是 private
并且只调用一次,比如这样:
public Connection getCon() {
if (con == NULL) { // or whatever the syntax is
MyConnection(); // Here's the _one_ connection
}
return con;
}
然后用户调用 getCon()
获取一个连接并使用它来执行查询。
注意:如果您的语言支持多线程,请执行以下操作之一:
- 仅从一个线程执行数据库操作,或者
- 每个线程(最多)有一个连接。
PS:我相信这个建议适用于任何 OO 语言。
作为脚注,建立两个连接以试图获得额外的性能可能是徒劳的。或者,至少,不值得付出努力。
另一件需要注意的事情...HTTP 主要是无状态的。所以,如果你有一个网页到 "sign up",它会来来去去——一个与一定数量的 SQL 的连接,然后它就消失了。 "sign in" 的另一个网页将涉及另一个 HTTP 请求、另一个连接等。
之后,用户"signed in"的内存需要保存在某处:
- 在 URL 参数中 -- 受到黑客攻击
- 在 cookie 中 -- 适用于轻量级应用程序
- 其他 -- 如果处理敏感信息(信用卡、医疗保健等)并且需要从一个网页转到另一个网页,您需要安全建议。
这是 Java 中已解决的问题,请勿尝试自己编写。使用由连接池支持的 javax.sql.DataSource
实现(例如 Apache DBCP, HikariCP or c3p0)。
然后您可以从工作单元的数据源获取连接,并在完成后关闭连接。关闭连接将return连接到连接池以供重新使用,从而消除了打开连接的大部分开销。
我正在执行一个需要与 mysql 数据库建立连接的程序。我目前正在为每个 class(如注册、登录、显示用户等)独立连接,使用以下行:
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3308/myfirstdb","root");
我想的是为连接实现一个class,每次调用它的默认构造函数。它是否给出任何 advantages/disadvantages 或无关紧要。这是 class:
public class MyConnection {
private Connection con;
public MyConnection() {
//establishing connection
try {
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3308/myfirstdb","root","");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
//for future use
public Connection getCon() {
return con;
}
}
除了极少数例外,整个程序与数据库的单个连接是 "correct" 要做的事情。
连接需要一些费用。您的所有查询都可以使用该连接。
当然,让 "constructor" 执行 "connect"。并让 "destructor" 执行 "disconnect".
class 应该是 "singleton"(或等效)以避免意外获得两个连接。
您的代码有 public MyConnection()
,请求用户创建多个连接。那应该是 private
并且只调用一次,比如这样:
public Connection getCon() {
if (con == NULL) { // or whatever the syntax is
MyConnection(); // Here's the _one_ connection
}
return con;
}
然后用户调用 getCon()
获取一个连接并使用它来执行查询。
注意:如果您的语言支持多线程,请执行以下操作之一:
- 仅从一个线程执行数据库操作,或者
- 每个线程(最多)有一个连接。
PS:我相信这个建议适用于任何 OO 语言。
作为脚注,建立两个连接以试图获得额外的性能可能是徒劳的。或者,至少,不值得付出努力。
另一件需要注意的事情...HTTP 主要是无状态的。所以,如果你有一个网页到 "sign up",它会来来去去——一个与一定数量的 SQL 的连接,然后它就消失了。 "sign in" 的另一个网页将涉及另一个 HTTP 请求、另一个连接等。
之后,用户"signed in"的内存需要保存在某处:
- 在 URL 参数中 -- 受到黑客攻击
- 在 cookie 中 -- 适用于轻量级应用程序
- 其他 -- 如果处理敏感信息(信用卡、医疗保健等)并且需要从一个网页转到另一个网页,您需要安全建议。
这是 Java 中已解决的问题,请勿尝试自己编写。使用由连接池支持的 javax.sql.DataSource
实现(例如 Apache DBCP, HikariCP or c3p0)。
然后您可以从工作单元的数据源获取连接,并在完成后关闭连接。关闭连接将return连接到连接池以供重新使用,从而消除了打开连接的大部分开销。