java多线程 *** 作数据库

java多线程 *** 作数据库,第1张

首先,你的确定数据的主键是否可以使用序列自增。

如果可以那么你可以在插入数据的时候获取序列里的值,这样数据就不会重复了。

其次,可以创建一个公共方法,进行数据的插入 *** 作,并且方法类型声明为 static synchronized

类型,这样基本上就不会出现数据重复的现象了

最后,要看你是怎么获得待插入源数据了,这个获得数据源的方法也做成static synchronized的公

共方法。

方法加同步锁,保证在同一个时间内只有一个人可以使用可以解决,具体可以参照http://www.blogjava.net/tscfengkui/archive/2010/11/10/337709.html?opt=admin 这个例子

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

import java.sql.Connection

import java.sql.DriverManager

import java.sql.PreparedStatement

import java.sql.ResultSet

import java.sql.SQLException

import java.util.ArrayList

import java.util.List

public class Test {

       

    public static void main(String[] args) {

        allotThread()

    }

       

    /**

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

     */

    public static void allotThread() {

        List<String[]>datas = buildDatas()

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

            List<String[]>tenDatas = datas.subList(i, i + 10)

            insertData(tenDatas)

        }

    }

       

    /**

     * 创建100条模拟数据

     * @return

     */

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

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

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

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

            datas.add(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()

                    conn.setAutoCommit(false)

                    pstmt = getPstmt(conn, sql)

                    for (String[] data : tenDatas) {

                        pstmt.setString(1, data[0])

                        pstmt.setString(2, data[1])

                        pstmt.addBatch()

                    }

                    pstmt.executeBatch()

                    conn.commit()

                    conn.setAutoCommit(true)

                } catch (SQLException e) {

                    e.printStackTrace()

                    rollback(conn)

                } catch (ClassNotFoundException e) {

                    e.printStackTrace()

                } finally {

                    close(pstmt)

                    close(conn)

                }

            }

        }).start()

    }

       

    public static Connection getConnection() throws SQLException, ClassNotFoundException {

        Class.forName("com.mysql.jdbc.Driver")

        String dbUrl = "jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8"

        Connection conn = DriverManager.getConnection(dbUrl, "root", "tooeasy")

        return conn

    }

       

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

        PreparedStatement pstmt = conn.prepareStatement(sql)

        return pstmt

    }

       

    public static void rollback(Connection conn) {

        try {

            if (null != conn) {

                conn.rollback()

            }

        } catch (SQLException e) {

            e.printStackTrace()

        }

    }

       

    public static void close(Connection conn) {

        try {

            if (null != conn) {

                conn.close()

            }

        } catch (SQLException e) {

            e.printStackTrace()

        }

    }

       

    public static void close(PreparedStatement pstmt) {

        try {

            if (null != pstmt) {

                pstmt.close()

            }

        } catch (SQLException e) {

            e.printStackTrace()

        }

    }

       

    public static void close(ResultSet rs) {

        try {

            if (null != rs) {

                rs.close()

            }

        } catch (SQLException e) {

            e.printStackTrace()

        }

    }

}


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

原文地址: http://outofmemory.cn/sjk/9680527.html

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

发表评论

登录后才能评论

评论列表(0条)

保存