我用Spring和Hibernate做了一个Java web应用程序,我必须从数据库中获取大量数据,但我有一个问题,因为应用程序太慢,我需要使它更快。我认为更大的问题是我在每个jsp文件中执行的条件的数量,而我不知道如何解决它。我认为这些条件都是必要的,但也许我可以修改代码的某些部分,使其更快。我通过模型中的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的开头打开conconsion并在结尾关闭conconsion,并将所有jsp代码和html放入与数据库的conconsion中,以便仅进行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就足够了?这对页面的速度很重要吗?
有人知道我能做些什么让我的应用程序更快吗?
谢谢!
一个Statement st = conexion.createStatement();
就足够了。不要重复陈述。您可以调用createstatstatement的次数有限。如果您需要一个嵌套查询,创建两个语句,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子句来限制返回到ONE的行数,并限制您需要的字段("select aaa from table WHERE id=1"),然后使用if语句:
if (rs.next()){
aaa = rs.getObject("aaa").toString();
}
对于当前的代码,每次再次执行循环时,aaa都会被一个新值覆盖。它浪费了大量的处理时间,要么什么都不做,要么确保结果完全错误。