- 论坛徽章:
- 0
|
你开启 postgresql.conf 里的 autovacuum = on 。因为非 Win32 版本的pg,默认是关闭这个的。
另外,你确认你连接数据库是直接使用 IP 而不是使用 DNS.
我用 JDBC 测试过 Mysql 5 和 PostgreSQL,均插入 10W 条记录,也是每5000一批,Postgresql 很平稳的完成,相当快。
只有 mysql-jdbc 3.0.16 能在我的测试中正常完成且中文存储没问题。更高版本的JDBC 驱动都出现:MySQL 在程序开始运作后,内存占用直线上升,运行2分钟后直接死掉。
Java 代码一致.
我的部分记录:
PostgreSQL 8.1.4 Win32
## 使用控制COMMIT(一次提交)
D:\Program Files\test\db_test>java InsertTestPostgresql
<<---本页生成耗时[2875]毫秒(2.875秒)--->>
<<---共插入记录1000条-->>
D:\Program Files\test\db_test>java InsertTestPostgresql
<<---本页生成耗时[149175]毫秒(149.175秒)--->>
<<---共插入记录100000条-->>
Mysql 5.0.20 Win32
## jdbc 3.0.16 一次提交
D:\Program Files\test\db_test>java InsertTestMysql
<<---本页生成耗时[3846]毫秒(3.846秒)--->>
<<---共插入记录1000条-->>
D:\Program Files\test\db_test>java InsertTestMysql
<<---本页生成耗时[98582]毫秒(98.582秒)--->>
<<---共插入记录100000条-->>
测试相关代码,非常简单的:
Mysql 测试代码
- import java.lang.*;
- import java.sql.*;
- public class InsertTestMysql{
- public static void main(String [] args){
- java.util.Date now_start = new java.util.Date();
- long start_time=now_start.getTime();
-
- int st = 100000;
- String str,info;
- String db="org.gjt.mm.mysql.Driver";
- String host="jdbc:mysql://localhost/con_test";
- String user="root";
- String passwd="mysql";
- Connection con=null;
-
-
- try{
- Class.forName(db).newInstance();
- }
- catch(Exception e){
- System.out.println("加载驱动失败:"+db);
- }
-
- try{
- con=DriverManager.getConnection(host,user,passwd);
- con.setAutoCommit(false);
- for (int i=1;i<=st;i++){
-
- info = "这条记录是第=";
- info = info.concat(java.lang.Integer.toString(i));
- str = "insert into test (id,txt) values(?,?);";
- PreparedStatement pstmt = con.prepareStatement(str);
- pstmt.setInt(1,i);
- pstmt.setString(2,info);
- pstmt.executeUpdate();
-
- //if(i%5000==0)con.commit();
- }
- //pstmt.close();
- con.commit();
- con.close();
- }
- catch(Exception e) {
- System.out.println(e);
- }
- java.util.Date now_end = new java.util.Date();
- long end_time=now_end.getTime();
- long use_time=end_time-start_time;
- System.out.println("<<---本页生成耗时["+use_time+"]毫秒("+((double)use_time)/1000+"秒)--->>");
- System.out.println("\n<<---共插入记录"+st+"条-->>");
- }
- }
复制代码
postgresql 版测试代码
- import java.lang.*;
- import java.sql.*;
- public class InsertTestPostgresql{
- public static void main(String [] args){
- java.util.Date now_start = new java.util.Date();
- long start_time=now_start.getTime();
-
- int st = 100000;
- String str,info;
- String db="org.postgresql.Driver";
- String host="jdbc:postgresql://localhost/con_test";
- String user="postgres";
- String passwd="postgres";
- Connection con=null;
-
- try{
- Class.forName(db).newInstance();
- }
- catch(Exception e){
- System.out.println("加载驱动失败:"+db);
- }
-
- try{
- con=DriverManager.getConnection(host,user,passwd);
- con.setAutoCommit(false);
- for (int i=1;i<=st;i++){
-
- info = "这条记录是第=";
- info = info.concat(java.lang.Integer.toString(i));
- str = "insert into test (id,txt) values(?,?);";
- PreparedStatement pstmt = con.prepareStatement(str);
- pstmt.setInt(1,i);
- pstmt.setString(2,info);
- pstmt.executeUpdate();
- //if(i%3000==0)con.commit();
- }
- //pstmt.close();
- con.commit();
- con.close();
- }
- catch(Exception e) {
- System.out.println(e);
- }
- java.util.Date now_end = new java.util.Date();
- long end_time=now_end.getTime();
- long use_time=end_time-start_time;
- System.out.println("<<---本页生成耗时["+use_time+"]毫秒("+((double)use_time)/1000+"秒)--->>");
- System.out.println("\n<<---共插入记录"+st+"条-->>");
- }
- }
复制代码 |
|