我正在开发一个仪表板应用程序,我需要连续轮询数据库(每30秒)以检查数据库是否已启动并运行。为了找出数据库是否正常工作,我正在进行一个简单的查询,从表中只检索一行。
一切正常,但问题是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");
}
答案 0 :(得分:4)
你是从doGet函数连接到数据库,这是非常糟糕的做法。如果对servlet有100,1000,10000个请求,会发生什么?
您需要检查您的设计。
请为您的Oracle数据源创建连接池,将其放入Servlet ApplicationContext,创建Dao类并从doGet Servlet调用您的Dao类。
我相信这些教程会有所帮助:
http://balusc.blogspot.com/2008/07/dao-tutorial-data-layer.html
答案 1 :(得分:2)
这不是一个好的做法,每次请求时都会建立与DB的连接。你应该创建连接池,它将节省很多连接时间。看看tomcat conntion pool或apache DBCP。