发表于: 2020-02-20 18:57:20

1 1148


今天完成的事情:

* main1000次调用

* 测试DB十万数据和三千万数据


测试main中1000个调用

1)创建maven工程

main/java中创建 durid包和uitls包

2)写连接池工具类

utils包中的JDBCUtils类

 package utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.IOException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;public class JDBCUtils {    /**     * 静态代码:     *   加载配置:Properties->pro     *   创建druid连接池:DruidDataSourceFactory.createDataSource(pro)     * 方法:     * getConnection():返回druid连接池的连接并忽略SQL异常     * close():关闭Statement和Connection     * close():关闭ResultSet,Statement和Connection     * getDataSource():返回druid连接池对象     */    private static DataSource ds;    static {        try{            Properties pro = new Properties();            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));            ds = DruidDataSourceFactory.createDataSource(pro);        } catch (IOException e) {            e.printStackTrace();        } catch (Exception e) {            e.printStackTrace();        }    }    public static Connection getConnection() throws SQLException {        return ds.getConnection();    }    public static void close(Statement stmt, Connection conn) {        close(null,stmt,conn);    }    public static void close(ResultSet rs, Statement stmt, Connection conn) {        if(rs != null) {            try {                rs.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if(stmt != null) {            try {                stmt.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if(conn != null) {            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }    public static DataSource getDataSource(){        return ds;    }}

3)druid.properties

driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3306/jnshuusername=rootpassword=123456#初始化连接数量initialSize=5maxActive=1000maxWait=3000


4)在druid包中新建DruidDemo2.class  (/src/main/java/druid/DruidDemo2.class)

写一个1000的循环,在循环体中创建连接。直接调用getConnection()

package druid;import java.sql.Connection;import java.sql.SQLException;import utils.JDBCUtils;public class DruidDemo2 {     /**     *      * @param args     * @throws SQLException     * 循环体中创建连接     */    public static void main(String[] args) throws SQLException {        for (int i = 1; i <= 1000; i++) {            Connection conn = JDBCUtils.getConnection();            System.out.println(i+"::"+conn);        }    }}

5)运行结果:在404个连接时,报错太多连接了。

 


测试DB数据:

新建DruidDemo3.class 因为数据较多,所以使用addBatch() 将sql命令添加到命令列表中,然后使用executeBatch()把这一批命令提交给数据库执行。

这个是三千万的代码,100万将signleNum改为33吧,或去掉外层循环。

package druid;import utils.JDBCUtils;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;public class DruidDemo3 {    public static void main(String[] args) throws SQLException {        Connection conn = null;        PreparedStatement pstmt = null;        long begin = System.currentTimeMillis();        try {            conn = JDBCUtils.getConnection();            String sql = "insert into t_user values(?,?,?)";            pstmt = conn.prepareStatement(sql);            conn.setAutoCommit(false);            int signleNum = 100000;            for (int j = 1; j<=300; j++) {                for (int i = 1; i <= signleNum; i++) {                    int idNum = i+(j-1)*signleNum;                    pstmt.setInt(1, idNum);                    pstmt.setString(2, "hello");                    pstmt.setString(3, "world");                    pstmt.addBatch();                }                pstmt.executeBatch();                pstmt.clearBatch();                conn.commit();                System.out.println(j+"个"+signleNum);            }        }catch (SQLException e){            e.printStackTrace();        }finally {            JDBCUtils.close(pstmt,conn);        }        long end = System.currentTimeMillis();        System.out.println(end- begin);    }}

100w数据结果:由于查询错了字段,结果都一样,后来发现错误。


3千万数据过程:

2581379豪秒即43min。插入了了三千万数据。两亿的数据就不跑了。。

修改靠后的数据:

执行查询:

添加索引:

继续查询:


明天计划的事情:

 * 写总结

 

遇到的问题:

 * 创建索引查询错了字段,查询3000w数据发现结果还是一样,突然才发现索引的字段应该在where子句那个位置。

 

收获:

写日报时发现,生成三千万数据时,把之前代码又套了个循环。并内层循环提供了一个变量用于修改, 但是外层循环写死了300。但这样,生成100w数据时还是得该,因为100不是三的倍数。。要养成良好的赋值变量习惯。。。



返回列表 返回列表
评论

    分享到