【问题标题】:Improve the search functionality改进搜索功能
【发布时间】:2013-03-14 12:02:15
【问题描述】:

如何改进搜索功能。?我写了一些代码来搜索一些东西。搜索花费了太多时间。还有这里的代码sn-ps,

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

   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

【问题讨论】:

  • 您可以做的一件事是在数据库中使用存储过程,这样它就可以优化和存储执行它的最佳方式,而无需每次都重新计算。
  • @Patashu,这也是准备好的语句的作用。是需要很长时间的查询吗?如果是这样,发布代码将无济于事,您需要查看是否可以优化查询,例如检查缺失的索引等。
  • 验证TransactionScope.getConnection(); 没有在每次调用时都创建连接,因为它会降低方法的性能。如果它正在重用连接/池,则发布 SQL,以便您提出重构/改进它的建议
  • 我认为查询需要优化。因为获取结果需要时间。我已经用查询编辑了问题。

标签: java sql performance jsp search


【解决方案1】:

确保 organization_id 、inventory_item_id 尤其是 SEGMENT1 在您的表中编入索引。

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

然后您可以要求您的 DBA/服务器管理员进行检查。

【讨论】:

    【解决方案2】:

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

    • 是数据库查询吗
    • 是网络吗(App 和 DB 是否位于同一台机器上?)

    一旦您确定它是数据库查询,那么它就更像是一个数据库问题。

    • 这两张表长什么样子?
    • 使用了任何索引?
    • 数据看起来如何(多少行等)

    分析完之后,您应该能够以不同的方式发布问题并期待答案。我不是数据库专家,但我相信有人可以提供一些指点。

    【讨论】:

      【解决方案3】:

      必须进行调整:

      1. 检查TransactionScope.getConnection(); 是否提供连接,没有任何延迟。
      2. 您可以使用而不是创建新的HashMap hashItems = new HashMap();

        while (rs.next()){
          myList.add(rs.getString(1) + "delimiter" + rs.getString(2)); 
        }
        

      在jsp中使用

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

      这样您就可以减少内存

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

      【讨论】:

        猜你喜欢
        • 2019-08-04
        • 2014-09-10
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多