[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]nutz,测试update字段自增的精度~~

上一篇:[备忘]多线程,给账户充值的问题
下一篇:[备忘]mysql查看当前连接数

添加日期:2014/11/3 7:56:19 快速返回   返回列表 阅读4530次


import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map.Entry;
import java.util.Random;
import java.util.TreeMap;

import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.impl.NutDao;
import org.nutz.trans.Atom;
import org.nutz.trans.Trans;

import cn.gbase.jiangsu.data.transfer.bean.ShopUser;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class TestMoney {

    NutDao daoOut = new NutDao();
    MysqlDataSource dsOut = null;
    
    /**
     * 随机数.
     */
    private static final Random RANDOM = new Random();
    
    private void setOutDataSource() {
        dsOut = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource();

        // 更新连接信息
        dsOut.setServerName("localhost");
        dsOut.setDatabaseName("shop");
        dsOut.setUser("root");
        dsOut.setPassword("123456");

        // 设置数据源
        daoOut.setDataSource(dsOut);
    }

    /**
     * 随机数字的字符串.
     * 
     * @param length
     *            长度
     * @return 随机字符串
     */
    private String getRandomNumString(int length) {
        String base = "0123456789";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int number = RANDOM.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }
    
    private void doWork() throws SQLException, InterruptedException {
        setOutDataSource();

        for(int xx=0;xx<10;xx++){
            // 初始为1
            daoOut.update(ShopUser.class, Chain.make("accountBalance", 0), Cnd.where("id", "=", 6));
            
            // 100个线程加钱
            BigDecimal total = BigDecimal.ZERO;
            for (int i = 0; i < 100; i++) {
                final BigDecimal money = new BigDecimal("0." + getRandomNumString(10));
                total = total.add(money);
                new Thread() {
                    public void run() {
                        //updateMoneyNutz1(money); //nutz,转float,不行。
                        //updateMoneyNutz2(money); //nutz,转string,可以
                        //updateMoneyJdbc1(money); //jdbc,使用参数,可以
                        updateMoneyJdbc2(money); //jdbc,转float,拼sql,不行。当然,转string拼sql是可以的。
                    }
                }.start();
            }
            
            Thread.sleep(3000);
            System.out.println("total money:"+total);
            
            BigDecimal db = daoOut.fetch(ShopUser.class, Cnd.where("id", "=", 6)).getAccountBalance();
            assert total.equals(db);
        }

    }
    
    /**
     * nutz更新,转成float.
     * @param money
     */
    private void updateMoneyNutz1(BigDecimal money) {
        daoOut.update(ShopUser.class, Chain.makeSpecial("accountBalance", "+" + money.floatValue()), Cnd.where("id", "=", 6));
    }
    
    /**
     * nutz更新,直接BigDicimal
     * @param money
     */
    private void updateMoneyNutz2(BigDecimal money) {
        daoOut.update(ShopUser.class, Chain.makeSpecial("accountBalance", "+" + money.toString()), Cnd.where("id", "=", 6));
    }
    
    /**
     * jdbc,使用参数
     * @param money
     */
    private void updateMoneyJdbc1(BigDecimal money) {

        // 随机延迟
        try {
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Connection conn = null; // 连接对象
        PreparedStatement pstmt = null; // 预编译的SQL语句对象
        try {

            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8";
            conn = DriverManager.getConnection(url, "root", "123456");

            String sql = "update shop_users set account_balance = account_balance + ? where id=6";
            pstmt = conn.prepareStatement(sql);
            pstmt.setBigDecimal(1, money);
            pstmt.execute();

            pstmt.close();
            conn.close();
        } catch (Exception e) {

            e.printStackTrace();
        } finally {
            if (pstmt != null)
                try {
                    pstmt.close();
                } catch (Exception ignore) {
                }
            if (conn != null)
                try {
                    conn.close();
                } catch (Exception ignore) {
                }
        }
    }
    
    /**
     * jdbc,转成float,拼接sql
     * @param money
     */
    private void updateMoneyJdbc2(BigDecimal money) {

        // 随机延迟
        try {
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Connection conn = null; // 连接对象
        try {

            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8";
            conn = DriverManager.getConnection(url, "root", "123456");

            String sql = "update shop_users set account_balance = account_balance + " + money.floatValue()+ " where id=6";
            System.out.println(sql);
            conn.createStatement().execute(sql);

            conn.close();
        } catch (Exception e) {

            e.printStackTrace();
        } finally {
            if (conn != null)
                try {
                    conn.close();
                } catch (Exception ignore) {
                }
        }
    }

    public static void main(String[] args) {
        TestMoney xx = new TestMoney();
        try {
            try {
                xx.doWork();
            } catch (InterruptedException e) {
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved