1

我正在开发一个仪表板应用程序,我需要连续(每 30 秒)轮询数据库以检查数据库是否启动并运行。为了确定数据库是否正常工作,我正在做一个简单的查询以从表中仅检索 1 行。

一切正常,但问题是 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");         
    }   
4

2 回答 2

4

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

您需要审查您的设计。

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

我相信这些教程会有所帮助:

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

于 2012-04-27T16:23:47.050 回答
2

这不是一个好的做法,每次请求到来时都建立与数据库的连接。您应该创建连接池,它将节省大量连接时间。看看tomcat conntion pool或apache DBCP。

于 2012-04-27T16:22:48.840 回答