2012-04-27 120 views
1

我正在开发一个仪表板应用程序,我需要持续轮询数据库(每30秒)检查数据库是否启动并运行。为了找出数据库是否工作,我正在做一个简单的查询来从表中检索一行。从Servlet连接到Oracle数据库需要很长时间

一切工作正常,但问题是servlet需要很长时间才能建立到数据库的连接并检索一行。这个过程需要将近15秒。我将相同的代码复制到一个java文件中,以确定它是否仍然需要那么多时间。但是,正如我怀疑的那样,java程序运行只需要1或2秒。看来我接近这件事情的方式出了问题。

我在doGet()函数中编写了数据库连接代码,因为我需要反复轮询数据库。这是我犯的错误吗?我应该在init()中编写数据库连接代码并在doGet()函数中写入查询吗?

任何帮助将不胜感激。由于

下面是部分代码,可以帮助你理解我的问题:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
//Send Request to DB CAT 
LinkedHashMap<String,String> hm=new LinkedHashMap<String,String>(); 
    try 
    { 
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 
    //CONNECT TO DB 
    String serverName = "*****.1dc.com"; // * is just to hide the real database name 
    int port = 1535; 
    String user = "mbank"; 
    String password = "****"; 
    String SID = "mbkwqa"; 
    String URL = "jdbc:oracle:thin:@" + serverName + ":" + port + ":" + SID; 
    Connection conndb = DriverManager.getConnection(URL, user, password); 
    String SQL = "select CITY from ADDRESS where rownum<=1"; 
    Statement stat = conndb.createStatement(); 
    ResultSet rs = stat.executeQuery(SQL); 
    while (rs.next()) 
    { 
     System.out.println(rs.getString(1)); 
    } 
    stat.close(); 
    conndb.close(); 
    hm.put("Server1","OK"); 
    } 
     catch(Exception e) 
    { 
     hm.put("Server1","Failed");   
    } 
+2

Downvoter,一定要留下的向下投票的原因。否则,你的反对票不会以任何方式帮助任何人。 – CuriousCoder 2012-04-27 18:15:12

回答

4

您从doGet函数连接到数据库,这是非常糟糕的做法。如果你有100,1000,10000个请求到你的servlet会发生什么?

您需要检查您的设计。

请为您的Oracle数据源创建连接池,将其放入Servlet ApplicationContext中,创建Dao类并从doGet Servlet中调用您的Dao类。

我相信这些教程将帮助:

http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html

2

,这不是一个很好的做法建立的要求来每次数据库的连接。你应该创建连接池,这将节省很多连接时间。看看tomcat conntion池或apache DBCP。

相关问题