OracleDataSource vs. Oracle UCP PoolDataSource

后端 未结 8 1871
无人共我
无人共我 2020-12-02 10:24

I was researching some JDBC Oracle Connection Pooling items and came across a new(er) Oracle Pool implementation called Universal Connection Pool (UCP). Now this uses a new

8条回答
  •  情歌与酒
    2020-12-02 10:29

    I tried ucp and the performance is better... May be the key is using this

    oracle.ucp.jdbc.PoolDataSource ds = (oracle.ucp.jdbc.PoolDataSource)envContext.lookup(url_r);
    MyConnectionLabelingCallback callback = new MyConnectionLabelingCallback();
    ds.registerConnectionLabelingCallback( callback );
    
    
    Properties label = new Properties();
    label.setProperty(pname, KEY);
    conn = ds.getConnection(label);
    

    This helps to borrow the connection and never closing it.. so the performance is great

    The code for the callback class is

    public class MyConnectionLabelingCallback
    implements ConnectionLabelingCallback {
    
          public MyConnectionLabelingCallback()
          {
          }
    
          public int cost(Properties reqLabels, Properties currentLabels)
          {
    
            // Case 1: exact match
            if (reqLabels.equals(currentLabels))
            {
              System.out.println("## Exact match found!! ##");
              return 0;
            }
    
            // Case 2: some labels match with no unmatched labels
            String iso1 = (String) reqLabels.get("TRANSACTION_ISOLATION");
            String iso2 = (String) currentLabels.get("TRANSACTION_ISOLATION");
            boolean match =
              (iso1 != null && iso2 != null && iso1.equalsIgnoreCase(iso2));
            Set rKeys = reqLabels.keySet();
            Set cKeys = currentLabels.keySet();
            if (match && rKeys.containsAll(cKeys))
            {
              System.out.println("## Partial match found!! ##");
              return 10;
            }
    
            // No label matches to application's preference.
            // Do not choose this connection.
            System.out.println("## No match found!! ##");
            return Integer.MAX_VALUE;
          }
    
          public boolean configure(Properties reqLabels, Object conn)
          {
    
              System.out.println("Configure################");
            try
            {
              String isoStr = (String) reqLabels.get("TRANSACTION_ISOLATION");
              ((Connection)conn).setTransactionIsolation(Integer.valueOf(isoStr));
              LabelableConnection lconn = (LabelableConnection) conn;
    
              // Find the unmatched labels on this connection
              Properties unmatchedLabels =
               lconn.getUnmatchedConnectionLabels(reqLabels);
    
              // Apply each label  in unmatchedLabels to conn
              for (Map.Entry label : unmatchedLabels.entrySet())
              {
                String key = (String) label.getKey();
                String value = (String) label.getValue();
                lconn.applyConnectionLabel(key, value);
              }
            }
            catch (Exception exc)
            {
    
              return false;
            }
            return true;
          }
        }
    

提交回复
热议问题