WCCP performance overhead

Hi All
We have implemented WCCP-GRE from some of our remote wan routers to proxies in  the Data Center. We’ve followed best practice guidelines, bug scrubs, TAC review etc – so nothing stands out from a configuration standpoint. However, I have not had much luck in getting insight into the following and so posting here
I’d think there would be ‘some inherent’ processing/overhead/delay from an end user perspective when the traffic is redirected using WCCP-GRE vs explicit proxy. Basic laws on encap/decap etc would cause that delay. However, is there any reference published on what that delay percentage is. For instance, is WCCP about 2 times (or n times) slower than explicit proxy configuration on browser ?
Our users have been gauging performance based on speedtest.net and reporting 10x times performance degradation numbers using WCCP. But, speedtest is not a true representation of actual user experience. However, am not able to quantify what is a typical % when using WCCP vs explicit.
Thanks much

Hi,
First of all : I don't think that you would ever find such a "slowness" factor, as it depends upon many things.
Basically there are several thing that can slow down your traffic :
1) WCCP can (inaccidentally) be handled in software on some platforms - this will slow down the router
2) You're adding both a GRE header and a WCCP header - beware of fragmentation
But to be honest - I've never seen such a setup, that you're describing :
You're redirecting WEB traffic across the WAN (truly I don't know the WAN delay), but normally you would place proxies close to the user and not in the datacenter, where you internet connection probably is terminated.
Consider what would happen if the proxy cannot handle the request (not necessarily a cache miss) - the packet would be returned to the originating router (across the WAN again for normal forwarding by the originating router), so you'll end up with traversing the WAN 4 times instead of two
And since many WEB pages consists of many elements (objects) delaying some of them might influence the entire response time.
Don't know whether this helps you, but I would place the WCCP in the Datacenter, close to the proxy.
Best regards
Finn Poulseb

Similar Messages

  • Insert, search, delete performance overhead for different collections

    Hi,
    I am trying to create a table which compares performance overheads for different collections data structures. Does anyone want to help me out? I want to put a number from 1 - 9 in each of the question marks. 1 being very poor performance and 9 being very good performance (the reason I am doing this is that I had this question in a job interview test and I didn't pass it)
    anyone have any comments?
              Searching     Inserting     Deleting     
    ArrayList ? ? ?
    LinkedList ? ? ?
    TreeSet ? ? ?
    TreeMap ? ? ?
    HashMap ? ? ?
    HashSet ? ? ?
    Stack ? ? ?

    sorry the formatting has screwed up a bit when I posted it. It should have a list of the collection types and three columns (inserting, deleting, searching)

  • Performance overhead

    Hi,
    I have a quick question.
    There is part in the project where we need to update information in SAP which we gather from the user. I am getting a series of name from user and updating it. For that I am using insert statement. If user tries modify those series of name, I do delete first and insert again.
    I am not sure whether it is a good way. Also my concern is whether there will be performance overhead for SAP through my way?
    thanks.
    - deepan

    Deepan,
    Your method is fine.  No performance issue to be concerned about.
    You could also just use the MODIFY verb.
    It handles INSERT-ing and UPDATE-ing all in one statement.
    By that - I mean:
    If "Jake" does not exist in the table, it will be INSERT automatically.
    If "Jake" does exist in the table and you changing something about Jake's info, it will be UPDATEd automatically.
    All by using the MODIFY verb.

  • Any performance overhead if we get iterator over values stored in map

    Hi Everybody,
    Is there any performance overhead if we get iterator over values stored in map. like this
    Iterator itr = rolesMap.values().iterator();
    if yes please explain...thanks in advance.

    ejp wrote:
    That's rather out of date. It is how Hashtable works, but as regards HashMap it isn't. The keySet() iterator and the values() iterator are both written in terms of the entrySet() iterator. There is no skipping over unused slots.Out of date? In that case there's been a recent advance in hashed data structures I've missed.
    Or the HashMap implementation has been recently changed to internally link entries to improve iteration performance. I doubt that because such a list would degrade the performance of the HashMap in other ways and that's unacceptable (and unnecessary because of LinkedHashMap).
    Besides, what I said is in the Java 6 API documentation to LinkedHashMap. It may be out of date but I doubt it.
    So here we are with a fact of nature: Any iteration of a hash based data structure will be proportional to capacity rather than the number of entries, unless a supportive list style data structure is introduced to overcome this.

  • TXDataSource performance overhead ?

    Hi,
    I want to know if it is okay to use TXDataSource for non transactional purposes,
    like for simple queries etc...
    Do I need to have two Data sources, A normal DataSource for non transactional purpose
    and a TXDataSource for transactional purposes.
    Is there any performance overhead because of using TXDataSource ?
    Thanks,
    Sudhir

    Sudhir Babu wrote:
    Hi,
    I want to know if it is okay to use TXDataSource for non transactional purposes,
    like for simple queries etc...
    Do I need to have two Data sources, A normal DataSource for non transactional purpose
    and a TXDataSource for transactional purposes.
    Is there any performance overhead because of using TXDataSource ?
    Thanks,
    SudhirHi. Feel free to use a TxDataSource. There is no appreciable overhead. In fact, the TxDataSource
    will detect whether it's in an ongoing transaction, and if not, it immediately goes to the pool
    driver for the connection to return, just like a plain data source, so after you get the connection,
    the performance/behavior is identical (in the non-transactional condition).
    Joe

  • SQL Server 2012 & sp_describe_first_result_set performance overhead?

    Hi All,
    I'm just wondering if anyone has had the same experience as me when testing queries between SQL Server 2008 R2 SP2 (our DEV Server) and SQL Server 2012 SP1 (our soon to be PROD server).
    We have a query the Spatial Services department run on their DEV server which executes (at an average) of 300ms.
    On the (to be) PROD server (the 2012 SP1 box) the same query also runs at an average of 300ms. The query plans and the clients stats are almost identical. Happy with that. All good.
    The problem that we are seeing is that the PROD server (2012) runs this darned
    sp_describe_first_result_set procedure prior to executing the actual query itself and the execution of sp_describe_first_result_set takes (on average) 3200ms (returning 27 rows). This is a consistent number. So on
    our DEV server the testing of the app takes around 300ms and returns results almost instantly yet testing the same app and same query on SQL 2012 takes around 3.5 seconds.
    Seriously?
    This obviously is not acceptable, especially in an environment that requires highly performant code.
    My questions are:
    Is this normal?
    Has anyone else experienced this overhead?
    Can it be avoided/turned off?
    Any information would be greatly appreciated :)
    Regards,
    Glenn

    Hi Erland,
    Thanks for coming back to me with something to try out.
    When you say "takes a long time to get through" I am guessing that you mean a long time for the engine to look at the query, interrogate it and send back the "metadata" about that particular query? 
    Unfortunately these queries are generated by the client application which construct and throw dynamic SQL at SQL Server for execution.
    On digging further the query generated actually pulls data from a view. This view is constructed to pull data together from 2 remote Servers (1 SQL Server and 1 Sybase server). Executing the view (i.e. selecting the actual query that makes up the view and pressing
    F5) returns data from these two servers almost instantaneously on both the DEV and PROD servers because the view being called on both DEV and PROD servers are actually pointing to the same remote servers (so the data is exactly the same).
    As object metadata information is stored locally to each user database I would assume (and of course I may be wrong) that this information would be obtained from the underlying syscolumns view and therefore should be rather quick (i.e. instantaneous?)
    I'm have no idea about the underlying mechanics of how this new SP sp_describe_first_result_set works so am not sure. It is instantaneous when querying information about local tables (and views that use local tables) but as soon as it queries
    views that rely on remote table data the performance goes out the window. Surely its not using (trying to get) remote metadata information?????
    Thanks for your time.
    Glenn
    SQL Server, its a gas!

  • Link aggregation - performance overhead?

    Does anybody know if Solaris link aggregation incurs any performance degredation compared with non-redundant network connections?
    We've recently upgraded a client system and have enabled link aggregation to bind two interfaces (bge) to a logical aggregated interface.
    Apart from the server hardware upgrade, which brought a change from ce to bge interfaces, this is the only other significant network change.
    On this heavily used system, database network performance has degraded significantly, and being the only significant network change I'm wondering whether link aggregation could be a cause.
    Reading through Sunsolve articles and man pages, there doesn't appear to be anything categorically stating aggregation imposes a cost overhead.
    However, I'd be interested to hear from others if they've experienced this.
    For what it's worth, this is Solaris 10 10/09 on an Ultrasparc VII.

    So many considerations when you talk about performance: what system hardware in use? how many interfaces? is this a CoolThreads "T" server (where single threaded programs don't run as well as multi-threaded); what do you mean by "database network performance has degraded"; does the DB need to be tuned or adjusted for this? If using add-on cards, are they in the most optimal slot (some platforms) and don't go over the recommended # of interface boards supported by the system? different storage array or config for you DB?
    when cases like these come in, there typically is a discussion that needs to take place around those questions as well as what/when/where and expectations like those described here: http://blogs.sun.com/hippy/entry/what_s_the_answer_to
    also understand that link aggregation does not necessarily mean that you will see a balancing of the load evenly b/t 2 or more aggregated interfaces. The default policy is "L4" which decides the outbound interface by TCP and UDP info if found in the packet, not by simple source/destination or mac address hashing, although you can set those with -P if you want. You can also set multiple policies. (-P L2,L3).
    So it /could/ be related to the aggregation change you made, but you also upgraded this DB machine from some other system, so there ARE other differences. Were you using link aggregation on the previous system or Sun Trunking? What type of CPU was that other system?
    that's all I can think of, but hopefully you get the idea.

  • Wccp performance on ISR G2 routers

    Hi all,
    do you have any information about the CPU load on the ISR G2 routers, when the wccp is configured on these platforms? I have to decide between the inline mode and WCCP mode, but I don't know how much the wccp influents the router's performance.
    Thank you
    Roman

    Hi Roman,
    I don't have the exact performance numbers (you should probably contact your account team for that) but I can confirm that the impact will be quite high. This because of the following reasons:
    On the ISR, the WCCP redirection (including the GRE encapsulation) is done in software. CEF is used to minimize the impact, but, if the amount of redirected traffic is high, the impact will be noticeable.
    When using WCCP, the redirected traffic will go through the device twice, so, if all the traffic is redirected, the load on the router will almost double.
    Even though using WCCP will have some impact on the load in the ISR, these devices are designed to handle the load of a small branch, so, if you don't have too much traffic to be redirected, it should be fine to use WCCP, but as I said, better talk to your account team to get a proper sizing done.
    Daniel

  • Performance overhead of using JRockit management console

    Hi,
    I wanted to know what is the overhead of using jrockit management console? We have enabled the management server in our production environment and started the actual console on different windows box.
    Is it ok to have the console running in production environment? what kind of performance impact this will have?
    I read through BEA docs and it says the performance impact will be negligible, but wanted to check any experience in community.
    Thanks,
    - Pritam.

    Hi Pritam,
    I don't remember what the console overhead is, but it is in the order of "low single digit % or less".
    We have measured standard JRA recording overhead to 0.5% on SPECjAppServer scores, with optional lock profiling enabled that grows to ~3.5%.
    Connecting the Memory Leak Detector increases GC pause times by maybe 10% but has no other impact on throughput.
    -- Henrik

  • Performance overhead of calling Thread.currentThread().getStackTrace()

    All I can see is it is calling native function
    private static native StackTraceElement[][] dumpThreads(Thread athread[]);
    Just wonder if I call this method for every transaction, will this causing performance issue? Is this method considered slow to execute?

    How about compare with String concat?
    We now having our own transaction framework, at the end of the transaction the module call transaction.start() must call either commit() / close() . If that module doesn't do that, next module cannot start() another transaction. I understand this is not a good design, but this is what this is and I am not the module owner so I can say nothing about that.
    However, I would still like to have some checking to see if any the transaction starter forget to commit / close the transaction. I just thought of in method start() I save a copy of stacktrace() element. If the transaction cannot start then I show the printStack() of last saved copy so that I know which module have that problem.
    How do you think about that?

  • Query Performance issue in Oracle Forms

    Hi All,
    I am using oracle 9i DB and forms 6i.
    In query form ,qry took long time to load the data into form.
    There are two tables used here.
    1 table(A) contains 5 crore records another table(B) has 2 crore records.
    The recods fetching range 1-500 records.
    Table (A) has no index on main columns,after created the index on main columns in table A ,the query is fetched the data quickly.
    But DBA team dont want to create index on table A.Because of table space problem.
    If create the index on main table (A) ,then performance overhead in production.
    Concurrent user capacity is 1500.
    Is there any alternative methods to handle this problem.
    Regards,
    RS

    1) What is a crore? Wikipedia seems to indicate that it's either 10,000,000 or 500,000
    http://en.wikipedia.org/wiki/Crore
    I'll assume that we're talking about tables with 50 million and 20 million rows, respectively.
    2) Large tables with no indexes are definitely going to be slow. If you don't have the disk space to create an appropriate index, surely the right answer is to throw a bit of disk into the system.
    3) I don't understand the comment "If create the index on main table (A) ,then performance overhead in production." That seems to contradict the comment you made earlier that the query performs well when you add the index. Are you talking about some other performance overhead?
    Justin

  • Need suggestion on Performance tuning

    Hi,
    We have a container with the single document which is of size 3 MB around. This document contains some master data, it will be used across the application.
    we have implemented transactions for the whole application recently,so that we could avoid the db locks now. But, it resulted in some performance overhead especially for this single document container.
    For example, we have a scenario to display all the records from the document on the screen at a time. That time it is taking too much time when compared to earlier to the transactions implementations.And we will be using (read operation) this container data very freequently (most of the pages) as it is master data.
    Please let me know, is there any approach/solution for the above case particularly to boost the performance on the container?
    Thanks,
    Balakrishna.

    Thank you for the response.
    Here 'display all records' mean read operation on the document. We perform read operations very frequently.
    We do have write operations to update the document in between read operations.
    Also the index has been done for frequently used nodes in the document.
    Hope the above information gives you more details. Please let me know if you need any information.
    Thanks,
    Balakrishna.

  • Group degradation in perceived performance

    Hi there,
    We recently upgraded to SDK 4.5.1 and noticed that our application took a hit in perceived responsiveness in the process. After digging around a bit I ran into a change in the Group class that is responsible for this degradation, the change itself is in bold:
        override public function set scrollRect(value:Rectangle):void    {        // Work-around for Flash Player bug: if GraphicElements share        // the Group's Display Object and cacheAsBitmap is true, the        // scrollRect won't function correctly.         var previous:Boolean = canShareDisplayObject;        super.scrollRect = value;         if (numGraphicElements > 0 && previous != canShareDisplayObject)            invalidateDisplayObjectOrdering();          if (mouseEnabledWhereTransparent && hasMouseListeners)        {                    // Re-render our mouse event fill if necessary.            redrawRequested = true;            super.$invalidateDisplayList();        }    }
    Below please find a small application that illustrates this problem. Note that I have monkey patched Group in the default package so that it is possible to compile with and without the code above. I find that a large screen and Chrome help showcase the problem.
    The part that I am not getting is what was the code in bold trying to fix in the first place?
    Thanks!!
    ~ Miguel
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application
        minWidth="955" minHeight="600"
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx"
        xmlns:local="*">
        <fx:Script>
            <![CDATA[
                private var _moveMode:Boolean = false;
                protected function monkeypatchedgroup1_mouseMoveHandler(event:MouseEvent):void
                    // TODO Auto-generated method stub
                    if (_moveMode)
                        redBox.x = event.stageX;
                        redBox.y = event.stageY;
                protected function bordercontainer1_mouseDownHandler(event:MouseEvent):void
                    // TODO Auto-generated method stub
                    _moveMode = true;
                protected function monkeypatchedgroup1_mouseUpHandler(event:MouseEvent):void
                    // TODO Auto-generated method stub
                    _moveMode = false;
            ]]>
        </fx:Script>
        <fx:Declarations>
            <!-- Place non-visual elements (e.g., services, value objects) here -->
        </fx:Declarations>
        <local:MonkeyPatchedGroup
            width="100%" height="100%"
            mouseMove="monkeypatchedgroup1_mouseMoveHandler(event)"
            mouseUp="monkeypatchedgroup1_mouseUpHandler(event)">
            <s:BorderContainer id="redBox"
                width="50" height="50"
                backgroundColor="red"
                mouseDown="bordercontainer1_mouseDownHandler(event)"/>
        </local:MonkeyPatchedGroup>
    </s:Application>
    Here is the monkey patched group:
    //  ADOBE SYSTEMS INCORPORATED
    //  Copyright 2008 Adobe Systems Incorporated
    //  All Rights Reserved.
    //  NOTICE: Adobe permits you to use, modify, and distribute this file
    //  in accordance with the terms of the license agreement accompanying it.
    package
        import flash.display.BlendMode;
        import flash.display.DisplayObject;
        import flash.geom.Rectangle;
        import mx.core.FlexVersion;
        import mx.core.IFlexModule;
        import mx.core.IFontContextComponent;
        import mx.core.IUIComponent;
        import mx.core.IUITextField;
        import mx.core.IVisualElement;
        import mx.core.IVisualElementContainer;
        import mx.core.UIComponent;
        import mx.core.mx_internal;
        import mx.events.FlexEvent;
        import mx.graphics.shaderClasses.ColorBurnShader;
        import mx.graphics.shaderClasses.ColorDodgeShader;
        import mx.graphics.shaderClasses.ColorShader;
        import mx.graphics.shaderClasses.ExclusionShader;
        import mx.graphics.shaderClasses.HueShader;
        import mx.graphics.shaderClasses.LuminosityShader;
        import mx.graphics.shaderClasses.SaturationShader;
        import mx.graphics.shaderClasses.SoftLightShader;
        import mx.styles.IAdvancedStyleClient;
        import mx.styles.ISimpleStyleClient;
        import mx.styles.IStyleClient;
        import mx.styles.StyleProtoChain;
        import spark.components.ResizeMode;
        import spark.components.supportClasses.GroupBase;
        import spark.core.DisplayObjectSharingMode;
        import spark.core.IGraphicElement;
        import spark.core.IGraphicElementContainer;
        import spark.core.ISharedDisplayObject;
        import spark.events.ElementExistenceEvent;
        use namespace mx_internal;
        //  Events
         *  Dispatched when a visual element is added to the content holder.
         *  <code>event.element</code> is the visual element that was added.
         *  @eventType spark.events.ElementExistenceEvent.ELEMENT_ADD
         *  @langversion 3.0
         *  @playerversion Flash 10
         *  @playerversion AIR 1.5
         *  @productversion Flex 4
        [Event(name = "elementAdd", type = "spark.events.ElementExistenceEvent")]
         *  Dispatched when a visual element is removed from the content holder.
         *  <code>event.element</code> is the visual element that's being removed.
         *  @eventType spark.events.ElementExistenceEvent.ELEMENT_REMOVE
         *  @langversion 3.0
         *  @playerversion Flash 10
         *  @playerversion AIR 1.5
         *  @productversion Flex 4
        [Event(name = "elementRemove", type = "spark.events.ElementExistenceEvent")]
        //  Styles
         *  Color of text shadows.
         *  @default #FFFFFF
         *  @langversion 3.0
         *  @playerversion Flash 10
         *  @playerversion AIR 1.5
         *  @productversion Flex 4
        [Style(name = "textShadowColor", type = "uint", format = "Color", inherit = "yes", theme = "mobile")]
         *  Alpha of text shadows.
         *  @default 0.55
         *  @langversion 3.0
         *  @playerversion Flash 10
         *  @playerversion AIR 1.5
         *  @productversion Flex 4
        [Style(name = "textShadowAlpha", type = "Number", inherit = "yes", minValue = "0.0", maxValue = "1.0", theme = "mobile")]
        //  Excluded APIs
        [Exclude(name = "addChild", kind = "method")]
        [Exclude(name = "addChildAt", kind = "method")]
        [Exclude(name = "removeChild", kind = "method")]
        [Exclude(name = "removeChildAt", kind = "method")]
        [Exclude(name = "setChildIndex", kind = "method")]
        [Exclude(name = "swapChildren", kind = "method")]
        [Exclude(name = "swapChildrenAt", kind = "method")]
        [Exclude(name = "numChildren", kind = "property")]
        [Exclude(name = "getChildAt", kind = "method")]
        [Exclude(name = "getChildIndex", kind = "method")]
        //  Other metadata
        [ResourceBundle("components")]
        [DefaultProperty("mxmlContent")]
        [IconFile("Group.png")]
         *  The Group class is the base container class for visual elements.
         *  The Group container takes as children any components that implement
         *  the IUIComponent interface, and any components that implement
         *  the IGraphicElement interface.
         *  Use this container when you want to manage visual children,
         *  both visual components and graphical components.
         *  <p>To improve performance and minimize application size,
         *  the Group container cannot be skinned.
         *  If you want to apply a skin, use the SkinnableContainer instead.</p>
         *  <p><b>Note:</b> The scale grid might not function correctly when there
         *  are DisplayObject children inside of the Group, such as a component
         *  or another Group.  If the children are GraphicElement objects, and
         *  they all share the Group's DisplayObject, then the scale grid works
         *  properly.</p>
         *  <p>Setting any of the following properties on a GraphicElement child
         *  requires that GraphicElement to create its own DisplayObject,
         *  thus negating the scale grid properties on the Group.</p>
         *  <pre>
         *  alpha
         *  blendMode other than BlendMode.NORMAL or "auto"
         *  colorTransform
         *  filters
         *  mask
         *  matrix
         *  rotation
         *  scaling
         *  3D properties
         *  bounds outside the extent of the Group
         *  </pre>
         *  <p>The Group container has the following default characteristics:</p>
         *  <table class="innertable">
         *     <tr><th>Characteristic</th><th>Description</th></tr>
         *     <tr><td>Default size</td><td>Large enough to display its children</td></tr>
         *     <tr><td>Minimum size</td><td>0 pixels</td></tr>
         *     <tr><td>Maximum size</td><td>10000 pixels wide and 10000 pixels high</td></tr>
         *  </table>
         *  @mxml
         *  <p>The <code>&lt;s:Group&gt;</code> tag inherits all of the tag
         *  attributes of its superclass and adds the following tag attributes:</p>
         *  <pre>
         *  &lt;s:Group
         *    <strong>Properties</strong>
         *    blendMode="auto"
         *    mxmlContent="null"
         *    scaleGridBottom="null"
         *    scaleGridLeft="null"
         *    scaleGridRight="null"
         *    scaleGridTop="null"
         *    <strong>Events</strong>
         *    elementAdd="<i>No default</i>"
         *    elementRemove="<i>No default</i>"
         *  /&gt;
         *  </pre>
         *  @see spark.components.DataGroup
         *  @see spark.components.SkinnableContainer
         *  @includeExample examples/GroupExample.mxml
         *  @langversion 3.0
         *  @playerversion Flash 10
         *  @playerversion AIR 1.5
         *  @productversion Flex 4
        public class MonkeyPatchedGroup extends GroupBase implements IVisualElementContainer, IGraphicElementContainer, ISharedDisplayObject
             *  Constructor.
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            public function MonkeyPatchedGroup():void
                super();
            //  Variables
            private var needsDisplayObjectAssignment:Boolean = false;
            private var layeringMode:uint = ITEM_ORDERED_LAYERING;
            private var numGraphicElements:uint = 0;
            private static const ITEM_ORDERED_LAYERING:uint = 0;
            private static const SPARSE_LAYERING:uint = 1;
            //  Overridden properties
            //  baselinePosition
             *  @inheritDoc
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            override public function get baselinePosition():Number
                if (FlexVersion.compatibilityVersion < FlexVersion.VERSION_4_5)
                    return super.baselinePosition;
                if (!validateBaselinePosition())
                    return NaN;
                var bElement:IVisualElement = baselinePositionElement;
                // If no baselinePositionElement is specified, use the first element
                if (bElement == null)
                    for (var i:int = 0; i < numElements; i++)
                        var elt:IVisualElement = getElementAt(i);
                        if (elt.includeInLayout)
                            bElement = elt;
                            break;
                if (bElement)
                    return bElement.baselinePosition + bElement.y;
                else
                    return super.baselinePosition;
            [Inspectable(category = "General", enumeration = "noScale,scale", defaultValue = "noScale")]
             *  @private
            override public function set resizeMode(value:String):void
                if (isValidScaleGrid())
                    // Force the resize mode to be scale if we
                    // have set scaleGrid properties
                    value = ResizeMode.SCALE;
                super.resizeMode = value;
             *  @private
            override public function set scrollRect(value:Rectangle):void
                // Work-around for Flash Player bug: if GraphicElements share
                // the Group's Display Object and cacheAsBitmap is true, the
                // scrollRect won't function correctly.
                var previous:Boolean = canShareDisplayObject;
                super.scrollRect = value;
                if (numGraphicElements > 0 && previous != canShareDisplayObject)
                    invalidateDisplayObjectOrdering();
                if (mouseEnabledWhereTransparent && hasMouseListeners)
                    // Re-render our mouse event fill if necessary.
                    redrawRequested = true;
                    trace("Calling invalidateDisplayList in GroupBase");
                    super.$invalidateDisplayList();
             * @private
            override mx_internal function set hasMouseListeners(value:Boolean):void
                if (mouseEnabledWhereTransparent)
                    redrawRequested = true;
                super.hasMouseListeners = value;
             *  @private
            override public function set width(value:Number):void
                if (_width != value)
                    if (mouseEnabledWhereTransparent && hasMouseListeners)
                        // Re-render our mouse event fill if necessary.
                        redrawRequested = true;
                        super.$invalidateDisplayList();
                super.width = value;
             *  @private
            override public function set height(value:Number):void
                if (_height != value)
                    if (mouseEnabledWhereTransparent && hasMouseListeners)
                        // Re-render our mouse event fill if necessary.
                        redrawRequested = true;
                        super.$invalidateDisplayList();
                super.height = value;
            //  Properties
            //  alpha
            [Inspectable(defaultValue = "1.0", category = "General", verbose = "1")]
             *  @private
            override public function set alpha(value:Number):void
                if (super.alpha == value)
                    return;
                if (_blendMode == "auto")
                    // If alpha changes from an opaque/transparent (1/0) and translucent
                    // (0 < value < 1), then trigger a blendMode change
                    if ((value > 0 && value < 1 && (super.alpha == 0 || super.alpha == 1)) || ((value == 0 || value == 1) && (super.alpha > 0 && super.alpha < 1)))
                        blendModeChanged = true;
                        invalidateDisplayObjectOrdering();
                        invalidateProperties();
                super.alpha = value;
            //  baselinePositionElement
            private var _baselinePositionElement:IVisualElement;
             *  The element used to calculate the GroupBase's baselinePosition
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            public function get baselinePositionElement():IVisualElement
                return _baselinePositionElement;
             *  @private
            public function set baselinePositionElement(value:IVisualElement):void
                if (value === _baselinePositionElement)
                    return;
                _baselinePositionElement = value;
                invalidateParentSizeAndDisplayList();
            //  blendMode
             *  @private
             *  Storage for the blendMode property.
            private var _blendMode:String = "auto";
            private var blendModeChanged:Boolean;
            private var blendShaderChanged:Boolean;
            [Inspectable(category = "General", enumeration = "auto,add,alpha,darken,difference,erase,hardlight,invert,layer,lighten,multiply,normal,subtract,screen,overlay,colordodge,colorburn,exclusion,softlight,hue,saturation,color,luminosity", defaultValue = "auto")]
             *  A value from the BlendMode class that specifies which blend mode to use.
             *  A bitmap can be drawn internally in two ways.
             *  If you have a blend mode enabled or an external clipping mask, the bitmap is drawn
             *  by adding a bitmap-filled square shape to the vector render.
             *  If you attempt to set this property to an invalid value,
             *  Flash Player or Adobe AIR sets the value to <code>BlendMode.NORMAL</code>.
             *  <p>A value of "auto" (the default) is specific to Group's use of
             *  blendMode and indicates that the underlying blendMode should be
             *  <code>BlendMode.NORMAL</code> except when <code>alpha</code> is not
             *  equal to either 0 or 1, when it is set to <code>BlendMode.LAYER</code>.
             *  This behavior ensures that groups have correct
             *  compositing of their graphic objects when the group is translucent.</p>
             *  @default "auto"
             *  @see flash.display.DisplayObject#blendMode
             *  @see flash.display.BlendMode
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            override public function get blendMode():String
                return _blendMode;
             *  @private
            override public function set blendMode(value:String):void
                if (value == _blendMode)
                    return;
                invalidateProperties();
                blendModeChanged = true;
                //The default blendMode in FXG is 'auto'. There are only
                //certain cases where this results in a rendering difference,
                //one being when the alpha of the Group is > 0 and < 1. In that
                //case we set the blendMode to layer to avoid the performance
                //overhead that comes with a non-normal blendMode.
                if (value == "auto")
                    _blendMode = value;
                    // SDK-29631: Use super.$blendMode instead of super.blendMode
                    // since Group completely overrides blendMode and we
                    // want to bypass the extra logic in UIComponent which
                    // has its own override.
                    // TODO (egeorgie): figure out whether we can share some
                    // of that logic in the future.
                    if (((alpha > 0 && alpha < 1) && super.$blendMode != BlendMode.LAYER) || ((alpha == 1 || alpha == 0) && super.$blendMode != BlendMode.NORMAL))
                        invalidateDisplayObjectOrdering();
                else
                    var oldValue:String = _blendMode;
                    _blendMode = value;
                    // If one of the non-native Flash blendModes is set,
                    // record the new value and set the appropriate
                    // blendShader on the display object.
                    if (isAIMBlendMode(value))
                        blendShaderChanged = true;
                    // Only need to re-do display object assignment if blendmode was normal
                    // and is changing to something else, or the blend mode was something else
                    // and is going back to normal.  This is because display object sharing
                    // only happens when blendMode is normal.
                    if ((oldValue == BlendMode.NORMAL || value == BlendMode.NORMAL) && !(oldValue == BlendMode.NORMAL && value == BlendMode.NORMAL))
                        invalidateDisplayObjectOrdering();
            //  mxmlContent
            private var mxmlContentChanged:Boolean = false;
            private var _mxmlContent:Array;
            [ArrayElementType("mx.core.IVisualElement")]
             *  The visual content children for this Group.
             *  This method is used internally by Flex and is not intended for direct
             *  use by developers.
             *  <p>The content items should only be IVisualElement objects.
             *  An <code>mxmlContent</code> Array should not be shared between multiple
             *  Group containers because visual elements can only live in one container
             *  at a time.</p>
             *  <p>If the content is an Array, do not modify the Array
             *  directly. Use the methods defined by the Group class instead.</p>
             *  @default null
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            public function set mxmlContent(value:Array):void
                if (createChildrenCalled)
                    setMXMLContent(value);
                else
                    mxmlContentChanged = true;
                    _mxmlContent = value;
                        // we will validate this in createChildren();
             *  @private
            mx_internal function getMXMLContent():Array
                if (_mxmlContent)
                    return _mxmlContent.concat();
                else
                    return null;
             *  @private
             *  Adds the elements in <code>mxmlContent</code> to the Group.
             *  Flex calls this method automatically; you do not call it directly.
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            private function setMXMLContent(value:Array):void
                var i:int;
                // if there's old content and it's different than what
                // we're trying to set it to, then let's remove all the old
                // elements first.
                if (_mxmlContent != null && _mxmlContent != value)
                    for (i = _mxmlContent.length - 1; i >= 0; i--)
                        elementRemoved(_mxmlContent[i], i);
                _mxmlContent = (value) ? value.concat() : null; // defensive copy
                if (_mxmlContent != null)
                    var n:int = _mxmlContent.length;
                    for (i = 0; i < n; i++)
                        var elt:IVisualElement = _mxmlContent[i];
                        // A common mistake is to bind the viewport property of a Scroller
                        // to a group that was defined in the MXML file with a different parent   
                        if (elt.parent && (elt.parent != this))
                            throw new Error(resourceManager.getString("components", "mxmlElementNoMultipleParents",
                                                                      [ elt ]));
                        elementAdded(elt, i);
            //  Properties: ScaleGrid
            private var scaleGridChanged:Boolean = false;
            // store the scaleGrid into a rectangle to save space (top, left, bottom, right);
            private var scaleGridStorageVariable:Rectangle;
            //  scale9Grid
             *  @private
            override public function set scale9Grid(value:Rectangle):void
                if (value != null)
                    scaleGridTop = value.top;
                    scaleGridBottom = value.bottom;
                    scaleGridLeft = value.left;
                    scaleGridRight = value.right;
                else
                    scaleGridTop = NaN;
                    scaleGridBottom = NaN;
                    scaleGridLeft = NaN;
                    scaleGridRight = NaN;
            //  scaleGridBottom
            [Inspectable(category = "General")]
             *  Specifies the bottom coordinate of the scale grid.
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            public function get scaleGridBottom():Number
                if (scaleGridStorageVariable)
                    return scaleGridStorageVariable.height;
                return NaN;
            public function set scaleGridBottom(value:Number):void
                if (!scaleGridStorageVariable)
                    scaleGridStorageVariable = new Rectangle(NaN, NaN, NaN, NaN);
                if (value != scaleGridStorageVariable.height)
                    scaleGridStorageVariable.height = value;
                    scaleGridChanged = true;
                    invalidateProperties();
                    invalidateDisplayList();
            //  scaleGridLeft
            [Inspectable(category = "General")]
             * Specifies the left coordinate of the scale grid.
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            public function get scaleGridLeft():Number
                if (scaleGridStorageVariable)
                    return scaleGridStorageVariable.x;
                return NaN;
            public function set scaleGridLeft(value:Number):void
                if (!scaleGridStorageVariable)
                    scaleGridStorageVariable = new Rectangle(NaN, NaN, NaN, NaN);
                if (value != scaleGridStorageVariable.x)
                    scaleGridStorageVariable.x = value;
                    scaleGridChanged = true;
                    invalidateProperties();
                    invalidateDisplayList();
            //  scaleGridRight
            [Inspectable(category = "General")]
             * Specifies the right coordinate of the scale grid.
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            public function get scaleGridRight():Number
                if (scaleGridStorageVariable)
                    return scaleGridStorageVariable.width;
                return NaN;
            public function set scaleGridRight(value:Number):void
                if (!scaleGridStorageVariable)
                    scaleGridStorageVariable = new Rectangle(NaN, NaN, NaN, NaN);
                if (value != scaleGridStorageVariable.width)
                    scaleGridStorageVariable.width = value;
                    scaleGridChanged = true;
                    invalidateProperties();
                    invalidateDisplayList();
            //  scaleGridTop
            [Inspectable(category = "General")]
             * Specifies the top coordinate of the scale grid.
             *  @langversion 3.0
             *  @playerversion Flash 10
             *  @playerversion AIR 1.5
             *  @productversion Flex 4
            public function get scaleGridTop():Number
                if (scaleGridStorageVariable)
                    return scaleGridStorageVariable.y;
                return NaN;
            public function set scaleGridTop(value:Number):void
                if (!scaleGridStorageVariable)
                    scaleGridStorageVariable = new Rectangle(NaN, NaN, NaN, NaN);
                if (value != scaleGridStorageVariable.y)
                    scaleGridStorageVariable.y = value;
                    scaleGridChanged = true;
                    invalidateProperties();
                    invalidateDisplayList();
            private function isValidScaleGrid():Boolean
                return !isNaN(scaleGridLeft) && !isNaN(scaleGridTop) && !isNaN(scaleGridRight) && !isNaN(scaleGridBottom);
            //  Overridden methods: UIComponent
             *  @private
             *  Whether createChildren() has been called or not.
             *  We use this in the setter for mxmlContent to know
             *  whether to validate the value immediately, or just
             *  wait to let createChildren() do it.
            private var createChildrenCalled:Boolean = false;
             *  @private
            override protected function createChildren():void
                super.createChildren();
                createChildrenCalled = true;
                if (mxmlContentChanged)
                    mxmlContentChanged = false;
                    setMXMLContent(_mxmlContent);
             *  @private
            override public function validateProperties():void
                super.validateProperties();
                // Property validation happens top-down, so now let's
                // validate graphic element properties after
                // calling super.validateProperties()
                if (numGraphicElements > 0)
                    var length:int = numElements;
                    for (var i:int = 0; i < length; i++)
                        var element:IGraphicElement = getElementAt(i) as IGraphicElement;
                        if (element)
                            element.validateProperties();
             *  @private
            override protected function commitProperties():void
                super.commitProperties();
                invalidatePropertiesFlag = false;
                if (blendModeChanged)
                    blendModeChanged = false;
                    // Figure out the correct blendMode value
                    // to set.
                    // SDK-29631: Use super.$blendMode instead of super.blendMode
                    // since Group completely overrides blendMode and we
                    // want to bypass the extra logic in UIComponent which
                    // has its own override.
                    // TODO (egeorgie): figure out whether we can share some
                    // of that logic in the future.
                    if (_blendMode == "auto")
                        if (alpha == 0 || alpha == 1)
                            super.$blendMode = BlendMode.NORMAL;
                        else
                            super.$blendMode = BlendMode.LAYER;
                    else if (!isAIMBlendMode(_blendMode))
                        super.$blendMode = _blendMode;
                    if (blendShaderChanged)
                        // The graphic element's blendMode was set to a non-Flash
                        // blendMode. We mimic the look by instantiating the
                        // appropriate shader class and setting the blendShader
                        // property on the displayObject.
                        blendShaderChanged = false;
                        switch (_blendMode)
                            case "color":
                                super.blendShader = new ColorShader();
                                break;
                            case "colordodge":
                                super.blendShader = new ColorDodgeShader();
                                break;
                            case "colorburn":
                                super.blendShader = new ColorBurnShader();
                                break;
                            case "exclusion":
                                super.blendShader = new ExclusionShader();
                                break;
                            case "hue":
                                super.blendShader = new HueShader();
                                break;
                            case "luminosity":
                                super.blendShader = new LuminosityShader();
                                break;
                            case "saturation":
                                super.blendShader = new SaturationShader();
                                break;
                            case "softlight":
                                super.blendShader = new SoftLightShader();
                                break;
                // Due to dependent properties alpha and blendMode there may be a need
                // for a second pass at committing properties (to ensure our new
                // blendMode or blendShader is assigned to our underlying display
                // object).
                if (invalidatePropertiesFlag)
                    super.commitProperties();
                    invalidatePropertiesFlag = false;
                if (needsDisplayObjectAssignment)
                    needsDisplayObjectAssignment = false;
                    assignDisplayObjects();
                if (scaleGridChanged)
                    // Don't reset scaleGridChanged since we also check it in updateDisplayList
                    if (isValidScaleGrid())
                        resizeMode = ResizeMode.SCALE; // Force the resizeMode to scale
             *  @private
            override public function validateSize(recursive:Boolean = false):void
                // Since IGraphicElement is not ILayoutManagerClient, we need to make sure we
                // validate sizes of the elements, even in cases where recursive==false.
                // Size validation happens bottom-up, so now let's
                // validate graphic element size before
                // calling super.validateSize()
                if (numGraphicElements > 0)
                    var length:int = numElements;
                    for (var i:int = 0; i < length; i++)
                        var element:IGraphicElement = getElementAt(i) as IGraphicElement;
                        if (element)
                            element.validateSize();
                super.validateSize(recursive);
             *  @private
            override public function setActualSize(w:Number, h:Number):void
                if (_width != w || _height != h)
                    if (mouseEnabledWhereTransparent && hasMouseListeners)
                        // Re-render our mouse event fill if necessary.
                        redrawRequested = true;
                        super.$invalidateDisplayList();
                super.setActualSize(w, h);
             *  @private
            override public function validateDisplayList():void
                // call super.validateDisplayList() and let updateDisplayList() run
                super.validateDisplayList();
                // If the DisplayObject assignment is still not completed, then postpone validation
                // of the GraphicElements. invalidateDisplayList() will be called during the next
                // commitProperties() call since needsDisplayObjectAssignment=true,
                // so we will be re-running validateDisplayList() anyways
                if (needsDisplayObjectAssignment && invalidatePropertiesFlag)
                    return;
                // DisplayList validation happens top-down, so we should
                // validate graphic element DisplayList after
                // calling super.validateDisplayList().  This is
                // gets tricky because of graphic-element sharing.  We clear
                // Group's graphic's object in updateDisplayList() and handle the
                // rest of the DisplayList validation in here.
                // Iterate through the graphic elements. If an element has a displayObject that has been
                // invalidated, then validate all graphic elements that draw to this displayObject.
                // The algorithm assumes that all of the elements that share a displayObject are in between
                // the element with the shared displayObject and the next element that has a displayObject.
                var sharedDisplayObject:ISharedDisplayObject = this;
                if (numGraphicElements > 0)
                    var length:int = numElements;
                    for (var i:int = 0; i < length; i++)
                        var element:IGraphicElement = getElementAt(i) as IGraphicElement;
                        if (!element)
                            continue;
                        // Do a special check for layer, we may stumble upon an element with layer != 0
                        // before we're done with the current shared sequence and we don't want to mark
                        // the sequence as valid, until we reach the next sequence.  
                        if (element.depth == 0)
                            // Is this the start of a new shared sequence?         
                            if (element.displayObjectSharingMode != DisplayObjectSharingMode.USES_SHARED_OBJECT)
                                // We have finished redrawing the previous sequence
                                if (sharedDisplayObject)
                                    sharedDisplayObject.redrawRequested = false;
                                // Start the new sequence
                                sharedDisplayObject = element.displayObject as ISharedDisplayObject;
                            if (!sharedDisplayObject || sharedDisplayObject.redrawRequested)
                                element.validateDisplayList();
                        else
                            // If we have layering, we don't share the display objects.
                            // Don't update the current sharedDisplayObject
                            var elementDisplayObject:ISharedDisplayObject = element.displayObject as ISharedDisplayObject;
                            if (!elementDisplayObject || elementDisplayObject.redrawRequested)
                                element.validateDisplayList();
                                if (elementDisplayObject)
                                    elementDisplayObject.redrawRequested = false;
                // Mark the last shared displayObject valid
                if (sharedDisplayObject)
                    sharedDisplayObject.redrawRequested = false;
             *  @private
            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
                // let user's code (layout) run first before dealing with graphic element
                // sharing because that's when redraws can be requested
                super.updateDisplayList(unscaledWidth, unscaledHeight);
                // Clear the group's graphic because graphic elements might be drawing to it
                // This isn't needed for DataGroup because there's no DisplayObject sharing
                // This code exists in updateDisplayList() as opposed to validateDisplayList()
                // because of compatibility issues since most of this code was
                // refactored from updateDisplayList() and in to validateDisplayList().  User's code
                // already assumed that they could call super.updateDisplayList() and then be able to draw
                // into the Group's graphics object.  Because of that, the graphics.clear() call is left
                // in updateDisplayList() instead of in validateDisplayList() with the rest of the graphic
                // element sharing code.
                var sharedDisplayObject:ISharedDisplayObject = this;
                if (sharedDisplayObject.redrawRequested)
                    // clear the graphics here.  The pattern is usually to call graphics.clear()
                    // before calling super.updateDisplayList() so what happens in super.updateDisplayList()
                    // isn't erased.  However, in this case, what happens in super.updateDisplayList() isn't
                    // much, and we want to make sure super.updateDisplayList() runs first since the layout
                    // is what actually triggers the the shareDisplayObject to request to be redrawn.
                    graphics.clear();
                    drawBackground();
                    // If a scaleGrid is set, make sure the extent of the groups bounds are filled so
                    // the player will scale our contents as expected.
                    if (isValidScaleGrid() && resizeMode == ResizeMode.SCALE)
                        graphics.lineStyle();
                        graphics.beginFill(0, 0);
                        graphics.drawRect(0, 0, 1, 1);
                        graphics.drawRect(measuredWidth - 1, measuredHeight - 1, 1, 1);
                        graphics.endFill();
                if (scaleGridChanged)
                    scaleGridChanged = false;
                    if (isValidScaleGrid())
                        // Check for DisplayObjects other than overlays
                        var overlayCount:int = _overlay ? _overlay.numDisplayObjects : 0;
                        if (numChildren - overlayCount > 0)
                            throw new Error(resourceManager.getString("components", "scaleGridGroupError"));
                        super.scale9Grid = new Rectangle(scaleGridLeft,
                                                         scaleGridTop,
                                                         scaleGridRight - scaleGridLeft,
                                                         scaleGridBottom - scaleGridTop);
                    else
                        super.scale9Grid = null;
             *  @private
             *  TODO (rfrishbe): Most of this code is a duplicate of UIComponent::notifyStyleChangeInChildren,
             *  refactor as appropriate to avoid code duplication once we have a common
             *  child iterator between UIComponent and Group.
            override public function notifyStyleChangeInChildren(
                styleProp:String, recursive:Boolean):void
                if (mxmlContentChanged || !recursive)
                    return;
                var n:int = numElements;
                for (var i:int = 0; i < n; i++)
                    var child:ISimpleStyleClient = getElementAt(i) as ISimpleStyleClient;
                    if (child)
                        child.styleChanged(styleProp);
                        if (child is IStyleClient)
                            IStyleClient(child).notifyStyleChangeInChildren(styleProp,
                                                                            recursive);
                if (advanceStyleClientChildren != null)
                    for (var styleClient:Object in advanceStyleClientChildren)
                        var iAdvanceStyleClientChild:IAdvancedStyleClient = styleClient as IAdvancedStyleClient;
                        if (iAdvanceStyleClientChild)
                            iAdvanceStyleClientChild.styleChanged(styleProp);
             *  @private
             *  TODO (rfrishbe): Most of this code is a duplicate of UIComponent::regenerateStyleCache,
             *  refactor as appropriate to avoid code duplication once we have a common
             *  child iterator between UIComponent and Group.
            override public function regenerateStyleCache(recursive:Boolean):void
                // Regenerate the proto chain for this object
                initProtoChain();
                // Recursively call this method on each child.
                var n:int = numElements;
                for (var i:int = 0; i < n; i++)
                    var child:IVisualElement = getElementAt(i);
                    if (child is IStyleClient)
                        // Does this object already have a proto chain?
                        // If not, there's no need to regenerate a new one.
                        if (IStyleClient(child).inheritingStyles != StyleProtoChain.STYLE_UNINITIALIZED)
                            IStyleClient(child).regenerateStyleCache(recursive);
                    else if (child is IUITextField)
                        // Does this object already have a proto chain?
                        // If not, there's no need to regenerate a new one.
                        if (IUITextField(child).inheritingStyles)
                            StyleProtoChain.initTextField(IUITextField(child));
                // Call this method on each non-visual StyleClient
                if (advanceStyleClientChildren != null)
                    for (var styleClient:Object in advanceStyleClientChildren)
                        var iAdvanceStyleClientChild:IAdvancedStyleClient = styleClient as IAdvancedStyleClient;
                        if (iAdvanceStyleClientChild && iAdvanceStyleClientChild.inheritingStyles != StyleProtoChain.STYLE_UNINITIALIZED)
                            iAdvanceStyleClientChild.regenerateStyleCache(recursive);
            //  Content management
             *  @private
            override public function get numElements():int
                if (_mxmlContent == null)
                    return 0;
                return _mxmlContent.length;
             *  @private
            override public function getElementAt(index:int):IVisualElement
                // check for RangeError:
                checkForRangeError(index);
                return _mxmlContent[index];
             *  @private
             *  Checks the range of index to make sure it's valid
            private function checkForRangeError(index:int, addingElement:Boolean = false):void
                // figure out the maximum allowable index
                var maxIndex:int = (_mxmlContent == null ? -1 : _mxmlContent.length - 1);
                // if adding an element, we allow an extra index at the end
                if (addingElement)
                    maxIndex++;
                if (index < 0 || index > maxIndex)
                    throw new RangeError(resourceManager.getString("components", "indexOutOfRange",
                                                                   [ index ]));
             * @private
            private function isAIMBlendMode(value:String):Boolean
                if (value == "colordodge" || value == "colorburn" || value == "exclusion" || value == "softlight" || value == "hue" || value == "saturatio

    FYI - This regression has been filed here: http://bugs.adobe.com/jira/browse/SDK-31989

  • Effect of BitLocker on SQL server database performance?

    We have a corporate requirement to ensure data is encrypted at rest.  We are running SQL Server 2014 with a 1.5TB database, mostly read activity.
    I am considering using BitLocker to meet the requirement.  I have searched the forums and can't seem to find anyone who has had direct experience with using BitLocker to protect data drives running SQL.  Does anyone have any real world experience
    with this, particularly experience with the effect on the performance of SQL?
    BTW - our preference is to use BitLocker and not TDE, as TDE seems much more complex in its administration which introduces some risk for our team of IT generalists.
    TIA.

    Hi  BArmand ,
    The hardware cost depends on how strong we want the BitLocker to protect .
    BitLocker supports two levels of cipher strength for BitLocker: 128-bit and 256-bit. Longer encryption keys provide an enhanced level of security. However, longer keys can cause slower encryption
    and decryption of data. On some computers, using longer keys might result in noticeable performance degradation.
    Generally it imposes a single-digit percentage performance overhead.
    If the hardware configuration of our server is up to date ,there won’t be noticeable effect on performance .
    Here is some detailed information of BitLocker :
    How Strong Do You Want the BitLocker Protection? :
    https://technet.microsoft.com/en-us/library/ee706531(WS.10).aspx
    BitLocker Drive Encryption :
    https://technet.microsoft.com/en-us/library/cc731549%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396
    Best Regards,
    Leo
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. If you have feedback for TechNet Support, contact [email protected]

  • Servlets/JDBC vs. servlets/EJB performance comparison/benchmark

    I have a PHB who believes that EJB has no ___performance___ benefit
    against straightforward servlets/JSP/JDBC. Personally, I believe that
    using EJB is more scalable instead of using servlets/JDBC with
    connection pooling.
    However, I am at a lost on how to prove it. There is all the theory, but
    I would appreciate it if anyone has benchmarks or comparison of
    servlets/JSP/JDBC and servlets/JSP/EJB performance, assuming that they
    were tasked to do the same thing ( e.g. performance the same SQL
    statement, on the same set of tables, etc. ).
    Or some guide on how to setup such a benchmark and prove it internally.
    In other words, the PHB needs numbers, showing performance and
    scalability. In particular, I would like this to be in WLS 6.0.
    Any help appreciated.

    First off, whether you use servlets + JDBC or servlets + EJB, you'll
    most likely spend much of your time in the database.
    I would strongly suggest that you avoid the servlets + JDBC
    architecture. If you want to do straight JDBC code, then it's
    preferable to use a stateless session EJB between the presentation layer
    and the persistence layer.
    So, you should definitely consider an architecture where you have:
    servlets/jsp --> stateless session ejb --> JDBC code
    Your servlet / jsp layer handles presentation.
    The stateless session EJB layer abstracts the persistence layer and
    handles transaction demarcation.
    Modularity is important here. There's no reason that your presentation
    layer should be concerned with your persistence logic. Your application
    might be re-used or later enhanced with an Entity EJB, or JCA Connector,
    or a JMS queue providing the persistence layer.
    Also, you will usually have web or graphic designers who are modifying
    the web pages. Generally, they should not be exposed to transactions
    and jdbc code.
    We optimize the RMI calls so they are just local method calls. The
    stateless session ejb instances are pooled. You won't see much if any
    performance overhead.
    -- Rob
    jms wrote:
    >
    I have a PHB who believes that EJB has no ___performance___ benefit
    against straightforward servlets/JSP/JDBC. Personally, I believe that
    using EJB is more scalable instead of using servlets/JDBC with
    connection pooling.
    However, I am at a lost on how to prove it. There is all the theory, but
    I would appreciate it if anyone has benchmarks or comparison of
    servlets/JSP/JDBC and servlets/JSP/EJB performance, assuming that they
    were tasked to do the same thing ( e.g. performance the same SQL
    statement, on the same set of tables, etc. ).
    Or some guide on how to setup such a benchmark and prove it internally.
    In other words, the PHB needs numbers, showing performance and
    scalability. In particular, I would like this to be in WLS 6.0.
    Any help appreciated.--
    Coming Soon: Building J2EE Applications & BEA WebLogic Server
    by Michael Girdley, Rob Woollen, and Sandra Emerson
    http://learnweblogic.com

Maybe you are looking for

  • Screen Sharing issues

    I've got VNC working fine for remote access. The problem is I've come across issues where I get disconnected, and the VNC server will never timeout the session. Since OSX seems to only allow 1 VNC connection to the computer, I'm unable to access it u

  • Firefox sync disables itself

    I have a firefox sync account, however every time I go to the Tools --> Options --> Sync tab nothing is there but the "Set Up Firefox Sync" option. I have reset this multiple times on multiple PCs (and received the "Device Connected" message with the

  • BDC Session Saves Data Only in Foreground

    I have created a bdc program to create an SM35 session of CA02.  The wierd thing is that the session will run in background with no errors, but the data is not updated.  If I run the session in foreground the data is updated.  Have I overlooked somet

  • RFC Adaptive model in web dynpro application gives mandatory parameter erro

    Hi, I need to check  when we create model to call bapi from backend, are there any checks for the input data which are done by the model before  the bapi is called ? I am passing some input parameters and I get the following error on the screen. and

  • Inspire 5.1 P5800

    Hello guys! I just bought the Creative inspire P5800 and want to install it on a Acer Aspire 692 laptop. Problem is that it wouldn?t work the right way . It is not clear which speaker is the front, which the rear, which the right etc. I only know whi