java 多线程存储数据库

java 多线程存储数据库,第1张

以mysql为数据库写的一个粗陋的demo,你参考一下,希望不会因为代码过多被百度吞了——

import javasqlConnection;

import javasqlDriverManager;

import javasqlPreparedStatement;

import javasqlResultSet;

import javasqlSQLException;

import javautilArrayList;

import javautilList;

public class Test {

       

    public static void main(String[] args) {

        allotThread();

    }

       

    /

      将100条数据分成10份并启动10个线程分别 *** 作

     /

    public static void allotThread() {

        List<String[]> datas = buildDatas();

        for (int i=0; i<100; i+=10) {

            List<String[]> tenDatas = datassubList(i, i + 10);

            insertData(tenDatas);

        }

    }

       

    /

      创建100条模拟数据

      @return

     /

    public static List<String[]> buildDatas() {

        List<String[]> datas = new ArrayList<String[]>();

        for (int i=0; i<100; i++) {

            String[] data = {"id " + i, "name " + i};

            datasadd(data);

        }

        return datas;

    }

       

    /

      启动线程进行数据插入 *** 作

      @param tenDatas

     /

    public static void insertData(final List<String[]> tenDatas) {

        new Thread(new Runnable() {

            public void run() {

                String sql = "insert into testtable (id, name) values (, )";

                Connection conn = null;

                PreparedStatement pstmt = null;

                try {

                    conn = getConnection();

                    connsetAutoCommit(false);

                    pstmt = getPstmt(conn, sql);

                    for (String[] data : tenDatas) {

                        pstmtsetString(1, data[0]);

                        pstmtsetString(2, data[1]);

                        pstmtaddBatch();

                    }

                    pstmtexecuteBatch();

                    conncommit();

                    connsetAutoCommit(true);

                } catch (SQLException e) {

                    eprintStackTrace();

                    rollback(conn);

                } catch (ClassNotFoundException e) {

                    eprintStackTrace();

                } finally {

                    close(pstmt);

                    close(conn);

                }

            }

        })start();

    }

       

    public static Connection getConnection() throws SQLException, ClassNotFoundException {

        ClassforName("commysqljdbcDriver");

        String dbUrl = "jdbc:mysql://localhost/testuseUnicode=true&characterEncoding=UTF-8";

        Connection conn = DriverManagergetConnection(dbUrl, "root", "tooeasy");

        return conn;

    }

       

    public static PreparedStatement getPstmt(Connection conn, String sql) throws SQLException, ClassNotFoundException {

        PreparedStatement pstmt = connprepareStatement(sql);

        return pstmt;

    }

       

    public static void rollback(Connection conn) {

        try {

            if (null != conn) {

                connrollback();

            }

        } catch (SQLException e) {

            eprintStackTrace();

        }

    }

       

    public static void close(Connection conn) {

        try {

            if (null != conn) {

                connclose();

            }

        } catch (SQLException e) {

            eprintStackTrace();

        }

    }

       

    public static void close(PreparedStatement pstmt) {

        try {

            if (null != pstmt) {

                pstmtclose();

            }

        } catch (SQLException e) {

            eprintStackTrace();

        }

    }

       

    public static void close(ResultSet rs) {

        try {

            if (null != rs) {

                rsclose();

            }

        } catch (SQLException e) {

            eprintStackTrace();

        }

    }

}

首先对数据库(尤其是Access)使用多线程大多不会提高效率(除非SQL中有耗时但不好资源的 *** 作,如T-SQL中休眠之类的语句)。

建议楼主:使用队列,将要执行的SQL语句放入队列中(如:SystemCollectionQueue或ArrayList),然后用一根线程一条一条执行,另外Access不支持事物回滚只有自己想办法实现了。滥用多线程会加大程序开发的难度,以及包括程序的不稳定。

另外:cbyvft的答案“……所有的线程使用同一个连接”

,是严重错误的!!连接对象Connection不能迸发,也就是不能多根线程共享一个连接对象,否则很容易引发异常(报错为:基础对象与RAW分离之类的信息)。

若非要用多线程来做,我可以给你一段代码(我以前开发的项目中一部分),请加我的“百度Hi”并发消息给我,我传给你。

我不在这里帖代码了,因为实现的代码较多,而且比较复杂(使用多线程要考虑很多问题,代码要硕壮通用,所以代码量较大)。

多线程作为Android开发中相对而言较为高阶的知识,其中用到相关的知识点是非常的多,所以在我们需要进行设计或者写多线程的代码就必须要进行相对谨慎的处理,这样就由必要对其要有着比较系统化的认知

我们一般将Android应用分成为两种:主线程和工作线程;主线程主要是用来进行初始化UI,而工作线程主要是进行耗时 *** 作,例如读取数据库,网络连接等

Android系统是以进程为单位来对应用程序资源进行限制,这个问题的可以解释为:一个进程最多能够开几个线程?最好能开几个?但实则这个是没有上限这一说,主要是因为资源的限制

Android中关于主线程的理解:Android的主线程是UI线程,在Android中,四大组件运行在主线程中,在主线程中做耗时 *** 作会导致程序出现卡顿甚至出现ANR异常,一个

在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。

线程总的来就是进程的一个实体,是CPU进行分派和调度的基本单位,拥有着比进程更小且能够独立运行的基本单位,线程本身基本上是不拥有系统资源,仅拥有一点在运行过程中必须拥有的资源,但它可与同属一个进程中的其他进程进行共享其所拥有的所有资源

线程状态有些地方将之分为5中状态,而且在Java Jdk中线程被其定义为6中状态,我们可以对其进行类比

普遍定义的5中状态:新建,就绪,运行,阻塞, 死亡

Java Jdk 定义状态

线程阻塞是指在某一时刻的某一个线程在进行运行一段代码的情况下,突然另一个线程也要进行运行,但在运行过程中,那个线程执行完全运行之前,另一个线程是不可能获取到CPU的执行权,就会导致线路阻塞的出现

死锁也称之为抱死,意思就是说一个进程锁定了另外一个进程所需要的页或表是,但第二个进程同时又锁定了第一个进程所需的一页,这样就会出现死锁现象

简要介绍实现线程的三种方式:继承Thread,实现runnable,实现callable。这里有一点需要注意的是,实现callable是与线程池相关联的而callable很重要的一个特性是其带有返回值。当我们只需实现单线程时实现runnable更加利于线程程序的拓展

在线程开启之前进行调用 threadsetDaemon(true); 将thread设定成当前线程中的守护线程 使用案例

线程让步yield方法让当前线程释放CPU资源,让其他线程抢占

这种具体某个对象锁 wait & notify 方法与Condition 的 await以及signal方法类似; 全面这种方法的阻塞等待都可以是释放锁,而且在唤醒后,这种线程都是能够获取锁资源的,而这个门栓就跟阀门类似

mysqldump: 最早,也是最成熟的逻辑备份工具,是 MySQL 原生的用来备份整个数据库实例、单个数据库、单张表的逻辑备份工具, 上手简单,学习成本几乎为 0。备份简单,恢复也简单。

比如导出单个数据库 ytt: mysqldump ytt > /tmp/yttsql;

恢复也非常简单:mysql < /tmp/yttsql

缺点是备份速度慢。在整个备份过程中,是单线程运行;备份出来的数据集要恢复的话同样也是单线程运行,恢复速度也慢。除非对同一时刻的所有表单独备份出来,自己写额外脚本进行多线程恢复。

以上就是关于java 多线程存储数据库全部的内容,包括:java 多线程存储数据库、C#多线程写数据库、Android开发之路-多线程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9749165.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存