我用Spring和Hibernate制作了一个Java need应用程序,我必须从数据库中获取大量数据,但是我有一个问题,因为应用程序太慢了,我需要使它更快。我认为更高的问题是我在每个jsp文件中所做的conexions的数量,而我不知道如何解决它。我认为所有这些都是必要的,但也许我可以修改代码的某些部分,使其更快。我通过模型中的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中,并与数据库建立一个连接?
另一个疑问是,在同样的情况下,如果我要做两个查询,我就喜欢这样:
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();
}所以,我为查询创建了一个新语句,这是蜜源语句吗?或者,如果我在第一个查询中创建语句,是否就足够了?这在页面的速度上很重要吗?
有人知道我能做些什么让我的应用更快吗?
谢谢!
发布于 2014-03-25 21:33:37
一个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表“,后面跟着类似的操作:
while (rs.next()){
aaa = rs.getObject("aaa").toString();
}在SQL中使用WHERE子句将返回的行数限制为1,还将您拉出的字段限制为所需的字段(“从id=1表中选择aaa”),然后是if-语句:
if (rs.next()){
aaa = rs.getObject("aaa").toString();
}对于当前的代码,每次您再次遍历循环时,aaa都会被一个新的值覆盖。它浪费了大量的处理时间,要么无所事事,要么确保结果是完全错误的。
https://stackoverflow.com/questions/22585733
复制相似问题