精华内容
下载资源
问答
  • oracle数据库写入数据的过程

    千次阅读 2017-10-22 23:22:41
    oracle数据库写入数据的过程

    各种后台进程的作用:

    Ckpt、lgwr、dbwn之间的协作。

    Ckpt:每隔3秒或更频繁写一次,写入控制文件,记录DBWN从SGA写入磁盘的块的位置。

    LGWR:每3秒,1/3满buffer,commit,DBWN写之前。将buffer中数据写入物理文件。

    DBWN:将SGA中脏块写入datafile。

     Oracle 写入数据过程:

    Oracle 写数据过程:dml操作一执行,首先在redo buffer中记录语句,在buffer cache中执行更改,修改数据块。然后LGWR进程根据上述规则,将redo buffer中的信息写入到物理文件。此过程比较快(redo log为连续写)。完成后,DBWN会将buffer cache中脏数据块对应的原始数据,复制到undo表空间,然后更新数据。(随机写,比较慢)。期间ckpt进程根据3秒的原则,作检查点,记录哪些脏 数据库写到了data file中(这里的检查点为增量检查点,并不是完全将脏数据写完,只是在控制文件中记录写到哪里了。)。将需要的信息记录在控制文件中。若实例崩溃或需要 错误恢复,从检查点位置以后的redo需要重新应用到datafile(常说的redo过程,前滚)。此时根据事务是否提交了,未提交的事务,根据 undo表空间的数据进行恢复(常说的undo,后滚操作)

     另一位网友的介绍:

    1、事务开始;

    2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;

    3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;

    4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;

    5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。

     

    附:checkpoint 由ckpt进程触发oracle进行checkpoint动作,将data buffer中的脏块(已经写在redo里记录但是没有写到datafile里的)的内容写入到data file里并释放站用的空间,由dbw后台进程完成,并修改controlfile和datafile的scn.
    一般手工执行(alter system checkpoint)是由于要删除某个日志但是该日志里还有没有同步到data file里的内容,就需要手工check point来同步数据,然后就可以drop logfile group n.

    展开全文
  • 文档描述了怎样将kepserver采集到的数据写入到sql数据库中的关键步骤
  • 3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中; 4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中; 5、当发生checkpoint,CKPT进程更新所有数据文件.....

    1、事务开始;

    2、在buffer cache中找到需要的数据块,如果没有找到,则从数据文件中载入buffer cache中;

    3、事务修改buffer cache的数据块,该数据被标识为“脏数据”,并被写入log buffer中;

    4、事务提交,LGWR进程将log buffer中的“脏数据”写入redo log file中;

    5、当发生checkpoint,CKPT进程更新所有数据文件的文件头中的信息,DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。

    转载于:https://www.cnblogs.com/yaodidi/p/7833153.html

    展开全文
  • 数据库写入性能优化

    千次阅读 2015-05-09 21:25:56
    数据库写入性能优化标签(空格分隔):数据库 java sqlserver数据库写入性能优化 两个实例 example1 example2 Statement PreparedStatement 关闭自动提交 感谢 两个实例最近因为比赛缘故,频繁使用java操作数据库,...

    数据库写入性能优化

    标签(空格分隔):数据库 java sqlserver



    两个实例

    最近因为比赛缘故,频繁使用java操作数据库,由于要写入的数据量比较庞大(大约100w左右),故往数据库里写入数据的性能一直不能令人满意(简直就是慢的飞起)。最近两天一直在研究如何提高数据库的写入性能,初步有点成果。(百度了好长时间一点成果都没有,结果Google分分钟给搞定,看来梯子没白买)所以写个博客分享一下这几天的优化历程,也许优化还不是很到位,还请不吝赐教。好了,废话不多说,先来看一下我一开始的代码。

    example1

    public void example1()
        {
            DatabaseOp.createDatabase("test"); // 建立数据库test
    
            String columLable = "id int, value int";
            DatabaseOp.createTable("example1", columLable, "test"); // 建立表exanple1
    
            DbConntion dc = new DbConntion("test");
            Connection con = dc.getConnection(); // 获取连接
            Statement stmt = null;
            try
            {
                stmt = con.createStatement();
    
                //总共100w数据,分十次,每次10w行插入
                for (int i = 0; i < 10; i++)
                {
                    long startTime = System.currentTimeMillis();
    
                    for (int j = 0; j < 100000; j++)
                    {
                        StringBuffer insertSQL = new StringBuffer(
                                "INSERT INTO example1 VALUES ( ").append(j + 1)
                                .append(",").append(j).append(" );");
                        stmt.executeUpdate(insertSQL.toString());
                    }
    
                    long endTime = System.currentTimeMillis();
    
                    System.out.println("Total Time: " + (endTime - startTime)/1000 + "s");
                }
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
        }

    输出内容:

    Total Time: 100s

    由于速度太慢,还没有完全执行完我就终止了程序,上面的输出应该只是插入了10w条数据的时间,已经是一分多钟了。

    example2

    下面再看另一个例子:

        public void example2()
        {
            String columLable = "id int, value int";
            DatabaseOp.createTable("example2", columLable, "test"); //在数据库test中创建表example2
    
            DbConntion dc = new DbConntion("test");
            Connection mcon = dc.getManualCommitConnection();//获取连接 注意 这里与example1中不同
            PreparedStatement pstmt = null;
            try
            {
                pstmt = mcon.prepareStatement("INSERT INTO example2 VALUES (?,?)");
    
                //这里也是共100w条数据,分10次,每次10w条写入数据库
                //这里与example1中方法不同
                for(int i = 0; i < 10; i++)
                {
                    long startTime = System.currentTimeMillis();
    
                    for(int j = 0; j < 100000; j++)
                    {
                        pstmt.setInt(1, j+1);
                        pstmt.setInt(2, j);
                        pstmt.executeUpdate();
                    }
                    mcon.commit();
    
                    long endTime = System.currentTimeMillis();
                    System.out.println("Total Time: " + (endTime - startTime)/1000 + "s");
                }
            }
            catch(SQLException e)
            {
                e.printStackTrace();
            }
        }
    

    这次的输出结果如下:

    Total Time: 10s
    Total Time: 7s
    Total Time: 8s
    Total Time: 8s
    Total Time: 7s
    Total Time: 8s
    Total Time: 8s
    Total Time: 8s
    Total Time: 8s
    Total Time: 7s

    速度简直是差了简直有10倍,这其中的奥妙便是StatementPreparedStatement的差异了。

    Statement && PreparedStatement

    首先,对于经常跟jdbc打交道的程序猿就应该总是使用PreparedStatement而不是使用Statement,主要是基于以下原因:

    1. PreparedStatement作为Statement的子类,继承了Statement的所有方法,并且还重写了execute,executeUpdate,executeQuery方法,可以不带参数更方便的调用。

    2. PreparedStatementStatement的效率更高。因为PreparedStatement会先将SQL语句预编译,并在数据库服务器中缓存下来,遇到语法相同的SQL语句即不用编译直接执行就可以(类似是函数)。而Statement由于每次执行时的语句很难相同,很难匹配到相同的,因而需要几乎每次编译–>执行,效率降低。

    3. PreparedStatementStatement语法上更简洁清晰。比如example2中的SQL语句

    pstmt = mcon.prepareStatement("INSERT INTO example2 VALUES (?,?)");
    pstmt.setInt(1, j+1);
    pstmt.setInt(2, j);
    pstmt.executeUpdate();

    PreparedStatement使用的SQL语句中可以使用?充当参数占位符,并提供了SetXXX()方法用来填充参数。
    对比一下example1中的语法:

    StringBuffer insertSQL = new StringBuffer("INSERT INTO example1 VALUES ( ").append(j + 1).append(",").append(j).append(" );");
    stmt.executeUpdate(insertSQL.toString());

    这样的语法不仅难看,而且很难看懂,我想谁看这种代码都不会有好心情的。


    1. PreparedStatementStatement更安全,这一点我不是很懂。还是直接上引用比较好。

    即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道.
    String sql = “select * from tb_name where name= ‘”+varname+”’ and passwd=’”+varpasswd+”’”;
    如果我们把[’ or ‘1’ = ‘1]作为varpasswd传入进来.用户名随意,看看会成为什么?

    select * from tb_name = ‘随意’ and passwd = ” or ‘1’ = ‘1’;
    因为’1’=’1’肯定成立,所以可以任何通过验证.更有甚者:
    把[‘;drop table tb_name;]作为varpasswd传入进来,则:
    select * from tb_name = ‘随意’ and passwd = ”;drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.

    而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

    关闭自动提交

    正如看到的那样,example1example2中获取数据库连接的方式并不一样。
    example1中的是

    Connection con = dc.getConnection(); // 获取连接

    example2中的是

    Connection mcon = dc.getManualCommitConnection();//获取连接 注意 这里与example1中不同

    这其中,getConnection()的代码是

        public Connection getConnection()
        {
            Connection connection = null;
            try
            {
                Class.forName("net.sourceforge.jtds.jdbc.Driver");
                connection = DriverManager.getConnection(this.getConnectionUrl(),
                        this.userName, this.passWord);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            return connection;
        }

    getManualCommitConnection()的代码是

        public Connection getManualCommitConnection()
        {
            Connection con = this.getConnection();
    
            try
            {
                con.setAutoCommit(false);//关闭自动提交
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
    
            return con;
        }

    getManualCommitConnection()调用了getConnection()并关闭了获取到的连接的自动提交。这意味着当你在一个Connection上执行了SQL语句后,SQL语句并不会立即就被发送到数据库服务器执行,而是需要手动调用Connection.commit()方法一次性提交到服务器。不言而喻,这样会减少网络通信流量并且在一定程度上保证操作数据库时的安全性。

    感谢

    作为一个刚接触数据库的新手,能够找到一个合适的方法解决手头的问题得到了别人的帮助自然不言而喻,当然,这篇博文也并非全部是我原创,写作过程中也是参考了他人的博客,在此列出曾经浏览过的博客和网页,感谢他们的分享并希望有相同疑惑的人能够得到更多的帮助。

    当然,也多亏了买的梯子能够让我找到MSDNStackOverFlow上的问题,才了解了这些东西(百度根本没百度到!)。

    当然,作为一个新人,这篇博客写的难免有些深度不够,相信只要坚持下去,我也可以分享给大家有深度有思考的技术。

    感谢你能耐心看到这里。如有错误,还请不吝赐教。

    展开全文
  • Python操作数据库写入CSV文件

    千次阅读 2018-09-11 18:03:40
    在做APP自动化测试数据进行分离的时候,需要将数据库的瓶码数据获取到,然后再传入接口,我在网上边学边做花了两天的时间终于,弄成了理想的样子。在这里记录自己的学习过程。 二、环境 Python3.6 MySQL-...

    一、背景
    在做APP自动化测试数据进行分离的时候,需要将数据库的瓶码数据获取到,然后再传入接口,我在网上边学边做花了两天的时间终于,弄成了理想的样子。在这里记录自己的学习过程。
    二、环境
    Python3.6
    MySQL-Navicat(验证SQL语言是否写正确)
    用到的库:
    import pymysql
    import csv
    三、代码解析

    # -*- coding: utf-8 -*-
    import Common.configDB #这里我对数据库操作进行了封装
    import csv
    
    DB = Common.configDB.MyDB()
    #定义文件路径
    file = "E:\python\Factory_AppTest1\Factory_AppTest\code.csv"
    
    with open(file, 'w+', newline='') as csv_file:#newline=''是为了避免出现空格
        write = csv.writer(csv_file, dialect='excel')
        #写入瓶码
        #以托盘出库方式写入产品ID为7的瓶码
        sql = "SELECT t1.packing_info_id,t1.code,t1.inside_code,t1.flag,t2.product_id FROM t_packing_list t1," \
        "(SELECT p2.logistics_id,p1.surplus_amount,p2.id,p2.packing_epc,p1.product_id FROM " \
        "(SELECT * FROM t_logistics_cell_info WHERE surplus_amount=72 AND product_id=7) p1," \
        "(SELECT * FROM t_logistics_cell_list GROUP BY logistics_id) p2 WHERE p1.id=p2.logistics_id) t2 " \
        "WHERE t1.packing_info_id=t2.id GROUP BY t1.packing_info_id"
        DB.executeSQL(sql)
        productID = ['productID_7', 'productID_8', 'productID_9', 'productID_10', 'productID_1042']
        write.writerow(productID)
        #这里有坑,之前尝试了无数次write.writerows()导致存到CSV文件的数据被拆成单个的数字
    
        for item in DB.get_all(sql):
            data = list(tuple(item))#这里是将SQL查询到的数据进行转化,Python从数据库里获取到数数据是元组格式,之前操作xlwt时必须要字符串或者列表,不能是元组格式数据,所以为了避免这种情况,用csv存数据还是先转换成列表
            write.writerow([data[1]])#这里我只需要瓶码数据所以取了data[1]这个索引
        DB.closeDB()
    

    csv展示格式
    这里写图片描述
    这里需要说明一下,每次执行会覆盖掉之前的数据,由于我的数据需要实时更新,所以这个不会有影响,大家在写的时候注意一下。
    四、读取指定列
    with open(file,’rb’) as csvfile:
    reader = csv.DictReader(csvfile)
    column = [row[‘productID_7’] for row in reader]
    这里就是以产品名称标号来读取数据了

    展开全文
  • 这几天做毕设,写了个微信小程序的javaweb后台,发现自己相当的糊涂,向数据库写入数据,运行了n次,调试也没有错误,打印也能获取到,可就是插入不进数据库,百度了一番,都没有解决自己问题,最后发现!...
  • 使用流形式向数据库写入图片,在数据库中显示的是blob类型的,输入的是byte[]类型的数据 成功
  • discuz数据库写入数据发帖

    千次阅读 2017-04-09 17:19:30
    discuz的数据采集程序,discuz发帖主要涉及几个数据库表  discuz发表主题设计的几个表:(这里列出了主要的几个相关的表)   1、主题表 pre_forum_thread:这个表一个主要数据就是 tid 主题ID  2、post 分表...
  • 数据库学习】数据库总结

    万次阅读 多人点赞 2018-07-26 13:26:41
    1,数据库 1)概念 数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。 常见数据库管理系统有:Access、mysql、sql server 2)特点 ①数据库数据特点 永久存储、有组织...
  • 我们在做项目过程中,经常要从Myeclipse/Eclipse向数据库写入数据,小伙伴们也经常遇到这种情况,就是数据中带有中文的话,存到数据库中就变成了“???”这就是中文乱码,解决办法 1、项目编码格式改为UTF-...
  • mysql事物写入过程原理

    千次阅读 2019-08-04 13:19:56
    一、从缓存区到磁盘的过程 innodb_flush_log_at_trx_commit参数设置redo log重做日志策略: 0:commit时,redo log写入到redo log buffer中,每隔固定时间,写入OS buffer并刷新到磁盘;(性能最好,高可用最差) ...
  • 关于线上数据库写入慢问题总结分析   之前安排的说主从延迟是否是写入慢的问题,一直没有思路,最近通过看书《MySQL内核---InnodbDB存储引擎》,有点思路,再网上找,果真有这么的测试。下面其实是网上的一个测试...
  • 1、在数据库为字段建立唯一索引,那么在写入过程中,可以看到的是,同时写入,会把先写入的回滚: id为自增主键,那么id值为20开始保存下一条设备信息,两条deviceId相同设备信息同时写入,那么id值变为了22。(简单...
  • Scrapy高并发数据库写入

    千次阅读 2019-05-02 21:56:53
    爬虫过程中不可缺少的环节就是数据存储,一般来说这些数据首选是保存到数据库中。但是数据库写的方式是同步写入,能不能像 request 请求那样遇到这种 I/O 操作就去执行其他任务呢?答案是可以的。 Scrapy异步写入 ...
  • 数据库高性能写入

    千次阅读 2013-06-27 22:02:13
    在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效、有可能是硬件或网络问题,也有可能是数据库设计的问题。 本篇博文将针对一些常用的数据库性能调休方法进行...
  • 存储过程插入文件操作方法
  • NULL 博文链接:https://uule.iteye.com/blog/980620
  • c# 读取串口写入数据库

    热门讨论 2013-08-26 12:35:08
    用c#编写的winform程序,读取串口的数据,并写入本地的sqlite数据库,同时写入SQLServer网络数据库,这个过程都是多线程的。
  • 数据调取过程需要一定的sql基础,数据写入excel过程需要一定的vb基础。本人非专业编程人员,代码为项目和科研过程中一点一点摸索出来的,水平有限,如有疑惑和不足之处,欢迎交流,QQ:765403451 该方法不需要在本机...
  • MongoDB写入过程

    千次阅读 2018-08-30 21:49:47
    MongoDB在写入前,首先需要与服务器进行连接再发送请求,服务端的处理流程如下:  Mongod在启动时会创建一个PortMessageServer对象,其调用setupSockets为mongod配置的每个地址创建一个socket,并bind地址,然后...
  • 写入MYSQL数据库中文出现乱码问题

    千次阅读 2018-11-07 21:19:36
    在用java向数据库写入数据时出现中文乱码问题 出现乱码问题一般是编码的格式不一致问题导致的,如工程项目的编码为UTF-8而数据库的编码为gbk或其他编码,还有就是连接编码 1.这里以把所有编码设为UTF-8为例,首先是...
  • Python读取Excel文件并写入数据库

    千次阅读 2020-04-08 11:22:54
    ps:在这个过程中,可能会遇到安装不顺利的情况,万能的度娘有N种解决方案,你这么大应该要学着自己解决问题。 [ 复制代码 ](javascript:void(0); "复制代码") 二、pandas操作Excel表单 数据准备,有一个Excel文件:...
  • 基于ubuntu系统,首先需要安装mysql数据库,主要过程如下:sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev安装过程中需要设置数据库密码。安装成功...
  • 加上前段时间学习的MySQL,想将读取回来的开奖数据存放到数据库里试试看。  废话不多说,实操看看。 网页下载器 这部分就比较简单了,不过值得一提的是,response需要encoding一下才能正常识别出内容,不然就是...
  • 主要介绍了python 如何将数据写入本地txt文本文件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 本文基于python, pandas, pymysql实现了向数据库中批量插入数据的脚本,一方面提供给被网上很多瞎转载的答案给坑蒙了的人(因为我也是),一方面自己也做个笔记,以后方便查阅 文章目录需求原因版本库信息逻辑梳.
  • java将数据库查询结果写入文本

    千次阅读 2019-09-12 15:42:30
    核心思想: ... 迭代遍历list,文件流写入文件。 代码示例: public static void exportTxt() throws IOException{ Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE,-1); Date...
  • 在上两篇中我们介绍了在Ubuntu下MySQL的安装,以及如何在python中使用MySQL,本篇我们将基于一个实例讲如何将所需变量值在python中写入数据库,首先展示下效果。   以上是完成的效果展示。 主要步骤为:1...
  • 这个时候会直接读取Redis数据库中的数据进行操作,会把Redis数据库中存在的键值对写入到AOF重写文件中,这个时候常常会出现如下情况:用户在这个AOF重写过程中对数据库进行了写入或者修改的操作。 Redis的解决方法...
  • 数据库

    千次阅读 2019-02-23 17:44:47
    1. 云数据库概述 1.1. 云计算是云数据库兴起的基础 1.2. 云数据库概念 云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法,它极大地增强了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 356,922
精华内容 142,768
关键字:

数据库写入过程