精华内容
下载资源
问答
  • Jmeter 参数化实现

    千次阅读 多人点赞 2018-06-22 17:27:27
    在测试过程中,我们经常遇到需要根据需求动态操作数据的情况,常规的固定数据无法满足我们的需要,这个时候,我们可以通过jmeter 提供的参数化组件来实现动态的获取数据、改变数据。 Jmeter 中常用的参数化方式 ...

          在测试过程中,我们经常遇到需要根据需求动态操作数据的情况,常规的固定数据无法满足我们的需要,这个时候,我们可以通过jmeter 提供的参数化组件来实现动态的获取数据、改变数据。

    Jmeter 中常用的参数化方式

          jmeter 为我们提供了四种实现参数化的方式,分别是【CSV Data Set Config】(数据集配置)组件、【用户参数】组件、【用户定义的变量】组件和【函数】组件,四种方式都有各自的使用场景,互为补充。

    1.【CSV Data Set Config】(数据集配置)组件

          我们借助此组件可以实现动态的从外部CSV文件中获取数据,从而达到批量操作数据的目的。
    使用此组件的前提条件:我们需要有一个 CSV 格式的数据文件。

    CSV文件编写格式:
    	1.每一行代表一条数据;
    	2.各字段之间用英文逗号分隔开;
    	3.编码格式采用 utf-8。
    

    假设现在有一个 CSV 格式的数据文件csv_test.txt,该文件内容如下图所示:
    这里写图片描述

          要实现依次读取文件中的内容,并将内容中第一个字段的值作为关键字在百度中搜索的操作,我们可以这样做:
    1)在jmeter中依次创建【测试计划】、【线程组】和【HTTP 请求】,并添加查看结果的组件【查看结果树】如图:
    这里写图片描述
    2)添加【CSV Data Set Config】(数据集配置)组件:右击【线程组】—>【添加】—>【配置元件】—>【CSV Data Set Config】。
    3)配置参数

    • 设置线程组循环次数:选中【线程组】,在右边属性窗口中将【循环次数】设置成 与CSV 数据文件中数据条数相同,在本例中即为3。
      这里写图片描述
    • 设置 CSV Data Set Config 组件的参数
      • Filename:CSV 数据文件所在路径。

      • File encoding:CSV文件的编码格式,即 utf-8;

      • Variable Names(comma-delimited):给 CSV 数据文件中数据的每个字段取一个名字,作为调用的变量名;CSV 中每个字段都对应一个变量,每个变量用逗号隔开

      • Delimiter(use ‘\t’ for tab):与CSV 中的分隔符 保持一致,本例中即为英文逗号;
        这里写图片描述

      • 一般情况下,我们只需要设置这四个属性即可。

    4)使用变量

    • 变量名即为上一步骤中设置的变量名
    • 变量使用格式为${变量名}
    • 在 HTTP 请求 URL 路径中使用正确格式调用变量,如图。
      这里写图片描述
    • 为了结果更明确,在 HTTP 请求的命名中也调用此变量标注。

    5)执行,结果如下图:
    这里写图片描述
          结果中显示,我们依次从 CSV 数据文件中获取到了每条数据的第一个字段的值,并将其作为百度搜索的关键字执行了搜索。

    2.【用户参数】组件

          除了读取外部文件中的数据,我们还可以在jmeter中定义一些数据,实现批量操作数据的功能。但由于此操作不是那么的易用,所以数据量较大时,不建议使用此操作。
    下面我们来看一下具体是怎么操作的:
    1)这里我们先把上面添加的 CSV Data Set Config 组件禁用掉(右击该组件后选择【禁用】即可);
    这里写图片描述
    2)通过添加【用户参数】组件,用来配置数据:右击【测试计划】—>【添加】—>【前置处理器】—>【用户参数】,如图:
    这里写图片描述
    3)配置数据。我们可以看到用户参数面板如下图所示,主要使用的部分就是图中标注出来的三个部分:
    这里写图片描述

    • ①这里应该不陌生了,就是用来标注我们这部分的参数是给干什么用的,取个名字,见名知意,好让我们以后再看的时候不会迷糊。

    • ②这里我们看到有四个按钮,第一行的两个是用来操作变量的,第二行的两个是用来操作用户的。这里所谓的变量就是我们要设置的参数变量名,用来在后面调用的;而用户就是参数值,每一个用户对应一条数据。

    • ③ 点击【添加变量】后会在③中添加一行输入框,提供给我们输入变量名和变量值,输入后保存即可。点击【添加用户】后会在【用户_1】后面添加一列,表示可以多添加一条数据。

    • 我们还是用上面例子中的数据添加到这,如下图:
      这里写图片描述

    • 从上面的结构我们可以看出,【用户参数】组件是通过表格的形式来存储数据的,每个变量和变量值都需要我们手动去一条一条添加,可想而知,如果数据量比较大的情况下,我们还是用此方式操作的话,就会比较麻烦了。这种情况下,就建议使用第一种方式来批量操作数据了。

    4)更改线程组设置,让jmeter循环读取我们的数据:

    • 将线程组的【线程数】更改为与我们【用户参数】中用户数量相同;
    • 将线程组的【循环次数】更改回 1 次。

    5)调用参数的方式与上面的例子相同,在需要的地方使用"${变量名}"的格式调用即可,这次我们来遍历一下 【country】的值。
    这里写图片描述
    6)我们来执行一下,看看读取【用户参数】的执行结果:
    这里写图片描述
    出现上面的结果,就说明我们配置成功了!

    3.【用户定义的变量】组件

    1)通常,在项目的接口中经常会遇到一些相同的部分,当这个相同的不出频繁出现时,我们可以将其抽取出来,作为一个全局的变量供我们调用,定义全局变量我们可以通过定义【用户定义的变量】来实现;
    2)这里我们抽取 HTTP 请求的【服务器名称】和【端口号】来举例。
    3)添加【用户定义的变量】组件:右击【测试计划】—>【添加】—>【配置元件】—>【用户定义的变量】,如图所示,
    这里写图片描述
    4)【用户定义的变量】面板如下图所示,我们依次来介绍。
    这里写图片描述

    • ①取个见名知意的名字
    • ②点击【添加】,就会出现③中的输入框;点击【删除】,就会在③中删除一个变量。
    • ③【名称】:即参数名,变量名;【值】:参数值,变量值;【Description】:对变量的描述信息,可不填。
      这里写图片描述

    5)调用方式和之前一样,HTTP 请求的【服务器名称】和【端口号】的位置调用这两个变量:
    这里写图片描述
    6)查看执行结果,如下:
    这里写图片描述
          这里我们要注意的是:【用户定义的变量】是全局变量,即这里定义的变量的所有值只会初始化一次,无论后面创建了多少线程,值都不会变。也正是因为这个原因,为了不占用过多资源,建议不要创建太多这种类型的变量。

    4.【函数】组件

          在jmeter 中已经内置了一些【函数】供我们使用,给我们的测试工作提供了很大的便利。在jmeter中常用的【函数】主要有6个,我们通过其中的__counter()为例来介绍【函数】组件的使用方式,后面再介绍每个函数的功能。
    1)调出【函数】组件有三种方式,我们在使用时选择任意一种即可:

    • 方式一:菜单栏【选项】—>【函数助手对话框】

    这里写图片描述

    • 方式二:工具栏中倒数第二个类似于笔记本的按钮【函数助手对话框】
      这里写图片描述
    • 方式三:使用快捷键:
      • Windows 平台:Ctrl+shift+F1
      • Mac 平台:shift+command+F1
    1. 执行1)中的操作后,会出现下面的对话框:
      这里写图片描述
    • ①选择我们需要使用的函数__counter

    • ②设置函数调用时需要的参数:

      • 第一行:设置此计数器的作用范围:

        • TRUE:用户范围内有效,在本例中我们可以认为是单次循环内有效;
        • FALSE:全局范围内有效,即在多次循环范围内有效。
      • 第二行:这里要给函数的返回值取个名字,以便后面调用,这个是选填参数;

    • ③点击【生成】按钮,在输入框中就会出现完整的函数调用代码,我们直接复制到需要调用该函数的位置即可。
      这里写图片描述

    3) 为了直观体现出参数的作用,我们把线程组的【循环次数】设置为多次,这里就设置为3。

    • 当参数选择 TRUE 时:
      这里写图片描述
      这里写图片描述
      查看结果,我们可以发现,每次循环都是从1开始的。
    • 当参数选择 FALSE 时:
      这里写图片描述
      查看结果,我们可以发现,所有循环使用同一个计数器,新循环开始时,计数器不再重置为1,而是继上次循环结束时的结果递增。

    至此,函数的调用方式就介绍完了,下面就介绍一下jmeter中内置的6个常用函数:

    • __counter():计数器,上面介绍过了,就不再赘述。

    • __random():产生一个随机数。

      • 参数1:随机范围的低边界值,即随机范围内的最小值;
      • 参数2:随机范围的高边界值,即随机范围内的最大值;
      • 如下图中的设置所示,随机范围为[0,100] ,即两个边界值都可能取到。
        这里写图片描述
    • __time():返回当前时间,默认为距离1970年1月1日 0时0分0秒的毫秒值。

      • 参数1:设置返回的时间表现形式,
        • yyyy:表示年份
        • MM:表示月份
        • dd:表示日期
        • hh/HH:表示小时(hh:12小时制,HH:24小时制);
        • mm:表示分钟
        • ss:表示秒
          这里写图片描述
    • __CSVRead():读取外部 CSV 格式文件,类似于 CSV Data Set Config 组件,用来批量操作数据。

      • 参数1:CSV 文件路径,注意这里要填写 CSV 文件的绝对路径;

      • 参数2:要读取CSV 文件中哪一个字段的值,这里填写的是字段对应的 index 值,index 从0开始计数,即第一个字段对应的 index 为0 。
        这里写图片描述

      • 注意:此函数读取 CSV 文件要注意:

        • 此函数调用一次,只能读取一个字段的值,所以想要读出所有字段,需要多次调用此函数;
        • 将线程组的【线程数】设置为与 CSV 文件数据行数相同,可以读出当前字段对应的所有值;
      • 查看结果

        • 线程数设置为3,(与 CSV 文件数据行相同)
        • 只用一次 HTTP 请求,读取一个字段的值
          这里写图片描述
          这里写图片描述
          结果显示,我们只读取了一个字段对应的所有数据。
        • 下面我们再创建一个 HTTP 请求,多调用一次此函数,读取两个字段的值,注意第二各字段对应的 index 为1,不要忘记修改。
          这里写图片描述
          由结果看出,线程数为3,发送两次请求,调用两次此函数,成功的读取出了 CSV 文件中的两个字段对应三条数据的所有值。
    • __setProperty() 和 __property():用于线程组之间传参。

      • __setProperty() 在线程组1中将属性及属性值放到测试计划的共享空间中;
      • __property()在线程组2中从共享空间中获取属性。

    至此,Jmeter的参数化实现方式就介绍完了,希望以后看到的时候不会迷糊!哈哈~~

    展开全文
  • 学习TensorFlow,TensorBoard可视网络结构参数

    万次阅读 多人点赞 2016-07-06 22:29:15
    针对这个问题,TensorFlow开发了一个特别有用的可视工具包:TensorBoard,既可以显示网络结构,又可以显示训练过程中各层参数的变化情况。本博文分为四个部分,第一部分介绍相关函数,第二部分是代码测试,第三...

    在学习深度网络框架的过程中,我们发现一个问题,就是如何输出各层网络参数,用于更好地理解,调试和优化网络?针对这个问题,TensorFlow开发了一个特别有用的可视化工具包:TensorBoard,既可以显示网络结构,又可以显示训练和测试过程中各层参数的变化情况。本博文分为四个部分,第一部分介绍相关函数,第二部分是代码测试,第三部分是运行结果,第四部分介绍相关参考资料。


    一. 相关函数

    TensorBoard的输入是tensorflow保存summary data的日志文件。日志文件名的形式如:events.out.tfevents.1467809796.lei-All-Series 或 events.out.tfevents.1467809800.lei-All-Series。TensorBoard可读的summary data有scalar,images,audio,histogram和graph。那么怎么把这些summary data保存在日志文件中呢?


    数值如学习率,损失函数用scalar_summary函数。tf.scalar_summary(节点名称,获取的数据)

    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    tf.scalar_summary('accuracy', accuracy)

    各层网络权重,偏置的分布,用histogram_summary函数

    preactivate = tf.matmul(input_tensor, weights) + biases
    tf.histogram_summary(layer_name + '/pre_activations', preactivate)

    其他几种summary data也是同样的方式获取,只是对应的获取函数名称换一下。这些获取summary data函数节点和graph是独立的,调用的时候也需要运行session。当需要获取的数据较多的时候,我们一个一个去保存获取到的数据,以及一个一个去运行会显得比较麻烦。tensorflow提供了一个简单的方法,就是合并所有的summary data的获取函数,保存和运行只对一个对象进行操作。比如,写入默认路径中,比如/tmp/mnist_logs (by default)

    merged = tf.merge_all_summaries()
    train_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/train', sess.graph)
    test_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/test')

    SummaryWriter从tensorflow获取summary data,然后保存到指定路径的日志文件中。以上是在建立graph的过程中,接下来执行,每隔一定step,写入网络参数到默认路径中,形成最开始的文件:events.out.tfevents.1467809796.lei-All-Series 或 events.out.tfevents.1467809800.lei-All-Series。

    for i in range(FLAGS.max_steps):
    if i % 10 == 0:  # Record summaries and test-set accuracy
    summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
          test_writer.add_summary(summary, i)
          print('Accuracy at step %s: %s' % (i, acc))
        else: # Record train set summarieis, and train
          summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
          train_writer.add_summary(summary, i)

    二. 代码测试

    # Copyright 2015 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the 'License');
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an 'AS IS' BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    # ==============================================================================
    
    """A simple MNIST classifier which displays summaries in TensorBoard.
    
     This is an unimpressive MNIST model, but it is a good example of using
    tf.name_scope to make a graph legible in the TensorBoard graph explorer, and of
    naming summary tags so that they are grouped meaningfully in TensorBoard.
    
    It demonstrates the functionality of every TensorBoard dashboard.
    """
    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    import tensorflow as tf
    
    from tensorflow.examples.tutorials.mnist import input_data
    
    
    flags = tf.app.flags
    FLAGS = flags.FLAGS
    flags.DEFINE_boolean('fake_data', False, 'If true, uses fake data '
                         'for unit testing.')
    flags.DEFINE_integer('max_steps', 1000, 'Number of steps to run trainer.')
    flags.DEFINE_float('learning_rate', 0.001, 'Initial learning rate.')
    flags.DEFINE_float('dropout', 0.9, 'Keep probability for training dropout.')
    flags.DEFINE_string('data_dir', '/tmp/data', 'Directory for storing data')
    flags.DEFINE_string('summaries_dir', '/tmp/mnist_logs', 'Summaries directory')
    
    
    def train():
      # Import data
      mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True,
                                        fake_data=FLAGS.fake_data)
    
      sess = tf.InteractiveSession()
    
      # Create a multilayer model.
    
      # Input placehoolders
      with tf.name_scope('input'):
        x = tf.placeholder(tf.float32, [None, 784], name='x-input')
        image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])
        tf.image_summary('input', image_shaped_input, 10)
        y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')
        keep_prob = tf.placeholder(tf.float32)
        tf.scalar_summary('dropout_keep_probability', keep_prob)
    
      # We can't initialize these variables to 0 - the network will get stuck.
      def weight_variable(shape):
        """Create a weight variable with appropriate initialization."""
        initial = tf.truncated_normal(shape, stddev=0.1)
        return tf.Variable(initial)
    
      def bias_variable(shape):
        """Create a bias variable with appropriate initialization."""
        initial = tf.constant(0.1, shape=shape)
        return tf.Variable(initial)
    
      def variable_summaries(var, name):
        """Attach a lot of summaries to a Tensor."""
        with tf.name_scope('summaries'):
          mean = tf.reduce_mean(var)
          tf.scalar_summary('mean/' + name, mean)
          with tf.name_scope('stddev'):
            stddev = tf.sqrt(tf.reduce_sum(tf.square(var - mean)))
          tf.scalar_summary('sttdev/' + name, stddev)
          tf.scalar_summary('max/' + name, tf.reduce_max(var))
          tf.scalar_summary('min/' + name, tf.reduce_min(var))
          tf.histogram_summary(name, var)
    
      def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
        """Reusable code for making a simple neural net layer.
    
        It does a matrix multiply, bias add, and then uses relu to nonlinearize.
        It also sets up name scoping so that the resultant graph is easy to read, and
        adds a number of summary ops.
        """
        # Adding a name scope ensures logical grouping of the layers in the graph.
        with tf.name_scope(layer_name):
          # This Variable will hold the state of the weights for the layer
          with tf.name_scope('weights'):
            weights = weight_variable([input_dim, output_dim])
            variable_summaries(weights, layer_name + '/weights')
          with tf.name_scope('biases'):
            biases = bias_variable([output_dim])
            variable_summaries(biases, layer_name + '/biases')
          with tf.name_scope('Wx_plus_b'):
            preactivate = tf.matmul(input_tensor, weights) + biases
            tf.histogram_summary(layer_name + '/pre_activations', preactivate)
          activations = act(preactivate, 'activation')
          tf.histogram_summary(layer_name + '/activations', activations)
          return activations
    
      hidden1 = nn_layer(x, 784, 500, 'layer1')
      dropped = tf.nn.dropout(hidden1, keep_prob)
      y = nn_layer(dropped, 500, 10, 'layer2', act=tf.nn.softmax)
    
    
      with tf.name_scope('cross_entropy'):
        diff = y_ * tf.log(y)
        with tf.name_scope('total'):
          cross_entropy = -tf.reduce_mean(diff)
        tf.scalar_summary('cross entropy', cross_entropy)
    
      with tf.name_scope('train'):
        train_step = tf.train.AdamOptimizer(
            FLAGS.learning_rate).minimize(cross_entropy)
    
      with tf.name_scope('accuracy'):
        with tf.name_scope('correct_prediction'):
          correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
        with tf.name_scope('accuracy'):
          accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
        tf.scalar_summary('accuracy', accuracy)
    
      # Merge all the summaries and write them out to /tmp/mnist_logs (by default)
      merged = tf.merge_all_summaries()
      train_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/train', sess.graph)
      test_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/test')
      tf.initialize_all_variables().run()
    
      # Train the model, and also write summaries.
      # Every 10th step, measure test-set accuracy, and write test summaries
      # All other steps, run train_step on training data, & add training summaries
    
      def feed_dict(train):
        """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
        if train or FLAGS.fake_data:
          xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)
          k = FLAGS.dropout
        else:
          xs, ys = mnist.test.images, mnist.test.labels
          k = 1.0
        return {x: xs, y_: ys, keep_prob: k}
    
      for i in range(FLAGS.max_steps):
        if i % 10 == 0:  # Record summaries and test-set accuracy
          summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
          test_writer.add_summary(summary, i)
          print('Accuracy at step %s: %s' % (i, acc))
        else: # Record train set summarieis, and train
          summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
          train_writer.add_summary(summary, i)
    
    def main(_):
      if tf.gfile.Exists(FLAGS.summaries_dir):
        tf.gfile.DeleteRecursively(FLAGS.summaries_dir)
      tf.gfile.MakeDirs(FLAGS.summaries_dir)
      train()
    
    if __name__ == '__main__':
      tf.app.run()
    


    三. 运行结果

    代码运行


    生成文件



    调用TensorBoard可视化运行结果

    tensorboard --logdir=/tmp/mnist_logs/train/
    


    打开链接 http://0.0.0.0:6006



    EVENTS是训练参数统计显示,可以看到整个训练过程中,各个参数的变换情况



    IMAGES输入和输出标签,省略


    GRAPH网络结构显示


    双击进去,可以显示更多的细节,包括右边的列表显示


    HISTOGRAM训练过程参数分布情况显示



    四. 参考资料

    如果你想了解更多信息,可以参考一下资料:

    https://www.tensorflow.org/versions/r0.9/how_tos/summaries_and_tensorboard/index.html

    https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/tensorboard/README.md

    https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py

    https://www.tensorflow.org/versions/r0.9/how_tos/graph_viz/index.html

    展开全文
  • 前文写了solidworks的参数化建模及workbench的导入这篇主要针对所建模型,做分析及后处理 1 在analysis systems里面,双击static structural,拖拽A2到B3 2 进入model,添加约束和载荷,对左边圆孔添加约束:...

    前文写了solidworks的参数化建模及workbench的导入这篇主要针对所建模型,做分析及后处理

    1 在analysis systems里面,双击static structural,拖拽A2到B3
    在这里插入图片描述
    2 进入model,添加约束和载荷,对左边圆孔添加约束:cylindrical support,对右边圆孔添加载荷:Bearing load,大小10N,方向,沿着x轴正方形,并对该力做参数化设置
    在这里插入图片描述
    ,
    在这里插入图片描述
    3 右击solution,点 total deformation,并在下方Details里面Results栏,最大变形量做参数化设置,之后在Geometry里面找到模型名称,将其质量参数化
    在这里插入图片描述
    在这里插入图片描述
    4 双击workbench中Parameters set,在outline of all Paramenters里面可以看到我们设置的所有输入参数和输出参数
    在这里插入图片描述
    5 回到workbench,Toolbox—Design Exploration—Response Surface(双击),双击C2,design of Experiments
    点击P1,P2可以看到,系统自动给他设置了大小范围
    在这里插入图片描述
    在这里插入图片描述
    6 Update all Design Points 得到分析结果在这里插入图片描述
    7 结果后处理
    可以得到
    (1)整体变形对设计点的关系曲线
    在这里插入图片描述
    (2)workbench—response surface—Response,得到等效应力的响应曲面图
    在这里插入图片描述
    在这里插入图片描述
    8 最后的变形云图
    在这里插入图片描述

    展开全文
  • 参数化查询原理

    千次阅读 热门讨论 2017-02-08 15:13:45
    机房重构敲组合查询时,会遇到多个操作符(+、-、*、/),因为之前在使用参数化查询时只要遇到给数据库赋值时就使用参数,(光知道这样能防止SQL注入,直到如今才知道它为什么能防止SQL注入)索性就把操作符也用成参数...

           机房重构敲组合查询时,会遇到多个操作符(+、-、*、/),因为之前在使用参数化查询时只要遇到给数据库赋值时就使用参数,(光知道这样能防止SQL注入,直到如今才知道它为什么能防止SQL注入)索性就把操作符也用成参数,但这时就报“语法错误”了,可是解决了很长时间,老以为是sql语句写错了(自我认为是那种丢掉一个空格或引号之类的错误),其实是没真正理解之前听到到“防SQL注入”的原理,或是说为什么能“防止SQL注入”


    一:参数化查询原理

           参数化查询是指在设计与数据库链接并访问时,在需要数值或数据的地方,使用参数来给值。即在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中有恶意的指令,由于已经编译完成,就不会被数据库运行。目前,参数化查询是最有效可预防SQL注入攻击的的防御方法。(虽为度娘所说,但这几句对我所遇到的问题的理解起到很大帮助和理解)


    二:实例解析

           就以我遇到的问题说来,我把“+、-、*、/”作为参数传进SQL语句中,这样是不对的

    起初我的SQL语句是这样的,  


    报如下错误:

                                               

    跟踪到链接数据库之前的sql语句是这样的:

                                               

          而标准的SQL语句是:select 列名 from 表名( where  列名  操作符  查询内容)

    而上面跟踪的sql语句中where条件里没有操作符(+、-、*、/)而是一个参数,所以该条SQL语句根本不符合sql语句的语法,即不是一条SQL语句


    SQL语句改为:


    跟踪到链接数据库之前的SQL语句是:

                                                 

    结果:

          这样就是一条标准的SQL语句了,所以此问题就这样解决了。(虽然列名还是参数,但只看该条语句是符合SQL语句标准的格式,在实际链接数据库时就给参数赋值了)


    三:防SQL注入

           其实参数化查询的作用主要有两点:

                  1:参数过滤

                  2:执行计划重用

           而防止SQL注入主要就是利用了执行计划重用

           即在链接数据库时给参数赋值时,重用了以前的执行计划,没有对SQL语句重新编译,也就没有重新执行语法解析,所以语句还是原来的结构,符合标准,只是用一个具体的值替换参数。

          其实这个问题的背后隐藏着很多知识:最重要的一条是:SQL SERVER接收到一条sql指令所做的工作:

           简单概括为:收到指令 -> 编译SQL生成执行计划 ->选择执行计划 ->执行执行计划。

           当 Sql Server 收到任何一个指令,包括:查询、批处理、存储过程、触发器、预编译指令和动态SQL Server语句,要完成语法解析、语义分析,然后再进行"编译",生成能够运行的"执行计划"。在编译的过程中,SQL Server 会根据所涉及的对象的架构、统计信息,以及指令的具体内容,估算可能的执行计划,以及它们的成本,最后选择一个SQL Server认为成本最低的语句。

          执行计划生成之后,SQL Server 通常会把它们缓存到内存里,术语统称它们叫“Plane Cache”。以后同样的语句执行,SQL Server就可以使用同样的执行计划,而无须再做一次编译。这种行为,叫做“重用”。但是有时候,哪怕是一模一样的语句,SQL Server 下次执行还是要再做一次编译。这种行为叫“重编译”。执行计划的编译和重编译都是要耗费资源的。

    详细讲解:http://blog.csdn.net/babauyang/article/details/7714211


    四:总结

          每个问题的的背后可能会有好多知识点,这些知识点不一定要都吃透,但要明白问题的根源,这样遇到同样原理的问题时才能在节省时间的前提下保质的解决问题,否则虽说此问题解决了,但遇到同样原理的问题时还是不知道如何解决,以此又得浪费好长时间来解决,出来混总是要还的。

    展开全文
  • Jenkins之参数化构建过程

    万次阅读 2017-08-25 17:03:34
    2. 设置位置  在这里,我们是通过“参数化构建过程”中添加“String Parameter”类型的环境变量,以此来传递“project-parent”项目名,并将该项目名通过Ant获取,并输出到日志文件中进行查看,以此来验证“参数化...
  • 一种做法是构建原来的结构,训练一套参数,训练上来的参数就是我用的参数,然后这套参数不够强烈,我不满意,或者用重参数化的方法来思考,就是我构建一个不一样的结构,然后训出另外一套参数,然后把这些参数给变成...
  • 关于solidworks+workbench的参数化建模分析的一点心得1

    千次阅读 热门讨论 2019-12-02 14:56:33
    刚刚接触solidworks的参数化建模,根据workbench操作手册14.0上面的结构优化-响应曲面,做了参数化建模 ,并利用workbench做后处理
  • Python unittest 实现参数化的几种方式

    千次阅读 2018-05-18 18:16:09
    Python unittest 理论上是不建议参数驱动的,其用例应该专注单元测试,确保每个method的逻辑正确。 引用Stack Overflow的一个答案, “单元测试应该是独立的,没有依赖项的。这确保了每个用例都有非常具体而专一的...
  • C# 使用参数化SQL语句

    万次阅读 热门讨论 2017-02-13 21:37:01
    在ADO.NET对象模型中执行一个参数化查询,需要向SqlCommand对象的Parameters集合添加SqlParameter对象。生成SqlParameter对象最简单的方式是调用SqlCommand对象的Parameters集合的AddWithValue方法。 这里又...
  • 1.参数化方法  参数化设计(Parametric)设计(也叫尺寸驱动Dimension-Driven)是CAD技术在实际应用中提出的课题,它不仅可使CAD系统具有交互式绘图功能,还具有自动绘图的功能。目前它是CAD技术应用领域内的一个...
  • 曲面参数化定义

    千次阅读 2017-02-14 21:53:02
    在计算机图形学中,曲面数据包括两方面:几何数据结构和纹理数据结构。几何数据结构一般是多面体三角网格,存储为...纹理贴图就是将二维纹理贴到三维曲面的过程,在数学上成为曲面参数化问题,即求从曲面到平面的一个光
  • 参数化设计的意义——Autodriver

    千次阅读 热门讨论 2018-03-15 13:34:50
    关键字:南京东岱 参数化设计 Autodriver什么是参数化?在参数化设计系统中,设计人员根据工程关系和几何关系来指定设计要求。要满足这些设计要求,不仅需要考虑尺寸或工程参数的初值,而且要在每次改变这些设计参数...
  • 三角网格参数化几种简单的方法比较三角网格参数化可归结为这样一个问题:给定一个由空间点集组成的三角网格和一个二维参数域。通常为平面或者球面。求一个参数域上的点 P∗iP_i^* 到网格上的点pip_i的一一映射。使得...
  • 这是个很好的方法,Ansys当然不可能不做这个功能,然后就搜索了一下如何实现在Solidworks中进行参数化建模,并在导入Ansys中后能识别出来吧。Solidworks中建模,出现尺寸参数的地方无非有两个地方:一个是草图中的...
  • 1.pytorch自定义网络结构不进行参数初始会怎样,参数值是随机的吗? 2.如何自定义参数初始? 先回答第一个问题 在pytorch中,有自己默认初始化参数方式,所以在你定义好网络结构以后,不进行参数初始也是...
  • pytorch自定义网络结构不进行参数初始会怎样?

    千次阅读 多人点赞 2018-08-14 17:07:15
    1) torch.nn.Conv2d的参数初始 https://pytorch.org/docs/stable/_modules/torch/nn/modules/conv.html#Conv2d Conv2d继承自_ConvNd,在_ConvNd中,可以看到默认参数就是进行初始的,如下图所示 2)torch...
  • 题外话:最近因为毕设的关系时间比较紧张...使用现有算法的Tensorflow代码,希望看到网络的可视化结构,怎么办? 官方答案: Tensorboard可视化官方文档 快速方法: 网上找了很多资料都会索引回Tensorflo
  • Power Query 系列 (18) - 参数化查询

    千次阅读 2019-09-20 17:25:09
    参数化查询增加了查询的灵活性。Power Query 可以设置和管理参数,同一工作簿下所有查询都可以使用。
  • 更值得注意的一点是,还不需要将数据表拉进edmx文件中,把要移植的sql语句直接搬过去,参数传进去就可以了,也可谓省时省力;当然我们要根据实际需要自定义一下结果实体类。现把示例代码贴出来,时间考虑,直接贴的...
  • spark udf传入复杂结构参数

    千次阅读 2018-07-03 23:42:54
    笔者在使用LSH 获取相似文本时,遇到返回的Dataframe的结果比较复杂,如下:现在想使用UDF函数处理datasetA和datasetB的内容,但是由于数据结构复杂,无法直接写参数,所以需要使用Row,代码如下: val getIdFun = ...
  • 我们可以很清楚的从跳连结构示意图中看到,加入了跳连结构之后,并没有增加模型的参数量,尽管它改变了网络结构。 从ResNet的网络结构中我们可以发现,它在一开始时设置卷积核大小为7 7,这是因为一开始的时候我们...
  •  上面说到,岭回归是在结构风险最小的正则因子上使用模型参数向量的二范数形式。那么,如果使用一范数形式,那就是lasso回归了。lasso回归相比于岭回归,会比较极端。它不仅可以解决过拟合问题,而且可以在参数...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    所以这个选项当然没有时间参数,但是可以输入一个用来解释的讯息,而这信息将会送到每位使用者。 -F:在重启计算机时强迫fsck。 -time:设定关机前的时间。 -m: 将系统改为单用户模式。 -i:关机时显示系统...
  • 轻量网络结构——SqueezeNet

    千次阅读 2018-09-12 22:53:03
    amp;lt;0.5MB model size》 UC Berkely 和 Stanford ...1.相同准确率下,更少参数量的模型有几点好处: 1)更加高效的分布式训练 2)向客户端提供新模型的开销更小 3)FPGA和嵌入式设备部署更便利 ...
  • 5G NR基础参数及帧结构

    万次阅读 多人点赞 2019-07-31 16:42:39
    本篇主要讲述5G的基础知识——基础参数及帧结构 1、子载波间隔: 我们知道LTE中子载波间隔是固定的15kHz,但NR中采用了更加灵活的子载波间隔,如下表: 我们可以把它叫做numerology(参数集),也就是说NR中有5...
  • JVM_虚拟机目录

    万次阅读 多人点赞 2019-06-28 11:44:22
    1. 类加载的生命周期 ...初始[initialization]:JVM会按照初始语句在类文件中的先后顺序执行 2. 加载 在VM [ JVM ] option中添加 java命令执行可以实现追踪类加载过程信息的参数 -XX:+TraceClassLoadin...
  • QTP常用的几种参数化

    万次阅读 2012-12-11 15:48:12
    本次主要介绍下qtp的各种参数化方法和很多人在参数化时候容易犯的几个错误。  很多人最初接触参数化的时候都是从利用datatable的Global表参数化开始的。因为那是操作实现起来最简单的参数化,但同时也是误导和制约...
  • Jmeter(三)-简单的HTTP请求(参数化)

    万次阅读 2014-09-19 16:17:42
    先添加第一个请求,第二个请求我使用参数化URL的方法来进行( 试试在path中参数化能不能成功 ,分析了上面2个请求,域名都是相同的,唯独不同的只有后面的URL) 然后添加聚合报告(Aggregate Report)和...
  • Pytorch网络结构可视

    千次阅读 2019-06-15 20:39:16
    安装 可以通过以下的命令进行安装 pip install graphviz pip install torch torchvision pip install tensorwatch 载入库 import sys import torch ...网络结构可视 model = torchvision...
  • 花一天时间整理【国民经济行业分类(GB/T 4754-2011)】,将其整理成树形结构数据 一、Excel中整理数据 二、数据库中数据 三、最终界面参数字典展示 相关Excel、数据下载

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,489,797
精华内容 595,918
关键字:

参数化结构