改进搜索功能

时间:2013-03-25 04:09:09

标签: java sql performance jsp search

如何改进搜索功能。我写了一些代码来搜索某些东西。搜索花了太多时间。这里的代码片段,

我使用这种方法从数据库中提取数据。

   OracleConnection connection = null;
   OraclePreparedStatement ptmst = null;
   OracleResultSet rs = null;
   OracleCallableStatement cstmt = null;
   StringBuffer strBfr = new StringBuffer();
   ArrayList myList = new ArrayList();
    try
    {     
      connection = (OracleConnection) TransactionScope.getConnection();
      strBfr.append("select distinct .......... ");  
      ptmst = (OraclePreparedStatement)connection.prepareStatement(strBfr.toString());    
      rs = (OracleResultSet)ptmst.executeQuery();           
      while (rs.next()) 
                {               
                HashMap hashItems = new HashMap();
                hashItems.put("first",rs.getString(1));
                hashItems.put("second",rs.getString(2));    
                myList.add(hashItems);
                }       

    }
    catch (Exception e) {
        }
    finally {

            try {
                if (ptmst != null) {
                    ptmst.close();
                }
            } catch (Exception e) {
            }

            try {
                if (connection != null) {
                    TransactionScope.releaseConnection(connection);
                }
            } catch (Exception e) {
            }

        }
        return myList; 

在我的jsp中:

 ArrayList getValues = new ArrayList();     
    getValues = //calling Method here.
    for(int i=0; i < getValues.size();i++)  
    {
    HashMap quoteSrch=(HashMap)allPOV.get(i);                        
    first = (String)quoteSrch.get("first");
    second = (String)quoteSrch.get("second");
    }

查询:

SELECT DISTINCT(mtl.segment1),
  mtl.description ,
  mtl.inventory_item_id ,
  mtl.attribute16
FROM mtl_system_items_b mtl,
  mtl_system_items_tl k
WHERE 1                           =1
AND mtl.organization_id           = ?
AND k.inventory_item_id           = mtl.inventory_item_id
AND NVL(orderable_on_web_flag,'N')= 'Y'
AND NVL(web_status,'UNPUBLISHED') = 'PUBLISHED'
AND mtl.SEGMENT1 LIKE ?  --Here is the search term

3 个答案:

答案 0 :(得分:2)

确保在您的表格中为organization_id,inventory_item_id,尤其是 SEGMENT1 编制索引。

您的查询非常标准,如果不起作用,那么您的数据库服务器响应速度似乎很慢,这可能是由于空间不足,内存不足,磁盘读取速度慢等原因造成的。

然后,您可以请求您的DBA / Server管理员进行检查。

答案 1 :(得分:2)

首先,你需要找出真正的问题

  • 是数据库查询
  • 是网络(应用程序和数据库位于同一台计算机上吗?)

一旦确定它是数据库查询,那么它就变成了一个数据库问题。

  • 这两张桌子怎么样?
  • 使用了哪个索引?
  • 数据如何(多少行等)

在对此进行分析之后,您应该能够以不同的方式发布问题并期待答案。我不是数据库人,但我相信有人能够提供一些指示。

答案 2 :(得分:1)

必须进行调整:

  1. 检查TransactionScope.getConnection();没有任何延迟地提供连接。
  2. 您可以使用

    而不是创建新的HashMap hashItems = new HashMap();
    while (rs.next()){
      myList.add(rs.getString(1) + "delimiter" + rs.getString(2)); 
    }
    
  3. 在jsp中使用

    first = allPOV.get(i).split("delimter")[0];
    second = allPOV.get(i).split("delimter")[1];
    

    这样你就可以减少记忆

    1. 如果可能,请在查询中使用限制,并在 SEGMENT1 link上使用索引。