GBase 8t 如何实现1秒insert 10万记录
在Java开发程序过程中,如何提供数据库操作的性能,除了数据库本身的性能优化,和Java程序本身执行SQL语句的方式有很大关系。本文针对GBase 8t/Informix的4种写法进行了性能的测试。
1.测试结果
Insert 10万记录。在数据库采用unbuffered logging日志模式下。
SQL执行方式 | 测试用时 | 说明 |
---|---|---|
直接执行executebyrow | 49秒 | executeUpdate(sql) 每1条提交一次 |
直接执行directexecute | 21.9秒 | executeUpdate(sql) 每1000条提交一次 |
绑定变量parserexecute | 14秒 | prepareStatement(sql) executeUpdate() 每1000条提交一次 |
绑定变量+batch执行batchinsert | 1.2秒 | prepareStatement(sql) addBatch() executeBatch() 每1000条提交一次 |
绑定变量+batch执行+USEPUT特性batchinsertp | 0.8秒 | prepareStatement(sql) addBatch() executeBatch() IFX_USEPUT=1 每1000条提交一次 |
测试记录
time java executebyrow
connect successfully
real 0m48.972s
user 0m6.420s
sys 0m2.995s
[root@database java]# time java directexecute
connect successfully
real 0m21.953s
user 0m4.622s
sys 0m1.440s
[root@database java]# time java parserexecute
real 0m14.102s
user 0m3.410s
sys 0m0.854s
[root@database java]# time java batchinsert
real 0m1.234s
user 0m0.976s
sys 0m0.064s
[root@database java]# time java batchinsertp
real 0m0.853s
user 0m0.484s
sys 0m0.060s
2.测试准备:
create table t3(payid integer,
paytype integer,
cardid integer,
incardid integer,
amount decimal(8,2),
paydate datetime year to second)
;
create index idx_t3 on t3 (payid) ;
export JAVA_HOME=/usr/java/jdk1.7.0_67
export PATH=/usr/java/jdk1.7.0_67/bin:${PATH}
export CLASSPATH=.:/usr/java/jdk1.7.0_67/lib/tools.jar:/usr/java/jdk1.7.0_67/lib/dt.jar
export CLASSPATH=${CLASSPATH}:/root/16/mycat/lib/ifxjdbc.jar
3.程序代码及说明:
executebyrow.java
import java.util.*;
import java.sql.*;
public class executebyrow {
private static String URL_STRING[] = { "jdbc:informix-sqli://192.168.100.15:9088/db:INFORMIXSERVER=gbase15" };
private static String user = "gbase";
private static String password = "gbase";
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Class.forName("com.informix.jdbc.IfxDriver");
for (int i = 0; i < 1; i++) {
try {
Connection conn = DriverManager.getConnection(URL_STRING[i],user, password);
if (!conn.isClosed())
System.out.println("connect successfully");
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
for (int j = 1; j <= 100000; j++) {
String sql = "insert into t3(payid,paytype,cardid,incardid,amount,paydate) values ("+j+",1,999,1000,99.99,'2016-01-01 20:20:20')";
int result = statement.executeUpdate(sql);
conn.commit();
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return;
}
}
directexecute.java
import java.util.*;
import java.sql.*;
public class directexecute {
private static String URL_STRING[] = { "jdbc:informix-sqli://192.168.100.15:9088/db:INFORMIXSERVER=gbase15" };
private static String user = "gbase";
private static String password = "gbase";
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Class.forName("com.informix.jdbc.IfxDriver");
for (int i = 0; i < 1; i++) {
try {
Connection conn = DriverManager.getConnection(URL_STRING[i],user, password);
if (!conn.isClosed())
System.out.println("connect successfully");
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
for (int j = 1; j <= 100000; j++) {
String sql = "insert into t3(payid,paytype,cardid,incardid,amount,paydate) values ("+j+",1,999,1000,99.99,'2016-01-01 20:20:20')";
int result = statement.executeUpdate(sql);
if (j%1000==0){
System.out.println(j);
conn.commit();
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return;
}
}
parserexecute.java
import java.util.*;
import java.sql.*;
public class parserexecute {
private static String URL_STRING[] = { "jdbc:informix-sqli://192.168.100.15:9088/db:INFORMIXSERVER=gbase15;IFX_USEPUT=1" };
private static String user = "gbase";
private static String password = "gbase";
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Class.forName("com.informix.jdbc.IfxDriver");
for (int i = 0; i < 1; i++) {
try {
Connection conn = DriverManager.getConnection(URL_STRING[i],user, password);
if (!conn.isClosed())
System.out.println("connect successfully");
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
String sql = "insert into t3(payid,paytype,cardid,incardid,amount,paydate) values (?,1,999,1000,99.99,'2016-01-01 20:20:20')";
PreparedStatement ps=(PreparedStatement) conn.prepareStatement(sql);
for (int j = 1; j <= 100000; j++) {
ps.setInt(1,j);
int result = ps.executeUpdate();
if (j%1000==0){
System.out.println(j);
conn.commit();
}
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return;
}
}
batchinsert.java
import java.util.*;
import java.sql.*;
public class batchinsert {
private static String URL_STRING[] = { "jdbc:informix-sqli://192.168.100.15:9088/db:INFORMIXSERVER=gbase15;" };
private static String user = "gbase";
private static String password = "gbase";
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Class.forName("com.informix.jdbc.IfxDriver");
for (int i = 0; i < 1; i++) {
try {
Connection conn = DriverManager.getConnection(URL_STRING[i],user, password);
if (!conn.isClosed())
System.out.println("connect successfully");
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
String sql = "insert into t3(payid,paytype,cardid,incardid,amount,paydate) values (?,1,999,1000,99.99,'2016-01-01 20:20:20')";
PreparedStatement ps=(PreparedStatement) conn.prepareStatement(sql);
for (int j = 1; j <= 100000; j++) {
ps.setInt(1,j);
ps.addBatch();
if (j%1000==0){
System.out.println(j);
ps.executeBatch();
conn.commit();
}
}
conn.commit();
System.out.println("connect successfully");
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("11"+ e.getMessage());
}
}
return;
}
}
batchinsertp.java
import java.util.*;
import java.sql.*;
public class batchinsertp {
private static String URL_STRING[] = { "jdbc:informix-sqli://192.168.100.15:9088/db:INFORMIXSERVER=gbase15;IFX_USEPUT=1" };
private static String user = "gbase";
private static String password = "gbase";
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Class.forName("com.informix.jdbc.IfxDriver");
for (int i = 0; i < 1; i++) {
try {
Connection conn = DriverManager.getConnection(URL_STRING[i],user, password);
if (!conn.isClosed())
System.out.println("connect successfully");
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
String sql = "insert into t3(payid,paytype,cardid,incardid,amount,paydate) values (?,1,999,1000,99.99,'2016-01-01 20:20:20')";
PreparedStatement ps=(PreparedStatement) conn.prepareStatement(sql);
for (int j = 1; j <= 100000; j++) {
ps.setInt(1,j);
ps.addBatch();
if (j%1000==0){
System.out.println(j);
ps.executeBatch();
conn.commit();
}
}
conn.commit();
System.out.println("connect successfully");
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("11"+ e.getMessage());
}
}
return;
}
}
附录批量update程序
batchupdate.java
import java.util.*;
import java.sql.*;
public class batchupdate{
private static String URL_STRING[] = { "jdbc:informix-sqli://192.168.100.15:9088/db:INFORMIXSERVER=gbase15;" };
private static String user = "gbase";
private static String password = "gbase";
public static void main(String[] args) throws SQLException,
ClassNotFoundException {
Class.forName("com.informix.jdbc.IfxDriver");
for (int i = 0; i < 1; i++) {
try {
Connection conn = DriverManager.getConnection(URL_STRING[i],user, password);
if (!conn.isClosed())
System.out.println("connect successfully");
conn.setAutoCommit(false);
Statement statement = conn.createStatement();
String sql = "update t2 set balance=balance+1 where userid=? ";
PreparedStatement ps=(PreparedStatement) conn.prepareStatement(sql);
for (int j = 200009; j <= 300009; j++) {
ps.setInt(1,j);
ps.addBatch();
if (j%1000==0){
ps.executeBatch();
conn.commit();
}
}
//ps.executeBatch();
// conn.commit();
System.out.println("connect successfully");
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("11"+ e.getMessage());
}
}
return;
}
}
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论