因为最近迷上了童书MySQL的工作原理:从根上了解MySQL,想创建一点数据来磨练所学,所以我要去创建两个百万数据一开始,我写了一个简单的程序,使用jdbc向其中插入数据。开始写的时候,意识到为了提高插入速度,可以使用多线程来插入,于是第一版程序如下:publicclassDataInsert{publicstaticvoidmain(String[]args)抛出异常{ExecutorServicefixedThreadPool=Executors.newFixedThreadPool(20);Class.forName("com.mysql.jdbc.Driver");Connectionconnection=DriverManager.getConnection("jdbc:mysql://xx:3306/pamphlet","root","pwd");PreparedStatement语句=connection.prepareStatement("插入t1值(?,?)");对于(inti=0;i<1000000;i++){intfinalI=i;fixedThreadPool.execute(newRunnable(){@Overridepublicvoidrun(){try{statement.setInt(1,finalI);statement.setString(2,String.valueOf((char)(finalI%26+97)));声明.执行();}catch(SQLExceptionthrowables){throwables.printStackTrace();}}});}}}表结构创建表t1(m1intnull,n1charnull);然后启动程序,感觉速度还不错。一秒钟大概插入了十几条数据,然后我去吃饭了。吃了一会回来发现只插了几万块。这个速度明天上班的时候就不插了。结束了!所以我需要找出问题所在。我打开idea的调试器,发现线程池中的20个线程都处于交替的RUNNING状态,所以多线程特性没有发挥出来!然后我很快意识到问题出在哪里,就是我们总是只有20个线程交替使用一个Connection向mysql中插入数据并且语句的execute方法的执行被锁包围了,所以?虽然我们启用了多线程,但我们仍然在串行执行任务。问题找到了,那我们怎么优化呢?我们在每次执行前取一个Connection,这样插入就可以并发进行了,对吧?编写代码(inti=0;i<1000000;i++){intfinalI=i;fixedThreadPool.execute(newRunnable(){@Overridepublicvoidrun(){try{Connectionconnection=DriverManager.getConnection("jdbc:mysql://xx:3306/pamphlet","root","pwd");PreparedStatementstatement=connection.prepareStatement("insertintot1values(?,?)");statement.setInt(1,finalI);statement.setString(2,String.valueOf((char)(finalI%26+97)));statement.execute();}catch(SQLExceptionthrowables){throwables.printStackTrace();}}});}像上面这样应该可以写吗?老实说,我没试过。你可以尝试一下。效率应该会好很多,但是我觉得还可以进一步优化,因为线程池中的线程是重复使用的,所以我们让每个线程都有一个Connection。那么ThreadLocal很快就能用上了?@Log4j2publicclassDataInsert{publicstaticvoidmain(String[]args)通过ws异常{ExecutorServicefixedThreadPool=Executors.newFixedThreadPool(80);ThreadLocal
