JDBC 在性能测试中的应用

jmeter使用之jdbc连接 01.jdbc连接使用场景 jdbc简介 jdbc指java数据库连接,说白了就是数据库的一个驱动,可以让你的程序连接到数据库,所以当我们jmeter想要直接操作到数据库的话,那么就需要配置jdbc连接。 jdbc驱动包可以在mysql官网下载。 https://downloads.mysql.com/archives/c-j/ 使用场景: 1:企业运维在生产发现一些耗时较大的sql,需要测试这边去配合测试下这条语句的性能。 2:测试人... 阅读详情

前言

Cloud Native

我们能否绕开 http 协议,直接测试数据库的性能?是否觉得从数据库中导出 CSV 文件来构造压测数据很麻烦?怎样在压测结束后做数据清理?能不能通过数据库中的插入(删除)记录对压测请求做断言?使用阿里云性能测试工具 PTS 可以轻松解决上述问题。

什么是 JDBC

Cloud Native

JDBC(Java DataBase Connectivity,Java 数据库连接)是一种用于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。JDBC 提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

简单地说,JDBC 可做三件事:与数据库建立连接、发送操作数据库的语句并处理结果。

JDBC 的设计原理

Cloud Native

1

整体架构

JDBC 制定了一套和数据库进行交互的标准,数据库厂商提供这套标准的实现,这样就可以通过统一的 JDBC 接口来连接各种不同的数据库。可以说 JDBC 的作用是屏蔽了底层数据库的差异,使得用户按照 JDBC 写的代码可以在各种不同的数据库上进行执行。那么这是如何实现的呢?如下图所示:

JDBC 定义了 Driver 接口,这个接口就是数据库的驱动程序, 所有跟数据库打交道的操作最后都会归结到这里 ,数据库厂商必须实现该接口,通过这个接口来完成上层应用的调用者和底层具体的数据库进行交互。Driver 是通过 JDBC 提供的 DriverManager 进行注册的,注册的代码写在了 Driver 的静态块中,如 MySQL 的注册代码如下所示:

static {

        try {

            java.sql.DriverManager.registerDriver(new Driver());

        } catch (SQLException E) {

            throw new RuntimeException("Can't register driver!");

        }

    }
作为驱动定义的规范 Driver,它的主要目的就是和数据库建立连接,所以其接口也很简单,如下所示:
public interface Driver {

  //建立连接

    Connection connect(String url, java.util.Properties info)

        throws SQLException;

    boolean acceptsURL(String url) throws SQLException;

    DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info)

                         throws SQLException;

    int getMajorVersion();

    int getMinorVersion();

    boolean jdbcCompliant();

    public Logger getParentLogger() throws SQLFeatureNotSupportedException;

}

作为 Driver 的管理者 DriverManager,它不仅负责 Driver 的注册/注销,还可以直接获取连接。它是怎么做到的呢?观察下面代码发现,实际是通过遍历所以已经注册的 Driver,找到一个能够成功建立连接的 Driver,并且将 Connection 返回,DriverManager 就像代理一样,将真正建立连接的过程还是交给了具体的 Driver。

for(DriverInfo aDriver : registeredDrivers) {

            // If the caller does not have permission to load the driver then

            // skip it.

            if(isDriverAllowed(aDriver.driver, callerCL)) {

                try {

                    println("    trying " + aDriver.driver.getClass().getName());

                    Connection con = aDriver.driver.connect(url, info);

                    if (con != null) {

                        // Success!

                        println("getConnection returning " + aDriver.driver.getClass().getName());

                        return (con);

                    }

                } catch (SQLException ex) {

                    if (reason == null) {

                        reason = ex;

                    }

                }




            } else {

                println("    skipping: " + aDriver.getClass().getName());

            }




        }

2

Connection 设计

通过上节我们知道数据库提供商通过实现Driver接口来向用户提供服务,Driver接口的核心方法就是获取连接。Connection是和数据库打交道的核心接口,下面我们看看它的设计方案。

通过观察设计图我们发现主要有两类接口:DataSource 和 Connection。下面我们逐一进行介绍。

  • DataSource

直接看源码,如下所示,发现它的核心方法竟然和 Driver 一样,也是获取连接。那为什么还要 DataSource 呢?Driver 本身不就是获取连接的吗?下面我们就看看 DataSource 到底是怎么获取连接的。

 public interface DataSource  extends CommonDataSource, Wrapper {

  Connection getConnection() throws SQLException;

  Connection getConnection(String username, String password)

    throws SQLException;

}

然而我们发现 JDBC 只定义了 DataSource 的接口,并没有给出具体实现,下面我们就以 Spring 实现的 SimpleDriverDataSource 为例,来看看它是怎么做的,代码如下所示,发现 DataSource 的 getConnection(...)方法,最后竟然还是交由 driver.connect(...)去真正建立连接。所以又回到最开始我们所描述的, Driver 才是真正的与数据库打交道的接口。

protected Connection getConnectionFromDriver(Properties props) throws SQLException {

        Driver driver = getDriver();

        String url = getUrl();

        Assert.notNull(driver, "Driver must not be null");

        if (logger.isDebugEnabled()) {

            logger.debug("Creating new JDBC Driver Connection to [" + url + "]");

        }

        return driver.connect(url, props);

    }

那么问题来了,为什么还需要 DataSource 这样的接口,岂不多此一举么?显然不会。DataSource 是加强版的 Driver。它将核心的建立连接的过程交由 Driver 执行,而对于建立缓存,处理分布式事务和连接池等看似与建立连接无关的事情自己来处理。如类的设计图所示,以 PTS 使用的 Druid 连接池为例:

  • ConnectionPoolDataSource:连接池的实现,此数据源实现并不直接创建数据库物理连接,而是一个逻辑实现,它的作用在于池化数据库物理连接。
  • PooledConnection:配合 ConnectionPoolDataSource,由它获取一个池化对象 PooledConnection,再通过该 PooledConnection 间接获取到物理连接。

显然,通过连接池我们可以从连接的管理中抽身,提高连接的利用效率,也能提升压力机的施压能力。

3

Statement 设计

建立连接之后,用户可能要开始写 SQL 语句,并且交由数据库去执行了。这些是通过 Statement 来实现的。主要分为:

  • Statement:定义一个静态的 SQL 语句,数据库每次执行都需要重新编译,一般用于仅执行一次查询并返回结果的情形。
  • PreparedStatement:定义一个带参的预编译的 SQL 语句,下次执行时,会从缓存中取出遍以后的语句,而不需要重新编译一遍,适用于执行多次相同逻辑的 SQL 语句,当然它还有防 SQL 注入等功能,安全性和效率较高,使用比较频繁。对于性能测试来说,选择 PreparedStatement 最为合适。
  • CallableStatement:用来调用存储过程。

4

ResultSet 设计

JDBC 使用 ResultSet 接口来承接 Statement 的执行结果。ResultSet 使用指针的方式(next())来逐条获取检索结果,当指针指向某条数据时,用户可以自由的选择获取某一列的数据。PTS 通过将 ResultSet 转化成 CSV 文件,辅助用户以一条 SQL 语句,构造复杂的压测数据。

5

JDBC 架构总结

通过上面的介绍我们发现,JDBC 的设计还是层次感分明的。

(1)Driver 和 DriverManager 是面向数据库的,设计了一套 Java 访问数据的规范,数据库厂商只需要实现这套规范即可;

(2)DataSource 和 Connection 是面向应用程序开发者的,它们不关心 JDBC 具体是如何跟数据库进行交互的,通过统一的 DataSource 接口就可以拿到 Connection,用户的数据操作都可以通过这个 Connection 来实现了;

(3)Statement 承载了具体的 SQL 命令,用户可以定义不同的 Statement 来向数据库发送指令;

(4)ResultSet 是用来承载 SQL 命令的执行结果。

至此,完成了 加载驱动 -> 建立连接 -> 执行命令 -> 返回结果 这样的和数据库交互的整个过程。如果把这个过程灵活的嵌入到 PTS 性能测试中,便可以解决前言提到的各种问题。

JDBC 在性能测试中的应用

Cloud Native

1

数据库性能测试

  • 背景

大多数对数据库的操作都是通过 HTTP、FTP 或其他协议执行的,但是在某些情况下,绕开中间协议直接测试数据库也很有意义。例如我们希望不触发所有相关查询,而只测试特定 high-value 查询的性能;验证新数据库在高负载下的性能。2.验证某些数据库连接池参数,例如最大连接数 3.节省时间和资源。当我们想要优化 SQL 时,修改代码中的 SQL 语句和其他数据库操作非常繁琐,通过 JDBC 压测,我们可以避免侵入代码,集中精力在 SQL 调优上。

  • 步骤

1、创建场景。 我们在 PTS 控制台的【压测中心】->【 创建场景 】中创建 PTS 压测场景;

2、场景配置。PTS 支持对 MySQL、PostgreSQL 等四种数据库发起压测。用户填写 JDBC URL、用户名、密码和 SQL 即可发起压测。同时,PTS 还支持提取 ResultSet 中的数据作为出参,给下游 API 使用;对响应进行断言。

3、压测中监控和压测报告。PTS 支持绑定阿里云 RDS 云资源监控,在压测过程中观察 RDS 实时性能指标。此外,PTS 还提供清晰完备的压测报告以及采样日志,供用户随时查看。

2

压测数据构造

  • 背景

在模拟不同用户登录、压测业务参数传递等场景中,需要使用参数功能来实现压测的请求中各种动态操作。如果使用传统的 CSV 文件参数,会受到文件大小的限制,且手动创建耗费精力。使用 JDBC 来构造压测数据,可以避免以上问题。

  • 步骤

1、 添加数据源。 在场景编辑-数据源管理中,选择添加 DB 数据源,输入 URL、用户名、密码和 SQL。

2、添加参数。填写自定义参数名和列索引。

3、调试验证。点击调试场景,即可验证提取的结果集是否符合预期。接着,我们就可以在任意想要使用参数的
地方使用${}引用即可。

3

压测脏数据清理

  • 背景

针对写请求的压测,会在数据库中生成大量脏数据。如何在压测结束后自动清理?

  • 步骤

PTS 给用户提供了解决方案。PTS 支持对串联链路作逻辑上的顺序编排,即前置链路、普通链路和后置链路。执行顺序由先到后。设置某条串联链路为后置链路,填写循环次数即可。

Java的JDBC连接池底层封装 目录一、JDBC回顾1.1 六个基本步骤1.2 问题的引出二、ORM框架三、JDBC连接池性能优化3.1 JDBC连接池在创建连接时优化3.2 将连接(桥梁)和状态进行绑定1、MyConnection3.3 设计连接池用于装连接1、ConnectionPool四、JDBC连接池性能的测试五、将JDBC整体优化5.1 问题的产生5.2 问题解决方案1、单例的连接池对象2、添加配置文件3、多个人同时访问4、防止多余的线程出现null5、代理模式(1)静态代理模式(2)缺省适配器模式5.3 完整的JDBC封装代码 阅读详情

相关推荐

全栈性能测试-- -14数据库JDBC协议接口项目实战

数据库JDBC协议接口项目实战 tcp/ip协议是传输层的 操作的时候,需要服务端先启一下服务 1.JDBC协议接口简介 一般是测数据库的 最简单的项目架构 pc端发送一个请求<=======>应用服务器(Tomcat)<======>数据库db 请求的传输时间:N1+N2+N3+N4 nginx是负载均衡 2.Jmeter配置JDBC接口 Jmeter测试数据库,就是跳过业务层了 并发某一个sql语句 需要JDBCjar包,也是放在lib的ext里面 上面的只是连

初遇我ㄖ寸の热情呢? 7674

jmeter性能测试---数据库压测_JDBC的应用

数据库压测其实就是多一步连接JDBC数据的操作 1)添加并配置连接一下JDBC Connection Configuration 2)添加JDBC请求 3)线程配置各种压测情况和添加各种监控组件: ...

paidaxing_dashu的博客 252

jmeter性能测试之实战项目~JDBC

待补充

shitou987的博客 426

软件测试性能测量参数,性能测试时需关注应用中间件27个指标和参数

本文介绍在性能测试的时候,需要关注应用中间件的哪些参数或指标。任何涉及到性能的事情,都离不开监控,本文还将介绍应用中间件WAS的监控方法。应用中间件需关注的指标介绍在性能测试的时候,需要关注应用中间件的哪些参数或指标。本文以WAS为例,但实际上,概念都是一样的。Web应用程序1 概念应用服务器提供Web服务(接收请求,返回应答),关注其服务的能力,包括响应时间、错误的比例、吞吐量等等。2 关注指标...

weixin_42318030的博客 1300

CoppeliaSim学习笔记(1):建立Python脚本与CoppeliaSim的连接

CoppeliaSim学习笔记,建立python和CoppeliaSim的连接,实现联调。

qq_22487889的博客 1万+

车载以太网抓包实战:100BASE-T1/1000BASE-T1高效监控方案解析

本文深入解析了车载以太网100BASE-T1/1000BASE-T1的高效抓包监控方案。针对智能汽车开发中的故障排查与性能测试需求,详细对比了交换机镜像、TAP分流和捕获模块三大主流方案的原理、核心优势与适用场景,并提供了基于实战经验的选型指南与操作避坑要点,帮助工程师精准定位网络问题。

desk3的博客 429

JDBC处理器和BeanShell取样器的组合应用

转载地址:http://www.cnblogs.com/youngchance/p/5176930.html 序言:     一日做性能测试,遇到一个页面上的数据提取,一开始想着用正则表达式不就提取出来了。后来仔细一想不对,单一提取貌似还能凑合,动态不定个数的提取,又是拼接的,正则貌似写不出来,即使能写出来估计也是恶心的要死。仔细一看,这不就是数据库里面的东西吗?直接从数据

可口可乐的博客 1110

手把手配置:用Synopsys VDK为英飞凌TC4x系列MCU做虚拟原型开发

本文详细介绍了如何使用Synopsys VDK为英飞凌TC4x系列MCU进行虚拟原型开发,涵盖开发环境搭建、关键外设虚拟化配置、AUTOSAR栈集成及虚拟调试与性能调优全流程。通过虚拟原型技术,开发者可提前6-12个月启动软件开发,显著提升汽车电子项目的开发效率。

weixin_30606461的博客 292

借助RESTful接口,TDengine的JDBC驱动可跨平台,而且不用为升级发愁了

随着TDengine-2.0.14.0版本的发布,我们在这个版本中为JDBC Connector添加了一种新的实现:JDBC-RESTful。它内部使用RESTful接口, 而不是taosc连接TDengine服务器,这样能够跨平台,不仅在Linux, Windows, 在Mac上都能开发TDengine应用了。特别的是,你也不用担心升级TDengine需要同步升级客户端了。 01 使用JDBC-RESTful的好处 1.实现TDengine跨平台应用开发 之前,由于TDengine的JDBC驱动依赖本.

涛思数据 8908

STC51单片机串口多字节数据接收的优化策略

本文深入探讨了STC51单片机串口多字节数据接收的优化策略。针对数据丢包、粘包等常见痛点,核心思路是采用“缓冲队列+定时器超时”模式,将实时处理转变为“先收纳,后处理”。文章详细讲解了硬件初始化、中断服务程序优化(快速入队与激活超时裁判)以及主循环的非阻塞设计,并进阶介绍了环形缓冲区实现与错误处理,旨在构建稳定可靠的串口通信系统。

weixin_29264201的博客 374

rockchip rk3566 android11 网口log报错: DMA engine initialization failed

问题描述:上电初始化前将网口插入,然后上电初始化网口能够正常使用,且能够找到PHY,ifconfig 查看能够有eth0 产生,网口正常使用且能够热插拔,但上电初始化时,不插入网口,就会报DMA engine initialization failed 错误,DMA 初始化的时候出错了。 分析:一般产生这个问题可以认为是GMAC 的工作时钟出问题了。先测量时钟引脚是否有时钟,时钟频率以及幅度等指标是否正常,主要确认以下几个方面: 1.IOMUX 出错,检查时钟脚寄存器值是否正确。 2.时钟方向以及配置

qq_48709036的博客 2万+

高级性能测试系列《24. 通过jdbc执行sql脚本》

目录一、JDBC(JavaDataBaseConnectivity)1.jdbc:java调用数据库的。2.怎么找jar包?3.mysql版本8与mysql版本5.7的jar包有差异吗?二、写脚本1.添加配置元件--JDBC Connection Configuration。2.jdbc request三、注意一、JDBC(JavaDataBaseConnectivity...

清菡的博客 1298

(一)激光线扫描-三维成像原理

激光线扫描是一种使用激光作为光源,通过特定的扫描设备(如光学镜头、电机驱动的镜头或电子扫描设备)将激光束引导到目标表面,并按照预定的路径进行扫描的技术。这种技术通常用于测量、检测、打印、切割等多种应用中。

FlyWine的博客 3634

JDBC、JDBCTemplate、MyBatis、Hiberante 比较

  JDBC (Java Data Base Connection,java数据库连接) JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序 优点:...

心神沫沫的收藏 1412

Pytorch实现之SRGAN+CBAM的结构设计

在SRGAN的残差连接中加入了CBAM注意力机制,同时设计了四类损失来训练。

LJ1147517021的博客 573

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

【性能测试面试题】请分享一下数据库在JMeter性能测试中的运用

最后,如果要对数据库进行优化的话,也可以从“数据库索引优化”、“数据库配置调整”、“SQL 语句优化”这写方面进行着手,通过在 Jmeter 中巧妙运用数据库性能测试,我们能够更全面、深入地评估系统性能,提前发现并解决数据库层面的性能瓶颈,为打造高效、稳定的软件系统奠定坚实基础。

hlsxjh的博客 563

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JDBC Driver for ORACLE

    我们知道SUN定义的JDBC Driver有四种类型:Type1 JDBC-ODBC桥、Type2 JAVA to Native API、Type3 Java to net 、Type4 JAVA to native dababase;对于我们开发人员来说,了解他们的异同是非常必要的,尤其是在做纯后台高性能项目时(注:受最近纯后台项目的折磨而感想,不得不考虑JAVA如何满足高并发、高性能)...

zhangfenglin的专栏 319

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《JMeter JDBC 请求实战宝典》

宝子们,今天咱就来唠唠 JMeter 里超厉害的 JDBC 请求,这玩意儿就像是数据库世界的神奇魔杖,能帮咱把数据库里的各种秘密(数据)都挖出来,还能对这些数据进行各种操作,不管是查查看、改一改,还是加点新东西、删点旧东西,它都能轻松搞定,而且还能告诉咱数据库在这些操作下是不是够 “给力”,性能咋样。接下来,咱就一步一步揭开它的神秘面纱。

测试指南 1100

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JDBC Connection Configuration & JDBC Request 详解

JDBC Connection Configuration & JDBC Request Jmeter同样可以测试数据库的性能,通过执行增删改查的语句,以下举的是oracle的例子 Step 1: 下载ojdbc14.jar包放到Jmeter lib包中 或 在test plan中配置(二者均可),并且重启Jmeter Step 2:配置JDBC Connection Configu

小白裸奔 1万+
上一篇: 在 Pisa-Proxy 中,如何利用 Rust 实现 MySQL 代理
下一篇: 图解 Kafka 网络层实现机制之上篇
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值