JAVA-预处理&连接池技术

开发环境

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&amp;rewriteBatchedStatements=true-->
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1/af_school?useUnicode=true&amp;useServerPrepStmts=true&amp;rewriteBatchedStatements=true&amp;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&amp;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里的&号须转义为 &amp; 
		其中,
		initialPoolSize 初始连接个数。当连接池创建时,立即准备几个连接,放到池子里
		minPoolSize 池子里最少连接个数
		maxPoolSize 池子里最多有多少连接。当到达此数时,再通过getConnection() 时将会阻塞、直到有可用的连接
		maxIdleTime 最大空闲时间。当一个连接建立后、长时间未用时,会被连接池自动关闭多余的连接。连接池最会少保留 minPoolSize 个可用连接。
		idleConnectionTestPeriod 为了防止发呆而被MySQL服务器踢掉,定时向服务器发送测试消息、以声明自己的存在。
		
		比如,minPoolSize设置为2,则池子里至少保留2个可用连接。即使程序不作任何这个操作,这两个连接也不会被关闭。但是,如果超过8个小时未操作,则此连接会因为‘发呆’会被MySQL踢掉。
		
		所以,为了避免被踢,要设置定时给向服务器发一个消息以证明自己没死。idleConnectionTestPeriod 就是这个定时的间隔。
-->
	
</c3p0-config>

上一篇:什么是amp?amp有什么用处?


下一篇:mybatisg关于jdbc连接报错,8.0MySQL连接,出现com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications