gpt4 book ai didi

mysql - jsp大量数据库连接

转载 作者:行者123 更新时间:2023-11-29 13:06:49 24 4
gpt4 key购买 nike

我用 Spring 和 Hibernate 制作了一个 Java Web 应用程序,我必须从数据库中获取大量数据,但我有一个问题,因为该应用程序太慢了,我需要让它更快。我认为更高的问题是我在每个jsp文件中执行的conexion数量,我不知道如何解决它。我认为这些联系都是必要的,但也许我可以修改代码的某些部分以使其更快。我通过模型中的 Hibernate 和 Spring 将数据传递到 jsp,但随后在 jsp 中我必须与数据库建立连接以获取另一个类中的更多信息。例如,我有一些球员,在球员中我有他们球队的ID,所以我必须在jsp中连接以获取球队的名称,因为我只知道ID。我向您展示如何将应用程序与数据库连接:

try {
Class.forName("org.gjt.mm.mysql.Driver");
Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "user", "pwd");
if (!conexion.isClosed()) {
// La consulta
Statement st = conexion.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM entity");

while (rs.next()){
aaa = rs.getObject("aaa").toString();
}

// cierre de la conexion
conexion.close();
}
else
// Error en la conexion
out.println("fallo");
}
catch (Exception e) {
// Error en algun momento.
out.println("Excepcion "+e);
e.printStackTrace();
}

我在同一个 jsp 中多次执行相同的操作,甚至在较大的 jsp 中执行 10-15 次。我可以在jsp的开头打开conexion并在最后关闭conexion并将所有jsp代码和html放入与数据库的conexion中以仅建立1个连接吗?

还有一个疑问,同样,如果我必须执行 2 个查询,我会这样做:

        Statement st = conexion.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM entity");

while (rs.next()){
aaa = rs.getObject("aaa").toString();
}

st = conexion.createStatement();
rs = st.executeQuery("select * from entity2");

while (rs.next()){
bbb = rs.getObject("bbb").toString();
}

那么,我为查询创建一个新的语句,有必要吗?或者如果我在第一个查询中创建语句就足够了?这对页面速度很重要吗?

有人知道我可以做些什么来让我的应用程序更快吗?

谢谢!

最佳答案

一个 Statement st = conexion.createStatement(); 就足够了。不要继续重复该声明。您调用 createStatement 的次数有限。如果您需要嵌套查询,请创建两个语句:st 和 st2,但不要继续为同一变量调用 createStatement。

此外,如果您要在 scriptlet 中使用连接,您至少应该创建一个类来放置实际的连接部分,即 Class.forName("org.gjt.mm.mysql.Driver ”); Connection conexion = DriverManager.getConnection(....); 然后在 JSP 中调用它。这样,您就不会在每个 JSP 中都有困惑的连接代码,并且当您必须更改服务器 IP 或用户名或其他内容时,您不必更改大量 JSP。

并且不要在一个 JSP 中打开连接 10 次。您甚至不想在 Servlet 中执行此操作。您需要创建一个 Connection 类型的成员变量,将其打开,并保持打开状态直至结束。

如果您要使用 scriptlet,您的代码至少应该是这样干净的:

<%
//call a static method in a class you create to get the connection
Connection connection = Appname.dbclass.getConnection();
if(connection==null)
{
out.print("error connecting");
return;
}
Statement st = connection.createStatement();
ResultSet rs = null;
...
//do all your stuff
...
if(rs!=null)
{
try
{
rs.close();
}
catch(Exception ex){}
}
if(st!=null)
{
try
{
st.close();
}
catch(Exception ex){}
}
if(connection!=null)
{
try
{
connection.close();
}
catch(Exception ex){}
}
%>

此外,不要执行“从表中选择 *”,然后执行以下操作:

while (rs.next()){
aaa = rs.getObject("aaa").toString();
}

在 SQL 中使用 WHERE 子句将返回的行数限制为 ONE,并将提取的字段限制为所需的字段(“从表 WHERE id=1 中选择 aaa”),然后使用 if 语句:

  if (rs.next()){
aaa = rs.getObject("aaa").toString();
}

使用您当前的代码,每次再次执行循环时,aaa 都会被新值覆盖。它浪费了大量的处理时间,要么什么也不做,要么确保结果完全错误。

关于mysql - jsp大量数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22585733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com