精华内容
下载资源
问答
  • Is it possible to call a SQL Server stored procedure asynchronously via C#?I have a stored procedure which writes a backup of a specific database (this can take a long time to complete) and I want to ...

    Is it possible to call a SQL Server stored procedure asynchronously via C#?

    I have a stored procedure which writes a backup of a specific database (this can take a long time to complete) and I want to show the progress of the backup process in a windows forms (for this I use http://www.wisesoft.co.uk/articles/tsql_backup_restore_progress.aspx). Or should I use the Backgroundworker control and run the SP in a backgroundjob (own thread) ?

    解决方案

    In your SqlCommand you can run commands asynchronously using BeginExecuteNonQuery and EndExecuteNonQuery. The latter will block until its done. However this won't report the progress from the server about how the backup is going - I'd use a marquee progress bar for it.

    To avoid the EndExecuteNonQuery from blocking your UI (depending on how you handle it), you will need a background thread. If you use this then you may as well not use BeginXXX EndXXX methods and do it synchronously on a background thread - the BackgroundWorker is best for this.

    To avoid using a background thread in the UI, instead of blocking on EndXXX you will need to register a callback and handle the resulting event (calling EndXXX in this event handler, but it will return immediately).

    Update: as per a comment, for asynchronous calls into the SQL command/connection stuff, you need to specify as much in the connection string:

    Server=myServerAddress; Database=myDataBase; Integrated Security=True; Asynchronous Processing=True;

    Or in code using the connection string builder:

    builder.AsynchronousProcessing = true;

    展开全文
  • java 异步操作数据库

    千次阅读 2016-05-17 14:57:33
     * 记录coupon到数据库  */  private class UpdateDbCdkeyStatus implements Runnable {  private String couponCode;  private int money;  private int activityId;  public ...

        <bean id="threadPoolTaskExecutor"
              class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
            <!-- 核心线程数,默认为 -->
            <property name="corePoolSize" value="30" />
            <!-- 最大线程数,默认为Integer.MAX_VALUE -->
            <property name="maxPoolSize" value="50" />
            <!-- 队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE -->
            <property name="queueCapacity" value="1000" />
            <!-- 线程池维护线程所允许的空闲时间,默认为60s -->
            <property name="keepAliveSeconds" value="60" />
            <!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 -->
            <property name="rejectedExecutionHandler">
                <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 -->
                <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 -->
                <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
                <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
                <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
            </property>
        </bean>


     @Autowired
        private ThreadPoolTaskExecutor threadPoolTaskExecutor;


     threadPoolTaskExecutor.execute(new UpdateDbCdkeyStatus(AcvitityId, couponCode, money));


        /**
         * 记录coupon到数据库
         */
        private class UpdateDbCdkeyStatus implements Runnable {


            private String couponCode;
            private int money;
            private int activityId;


            public UpdateDbCdkeyStatus(int activityId, String couponCode, int money) {
                this.activityId = activityId;
                this.couponCode = couponCode;
                this.money = money;
            }


            @Override
            public void run() {
                insertEventService.insertCdKey(couponCode, money, STATUS_NORMAL, AcvitityId, "chinaMobile");;
            }
        }



    展开全文
  • 异步储存,减少与数据库之间的交互造成的堵塞使性能下降 import com.baomidou.mybatisplus.extension.service.IService; import java.util.LinkedList; import java.util.List; /** * ClassName: MybatisSaveMQ ...

    基于mybatisplus 的 java 异步储存队列
    异步储存,减少与数据库之间的交互造成的堵塞使性能下降

    import com.baomidou.mybatisplus.extension.service.IService;
    
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * ClassName: MybatisSaveMQ
     * Description: 保存队列
     * date: 2021-03-19
     *
     * @since JDK 1.8
     */
    
    public class MybatisSaveMQ<T> {
    
        private volatile List<T> list = new LinkedList<>();
    
        private volatile List<T> saveList ;
    
        private volatile List<T> cleanList = new LinkedList<>();
    
        private final IService<T> service;
    
        private final Class<T> clazz;
    
        private volatile int threadNum = 0;
    
        public MybatisSaveMQ(IService<T> service,Class<T> clazz){
            this.service = service;
            this.clazz = clazz;
        }
    
        public void save(T t){
            this.list.add(t);
            if(threadNum < 3){
                threadNum ++;
                new Thread(){
                    @Override
                    public void run() {
                        synchronized (clazz){
                            saveList = list;
                            list = cleanList;
                            service.saveBatch(saveList);
                            cleanList = saveList;
                            cleanList.clear();
                            threadNum --;
                        }
                    }
                }.start();
            }
        }
    
    }
    

    下面的是线程优化过的,并且增加了异常处理。单独维护一个保存线程,工作线程负责将数据压入队列,保存线程负责将队列中数据存入数据库

    import com.baomidou.mybatisplus.extension.service.IService;
    import lombok.SneakyThrows;
    
    import java.util.LinkedList;
    import java.util.List;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * ClassName: MybatisSaveMQ
     * Description: 保存队列
     * date: 2021-03-19
     *
     * @since JDK 1.8
     */
    
    public class MybatisSaveMQ<T> {
    
        private volatile List<T> list = new LinkedList<>();
    
        private volatile List<T> saveList ;
    
        private volatile List<T> cleanList = new LinkedList<>();
    
        private final IService<T> service;
    
        private volatile int threadNum = 0;
    
        private Thread workTread ;
    
        private Lock lock = new ReentrantLock();
    
        private Condition condition = lock.newCondition();
    
        public MybatisSaveMQ(IService<T> service){
            this.service = service;
            workTread = new Thread(){
                @SneakyThrows
                @Override
                public void run() {
                    for (;;){
                        if(threadNum == 0){
                           lock.lock();
                           if(threadNum == 0){
                               condition.await();
                           }
                           lock.unlock();
                        }
                        saveList = list;
                        list = cleanList;
                        try {
                            service.saveBatch(saveList);
                        }catch (Exception e){
                            e.printStackTrace();
                            saveList.forEach(item ->{
                                try {
                                    service.save(item);
                                }catch (Exception e1){
                                    e1.printStackTrace();
                                }
                            });
                        }
                        cleanList = saveList;
                        cleanList.clear();
                        threadNum --;
                    }
                }
            };
            workTread.start();
        }
    
    
        public void save(T t){
            this.list.add(t);
            if(threadNum < 2){
                threadNum ++;
                if(threadNum == 1){
                    lock.lock();
                    condition.signal();
                    lock.unlock();
                }
            }
        }
    
    }
    
    

    该队列依靠所需工作线程数控制获取线程锁的逻辑,在高并发时没有线程锁的操作,两个线程几乎互不影响,没有性能损耗;
    经测试,单纯的依靠mybatisPlus 原生save 方法逐条储存十万条数据到方法结束返回用时 1100多秒,同样的环境下,该队列将同样的数据压入队列并返回的时间为8毫秒,保存线程将数据批量存入数据库的时间为 32 秒

    展开全文
  • 异步写入数据库

    千次阅读 2018-03-30 21:21:14
    import pymysql'同步写入数据库速度比较慢,而爬虫速度比较快,可能导致数据最后写入不到数据库中''''1.引入twisted.enterprise.adbapi pymysql.cursors2.在settings中配置数据库连接参数3.创建pipeline,实现from_...

    import pymysql

    '同步写入数据库速度比较慢,而爬虫速度比较快,可能导致数据最后写入不到数据库中'

    '''

    1.引入twisted.enterprise.adbapi  pymysql.cursors

    2.在settings中配置数据库连接参数

    3.创建pipeline,实现from_settings函数,从settings获取数据库连接参数,根据参数创建连接池对象,返回当前pipeline的对象,并且把连接池赋值给该对象属性

    4.实现process_item函数,使用db_pool.runInteraction(函数,函数需要的参数) 将数据库的处理操作放入连接池s,还需要将操作数据的函数实现,使用cursor执行sql

    5.拿到runIteraction()函数返回的处理结果,添加错误回调函数,在函数中将错误原因打印

    '''

    from twisted.enterprise import adbapi

    from pymysql import cursors


    class XXXXXXPipeline(object):

    # 在初始化函数中,对db_pool进行赋值

        def __init__(self,db_pool):

    # 赋值

            self.db_pool = db_pool

    # 链接MySQL数据库

    # from_settings 激活pipeline之后,会自动调用该函数加载settings中的配置

        @classmethod

        def from_settings(cls,settings):

    # 准备数据库的链接参数,是一个字典

            db_params = dict(

                host=settings['MYSQL_HOST'],

                user=settings['MYSQL_USER'],

                password=settings['MYSQL_PASSWD'],

                port=settings['MYSQL_PORT'],

                db=settings['MYSQL_DBNAME'],

                charset=settings['MYSQL_CHARSET'],

                use_unicode=True,

    # 指定使用的游标类型

                cursorclass=cursors.DictCursor

            )

    # 创建连接池

    # 1.使用的操作数据库的包名称

    # 2.准备的数据库连接参数

            db_pool = adbapi.ConnectionPool('pymysql',**db_params)

    # 返回创建好的对象

            return cls(db_pool)


    # 处理item的函数

        def process_item(self,item,spider):

    # 异步写入

    # 把执行sql的操作放入pool中

    # 1.执行的操作(功能函数)函数对象 function类型

    # 2.item 对象 spider对象

            query = self.db_pool.runInteraction(self.insert_item,item)

    # 执行sql出现错误,会执行指定的回调函数

            query.addErrback(self.handle_error,item,spider)

    # 返回item

            return item

    # failure 错误原因

        def handle_error(self,failure,item,spider):

            print(failure)

    # 执行的操作

        def insert_item(self,cursor,item):

            sql = "INSERT INTO 表名(字段1,2,3,4,5,6)VALUES(%s,%s,%s,%s,%s,%s)"

    # 执行

            cursor.execute(sql,(item['字段1'],item['字段2'],item['字段3'],item['字段4'],item['字段5'],item['字段6']))


    在settings里  ITEM_PIPELINES = {'scrpay_redis.pipelines.RedisPipeline':300}

    展开全文
  • python 异步数据库_异步Python和数据库

    千次阅读 2020-07-13 04:15:54
    python 异步数据库The asynchronous programming topic is difficult to cover. These days, it’s not just about one thing, and I’m mostly an outsider to it. However, because I deal a lot with relational ...
  • ajax调用java实例源码持久性.js persistence.js是一个异步 Javascript 对象关系映射库。 它既可以在 Web 浏览器中使用,也可以在服务器上使用 . 它目前支持 4 种类型的数据存储: ,Webkit 浏览器支持 HTML5 的一个...
  • JAVA异步上传并解析Excel ajax异步上传文件 springBoot方式接收文件 servlet模式接收文件 解析Excel并导入数据库 ajax异步上传文件 //HTML代码,上传的表单 < form action = "" > 选择文件: < input type ...
  • Java操作Oracle数据库-多线程,演示了使用多线程技术从oracle 数据库中读取函数、存储过程等功能。,具体实现方法请详见源代码。
  • 主要介绍了java异步写日志到文件中实现代码的相关资料,需要的朋友可以参考下
  • Logback 日志异步输出数据库(Oracle)

    千次阅读 2017-11-18 10:11:19
    参考资料: Logback官方文档:http://logback.qos.ch/manual/appenders.html,DBAppender章节 Logback GutHub:... ...1、从LogBack源码库 logback-classic/src/main/java/ch/qos/logback/classic/
  • 看了很多例子都是存入数据库再调用业务方法,但是我觉得接口日志和业务逻辑是完全不相关的, 而且接口日志存入数据库是需要io耗时的,这样会拖慢接口访问速度吧?
  • 异步的SQL数据库封装

    2020-12-15 00:33:51
     使用这个库,你可以轻松地连接到任何SQL-Server数据库,执行任何存储过程或T-SQL查询,并异步地接收查询结果。这个库采用C#开发,没有其他外部依赖。  背景  你可能需要一些事件驱动编程的背景知识,但这...
  • 项目中用到了多线程,但是线程异步操作时无法调用Service层和Dao层的函数,进行数据库的读取,然后就想办法如何往线程中注入Service和Dao层的bean。
  • 多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。...
  • 什么是异步?为什么要用它? 异步编程提供了一个非阻塞的,事件驱动的编程模型。 这种编程模型利用系统中多核执行任务来提供并行,因此提供了应用的吞吐率。此处吞吐率是指在单位时间内所做任务的数量。 在这种...
  • 2.具有扎实的Java编程基础,理解IO、多线程等基础框架 3.熟练使用Linux系统的常用命令及shell有一定了解 4.精通多线程编程,熟悉分布式,缓存,消息队列等机制;熟悉JVM,包括内存模型、类加载机制以及性能优化 5....
  • 项目总的架构:freeMaker+springboot+mybatis+redis+七牛云图片存储(实时缩图+cdn加速)+异步处理 访问地址 演示截图 首页 登录注册 评论 站内信 站内信详情 项目目录结构 命名 描述 bean 实体类,所有的model类都...
  • AsyncTask -- Java异步调用框架

    千次阅读 2017-02-28 17:40:09
    原创文章,转载请注明...  AsyncTask是个人编写的一个Java异步调用框架,支持用户: 1)自定义Task,并可设置Task的类型(Type), 子类型(subType),超时时间(TImeout),标识(Flag-可用来区分不同的Task),
  • 下单请求压测 ...交易验证完全依赖于数据库 库存行锁(修改库存时对item_id值所在行加行锁) <!-- 库存扣减操作--> <update id="decreaseStock"> update item_stock set stock = stock - .
  • java jpa 异步编程 几年前,在Java世界中,几乎显而易见的是,每个“企业”类项目都需要JPA与数据库进行通信。 JPA是Joel Spolsky描述的“ 泄漏抽象 ”的完美示例。 刚开始时很棒而又容易,但是最后很难调整和限制...
  • Java开源数据库分类列表整理

    千次阅读 2018-04-27 16:25:08
    HSQLDB HSQLDB(Hypersonic SQL)是纯Java开发的关系型数据库,并提供JDBC驱动存取数据。支持ANSI-92 标准 SQL语法。而且他占的空间很小。大约只有160K,拥有快速的数据库引擎。更多HSQLDB信息 Axion Axion是一个小型,...
  • springboot+logback日志异步数据库

    千次阅读 2018-11-20 17:02:13
    logback.xml配置文件: &lt;?xml version="1.0" encoding="...--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--&gt; &lt;springProperty scope="context&quo
  • MapDB的使用实战[基于Java数据库]

    万次阅读 2016-11-17 21:10:00
    程序MapDB特性MapDB是一个内嵌的纯java数据库,提供了并发的HashMap、TreeMap、Queue,可以基于堆外或者磁盘来存储数据。用户可以通过配置选择不同的机制来提高性能,比如可以配置多种不同的cache来减少反序列化的...
  • 定制的Java开发人员数据库 MapDB 是在Apache许可下开源的,它的第二个正式版本昨天达到了一个新的里程碑。 修复了一些错误,包括重新编写异步写入中的竞争条件。 由于asyncWriteEnable()在记录预分配中具有竞争...
  • 异步提交是一个允许事务能更快完成的选项,代价是在数据库崩溃时最近的事务会丢失。在很多应用中这是一个可接受的交换。 如前一节所述,事务提交通常是同步的:服务器等到事务的WAL记录被刷写到持久存储之后才向...
  • localForage is a convenient wrapper library that smoothes the rough landscape of browser ... localForage是一个方便的包装库, 可简化浏览器数据库的概况 。 其中有几个: localStorage 本地存储 Ind...
  • 最后,提供一种简易的 Java 实 现,能够实现基本的功能需求,并做到线程安全。 在正式探索技术问题之前,我们先来看看什么是 异步非阻塞模型 。如图1-1所示,展示了两个小人通信的场景: 假设左侧小人发起请求,而...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 101,622
精华内容 40,648
关键字:

java异步存储数据库

java 订阅