我使用Spring和Hibernate创建了一个Java Webapp,我必须从数据库中获取大量数据,但是我遇到了问题,因为应用程序太慢了,我需要加快速度。我认为更高的问题是我在每个jsp文件中执行的conosions数量,而且我不知道如何解决它。我认为这些内容都是必要的,但也许我可以修改代码的某些部分以使其更快。我在模型中通过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中做了很多次,甚至在biggers jsp中做了10-15次。 我可以在jsp的开头打开conexion并在最后关闭conexion并将所有jsp代码和html放在conexion中与数据库进行只进行一次连接吗?
还有另一个疑问,在同样的情况下,如果我要做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,它是必要的吗?或者,如果我在第一个查询中创建Statement就足够了?这对页面的速度很重要吗?
有人知道我该怎么做才能让我的应用更快?
谢谢!
答案 0 :(得分:1)
一个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){}
}
%>
此外,不是做“select * from table”,而是执行以下操作:
while (rs.next()){
aaa = rs.getObject("aaa").toString();
}
在SQL中使用WHERE CLAUSE来限制返回到ONE的行数,并将您提取的字段限制为所需的字段(“从表WHERE id = 1中选择aaa”)然后使用if语句:
if (rs.next()){
aaa = rs.getObject("aaa").toString();
}
使用您现有的代码,每次再次循环时,aaa都会被新值覆盖。它浪费了大量的处理时间,无论是什么都不做,或者确保结果是完全错误的。