开发环境
mysql
eclipse
JAR包
mysql-connector-java-5.1.7-bin.jar
mchange-commons-java-0.2.11.jar
c3p0-0.9.5.2.jar
同步100w数据只需22秒
code如下:
public class MyClassTest {
public static void main(String[] args) throws Exception{
MyConnect myConn= new MyConnect("mysql_afschool");
List<String[]> select= myConn.select("select * from student");
ComboPooledDataSource pool = new ComboPooledDataSource("mysql_afschool");
Connection conn = pool.getConnection();
conn.setAutoCommit(false);//关闭自动提交
String insert_sql=myConn.preInsert("student_copy");
PreparedStatement psts = conn.prepareStatement(insert_sql);
int count =0;
SimpleDateFormat sdf = new SimpleDateFormat();// 格式化时间
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");// a为am/pm的标记
Date date1 = new Date();// 获取当前时间
System.out.println("开始时间:" + sdf.format(date1)); // 输出已经格式化的现在时间(24小时制)
for (int n=0;n<=35000;n++) { //插入1400数据 看看卡需要多久
for(String[] str:select) {
for(int i=0;i<str.length;i++) {
psts.setString(i+1, str[i]);
}
psts.addBatch();
count++;
}
}
psts.executeBatch();
conn.commit();//提交
sdf.applyPattern("yyyy-MM-dd HH:mm:ss");// a为am/pm的标记
Date date2 = new Date();// 获取当前时间
System.out.println("结束时间:" + sdf.format(date2) +"\n同步记录数" + count); // 输出已经格式化的现在时间(24小时制)
conn.close();
}
}
c3p0-config.xml 配置如下
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<!--配置连接池mysql1-->
<named-config name="mysql_afschool">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- mysql 开启mysql的批写入,预处理 useServerPrepStmts=true&rewriteBatchedStatements=true-->
<property name="jdbcUrl">jdbc:mysql://127.0.0.1/af_school?useUnicode=true&useServerPrepStmts=true&rewriteBatchedStatements=true&characterEncoding=UTF-8</property>
<property name="user">root</property>
<property name="password">Ldd123456</property>
<property name="initialPoolSize">2</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="idleConnectionTestPeriod">200</property>
</named-config>
<!--配置连接池mysql2-->
<named-config name="mysql_target_db">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1/target_db?useUnicode=true&characterEncoding=UTF-8</property>
<property name="user">root</property>
<property name="password">Ldd123456</property>
<property name="initialPoolSize">2</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="idleConnectionTestPeriod">200</property>
</named-config>
<!-- 注意:XML里的&号须转义为 &
其中,
initialPoolSize 初始连接个数。当连接池创建时,立即准备几个连接,放到池子里
minPoolSize 池子里最少连接个数
maxPoolSize 池子里最多有多少连接。当到达此数时,再通过getConnection() 时将会阻塞、直到有可用的连接
maxIdleTime 最大空闲时间。当一个连接建立后、长时间未用时,会被连接池自动关闭多余的连接。连接池最会少保留 minPoolSize 个可用连接。
idleConnectionTestPeriod 为了防止发呆而被MySQL服务器踢掉,定时向服务器发送测试消息、以声明自己的存在。
比如,minPoolSize设置为2,则池子里至少保留2个可用连接。即使程序不作任何这个操作,这两个连接也不会被关闭。但是,如果超过8个小时未操作,则此连接会因为‘发呆’会被MySQL踢掉。
所以,为了避免被踢,要设置定时给向服务器发一个消息以证明自己没死。idleConnectionTestPeriod 就是这个定时的间隔。
-->
</c3p0-config>